Mostrando postagens com marcador log4net. Mostrar todas as postagens
Mostrando postagens com marcador log4net. Mostrar todas as postagens

quarta-feira, 24 de setembro de 2008

Logs Correlacionados no .NET

Todo programador experiente sabe que o log é um de seus melhores amigos. Com uma boa política de logs, pode-se debugar uma aplicação sem maiores problemas, apontando com precisão a origem com problema. Mas como saber quando usuários diferentes escrevem em um mesmo log?

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 . Cada linha do log serai escrita com o formato "IP = 192.168.0.1 - Mensagem", sendo "Mensagem" a string passada em qualquer uma das chamadas de funções de Log do log4net.