Exemplo prático: imagine uma página onde vários usuários acessam ao mesmo tempo. Alguns desses usuários tem problemas pra acessar a aplicação, enquanto outros não. Como saber qual parte do log pertence a qual usuário?
Alguém diria: "coloque um identificador único ao escrever cada uma das linhas do log". Mas o que acontece quando se tem que alterar código já existente pra isso (às vezes, centenas de linhas), ou pior, se determinados trechos do código não tiverem acesso a esse identificador único?
Para isso, existe no .NET a classe CorrelationManager, que tem como objetivo "correlacionar traces que fazem parte de uma mesma operação lógica". Basta adicionar Trace.CorrelationManager.StartLogicalOperation("MainThread") e
Trace.CorrelationManager.StopLogicalOperation() para que cada chamada em Tracesource.TraceEvent automaticamente coloque , além do texto a ser "logado", a informação "MainThread", que identifica , no exemplo, que se está na thread principal. No nosso exemplo, basta trocar "MainThread" por algo como StartLogicalOperation(ip) (supondo a existência de uma variável ip).
Mas o que me surpreendeu hoje foi que o log4net, port do log4j pra .NET, também
possui a sua maneira de correlacionar logs, chamada simplemente de Contexto
. Adiciona-se propriedades à ThreadContext.Property, que são depois escritas por algum dos appenders (classes responsáveis por escrever os traces em uma determinada saída, seja arquivo, banco de dados ou rede). Depois, basta colocar no config do log4net, na seção do appender, a informação desejada.
Por exemplo, imagine que você coloque no início do seu código ThreadContext.Property["ip"] = ip, e na seção de configuração do appender, coloque