pontoNETpt
A comunidade PontoNetPT está direccionada a todos os programadores que trabalhem com a plataforma .NET.
Voltei a programar - Construção do Sistema (Logging)

Neste quinto post irei falar um pouco sobre uma parte que costuma ser muito negligenciada, pelo menos no desenvolvimento de aplicações servidor: Logging. Não terá muitoa ver com agilidade, mas também aqui existem alguns pontos importantes.

O componente de logging que utilizei foi o log4net (inspirado no log4j), do qual tomei conhecimento pela primeira vez através de um post do Pedro Santos. Outras possibilidades são o componente da Microsoft Enterprise Library ou o NLog (que nunca experimentei). O componente é muitíssimo bom e recomendo-o vivamente.

Desde o início do projecto, defini que a lógica de logging seria cidadão de primeira classe. A generalidade dos sistemas com os quais me deparei tem uma infra-estrutura de logging fraca... algumas vezes miserável ou inexistente mesmo! Este é um problema gravíssimo no momento em que o sistema passa a produção, como tenho a certeza que todos vocês reconhecem. O padrão habitual da infra-estrutura de logging, pela minha experiência tem as seguintes características:

  • Utilização de apenas dois níveis de log: Erro e Debug. Nível de Aviso, Info ou outros, apesar de estarem disponíveis, são ignorados.
  • O nível de Erro regista excepções (ou Err.Raises no VB6). O nível de Debug regista entrada e saída de métodos.
  • As outras, poucas mensagens, são do tipo: "Estou aqui 1...", "Estou aqui 2...", "Passei, carago!".

Quando a aplicação passa a produção e começam a surgir os primeiros problemas, o resultado é o óbvio: horas infindas à procura do problema; adição de mensagens de forma totalmente ad-hoc e à pressão. Estou convencido que os problemas com as mensagens de log são fortes indutores do síndrome de abstinência do programador: "Eu preciso de acesso a Produção! Preciso! Dá-me acesso a Produção! Se não me deres acesso, amuo! Como é que eu sei o que se passa com o MEU sistema?"

Eu sou tão culpado disto como todos os outros. No meu primeiro projecto, necessitei de pegar em código legado. A minha primeira decisão? Apagar todas as mensagens de log que o componente continha. Quando chegou a Produção é que foi o bom e o bonito... um episódio muito revelador da minha "verdura" e da preocupação com a qualidade da empresa para que trabalhava...

Bom, neste projecto as coisas foram muito diferentes. Defini diversas linhas de orientação:

  • Abandonar os logs "mecânicos" no início e no fim de cada método.
  • Pensar em cada momento quais as mensagens de logs necessárias. Qual o texto da mensagem, e quais os dados a "loggar", tendo o devido cuidado com dados potencialmente sensíveis.
  • O texto da mensagem de log deve estar sempre o mais próximo possível da linguagem do domínio, com as excepções em que a parte realmente importante é a técnica (detalhes de pedidos HTTP/XML, por exemplo).
  • Utilizar todos os níveis de log de forma construtiva. Decidir conscientemente qual o nível de log a que uma dada mensagem pertence.
  • Periodicamente, nos code reviews, analisar especificamente os logs. "Se a aplicação falhasse neste ponto, conseguia perceber o que se tinha passado até ao momento?", "Este log deve ser um info, um debug, um warning?"
  • Tomar em atenção o potencial impacto na performance das mensagens de log.
  • Criar testes unitários para as mensagens de log.

O resultado final, do meu ponto de vista, é muito satisfatório. Ao ler os logs no nível Info, é possível compreender facilmente o fluxo de execução do programa, os seus blocos lógicos. Aumentando o nível para Debug é possível, para além disso, recolher um manancial de informação, detalhada, que permite compreender o que realmente se passou durante a execução do programa.

Os logs foram úteis também numa outra situação. Por vezes, quando criamos testes, é dificíl testar determinados comportamentos internos (privados) de um objecto, existindo múltiplas técnicas para lidar com a situação. Algo de que tomei consciência neste projecto é que em algumas situações os logs permitem testar de forma indirecta esses comportamentos, o que representa uma vantagem adicional. É claro que este deve ser uma espécie de último recurso (ou recurso complementar), mas é mais uma ferramenta que podemos utilizar.

No próximo post... acho que será sobre performance counters. Também é algo muito engraçado.


Posted 7-7-2005 23:26 por João Hugo Miranda

Comments

Anonymous wrote re: Voltei a programar - Construção do Sistema (Logging)
on 1-7-2009 1:09

Muito interessante. Continua, deixaste-me curioso em relacao aos performance counters.

A ver se pro ano consigo implementar aqui um projecto com algumas guidelines semelhantes ao que fizeste.
Anonymous wrote re: Voltei a programar - Construção do Sistema (Logging)
on 1-7-2009 1:09
Oi,

Descobri este blogue apenas hoje, e foi um enorme prazer ler os seus post's, todos. Mas pelos vistos o blogue já morreu. Será ?
Anonymous wrote re: Voltei a programar - Construção do Sistema (Logging)
on 1-7-2009 1:09
Morto não está... Está em sabática... :)
Anonymous wrote re: Voltei a programar - Construção do Sistema (Logging)
on 2-7-2009 1:47

Muito interessante. Continua, deixaste-me curioso em relacao aos performance counters.

A ver se pro ano consigo implementar aqui um projecto com algumas guidelines semelhantes ao que fizeste.
Anonymous wrote re: Voltei a programar - Construção do Sistema (Logging)
on 2-7-2009 1:47
Oi,

Descobri este blogue apenas hoje, e foi um enorme prazer ler os seus post's, todos. Mas pelos vistos o blogue já morreu. Será ?
Anonymous wrote re: Voltei a programar - Construção do Sistema (Logging)
on 2-7-2009 1:47
Morto não está... Está em sabática... :)

Add a Comment

(requerido)  
(opcional)
(requerido)  
Remember Me?
If you can't read this number refresh your screen
Enter the numbers above:  
Powered by Community Server (Commercial Edition), by Telligent Systems