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.

3 comentários:

Fenrir disse...

Pois eh, log sempre salvou vidas, mas ainda tinham que inventar uma forma de saber aonde cliente andou modificando teu codigo quando ele foi jah para o servidor, longe de qualquer svn, cvs, etc, etc. Eh o cao! AHusiahiusahu

Mas muito bom o blog preto, vou tentar ler seguido :D

Dea Balle disse...

mas que coisa!

estreando blog na mesma época que eu!

mas eu ainda tô mexendo no layout do meu :P

Gostei do teu bloguinhu, amado ^^ Mas juro que depois leio com toda a calma do mundo!

beijão

Unknown disse...

ae bivoltz, aproveitando o tópico, você poderia escrever algumas dicas sobre como depurar código ASP (não .NET) usando logs, pois estou trabalhando com isso ultimamente e tenho essa dificuldade.
abraços
José Antônio Salini Ferreira