Práticas recomendadas para criação de log e rastreio no .NET

50

Eu tenho lido muito sobre rastreamento e registro, tentando encontrar alguma regra de ouro para as melhores práticas, mas não há nenhuma. As pessoas dizem que bons programadores produzem um bom traçado, mas dizem que é assim e tem que vir da experiência.

Eu também li perguntas semelhantes aqui e através da internet e elas não são realmente a mesma coisa que eu estou perguntando ou não tenho uma resposta satisfatória, talvez porque as perguntas não tenham alguns detalhes.

Assim, as pessoas dizem que o rastreamento deve replicar a experiência de depuração do aplicativo nos casos em que você não pode anexar um depurador. Ele deve fornecer contexto suficiente para que você possa ver qual caminho é usado em cada ponto de controle no aplicativo.

Aprofundando, você pode até distinguir entre rastreamento e criação de log de eventos, em que "o log de eventos é diferente do rastreio, pois captura os principais estados em vez do fluxo detalhado de controle".

Agora, digamos que eu queira fazer meu rastreamento e criação de log usando apenas as classes padrão do .NET, aquelas no namespace System.Diagnostics . Eu percebi que a classe TraceSource é melhor para o trabalho do que a classe Trace estática, porque eu quero diferenciar entre os níveis de rastreamento e usar a classe TraceSource que eu posso passar em um parâmetro informando o tipo de evento enquanto uso a classe Trace. Trace.WriteLineIf e, em seguida, verificar itens como SourceSwitch.TraceInformation e SourceSwitch.TraceErrors , e nem mesmo tem propriedades como TraceVerbose ou TraceStart .

Com tudo isso em mente, você consideraria uma boa prática fazer o seguinte:

  • Rastrear um evento "Iniciar" ao iniciar um método, que deve representar um operação lógica única ou um pipeline, junto com uma string representação do parâmetro valores passados para o método.
  • Rastrear um evento "Informações" quando inserir um item no banco de dados.
  • Rastrear um evento "Informações" quando tomando um caminho ou outro em um importante declaração if / else.
  • Rastreie um "Crítico" ou "Erro" em um catch block dependendo se ele é um erro recuperável.
  • Rastreie um evento "Stop" ao terminar a execução do método.

E também, por favor, esclareça quando é melhor traçar os tipos de evento Verbose e Aviso. Se você tem exemplos de código com bom rastreamento / registro e está disposto a compartilhar, isso seria excelente.

Observação: encontrei algumas boas informações aqui, mas ainda não são o que estou procurando: link

Obrigado antecipadamente!

    
por Levidad 11.03.2011 / 13:41
fonte

3 respostas

15

A importância dos tipos de rastreio deve ser escolhida não por causa de onde o rastreio está no código, mas porque a mensagem rastreada é mais ou menos importante. Exemplo:

Trace a "Start" event when begining a method, which should represent a single logical operation or a pipeline, along with a string representation of the parameter values passed in to the method.

Use o tipo de início ao iniciar uma operação lógica. Ponto. Isso não significa que o rastreio de início deve estar no início de um método, nem significa que um método deve ter um rastreio de início.

Dito isto, na maioria dos casos, uma operação lógica será realmente iniciada no início do método. Caso contrário, você deve se perguntar se o código foi refatorado corretamente.

Parâmetros de rastreamento também podem ser uma má ideia . Você tem que pensar o que rastrear, caso a caso. Por exemplo, é muito ruim rastrear parâmetros de um método void Authenticate(string userName, string plainPassword) .

Trace an "Information" event when inserting an item into the database.

Depende. Alguns itens devem ser rastreados, mas nem todos os itens.

  • Por exemplo, imagine que você esteja realmente inserindo um item de log em seu banco de dados. Você rastreará logs? E, em seguida, rastreios de log? E, em seguida, rastrear o registro do rastreamento?
  • Outro exemplo: você está inserindo dados confidenciais. Isso requer auditoria. Como você auditou a inserção, por que rastreá-la?

Trace an "Information" event when taking one path or another in an important if/else statement.

Novamente, isso depende.

Trace a "Critical" or "Error" in a catch block depending on weather this is a recoverable error.

A ação executada após um erro não recuperável pode ser mais do que um rastreio. Por exemplo, do lado do servidor, você gostaria de armazenar a exceção no banco de dados para análise posterior. Além disso, algumas exceções são menos importantes que outras e não exigem rastreio.

Trace a "Stop" event when finishing the execution of the method.

Veja o primeiro ponto.

please clarify when best to trace Verbose and Warning event types.

Verboso:

O Verbose é usado para rastrear o que você precisa rastrear quando algo está realmente errado. Isso significa que na maioria dos casos, você desabilitará o rastreamento de mensagens detalhadas, mas às vezes, você precisará depurar algumas partes do seu código para entender por que algo falha em um caso limite.

Você geralmente tem muitas mensagens detalhadas que permitem entender muito bem o fluxo do aplicativo. Isso também significa que essas mensagens devem ser desativadas na maioria das vezes porque:

  • caso contrário, o log crescerá muito rápido,
  • você não precisa deles na maior parte do tempo,
  • eles podem conter dados confidenciais sobre o fluxo do aplicativo.

Pense no verbose como uma ferramenta que você precisa usar quando não tem acesso ao depurador.

Aviso:

O rastreamento de tipo de aviso é usado quando algo errado e importante acontece, mas não é muito crucial para ser tratado como um erro. Por exemplo, a baixa RAM pode emitir um aviso, mas não há motivo para rastrear um erro, já que seu aplicativo pode continuar, mesmo que seja mais lento que o normal.

Exemplos:

  • Exemplo 1: o aplicativo não conseguiu abrir o arquivo que o usuário solicitou para abrir. O arquivo existe e não está em uso, as permissões estão definidas corretamente, mas algo bloqueia a abertura de um arquivo. Nesse caso, você rastreará um erro , já que seu aplicativo não pode gerenciar esse caso e continuar a funcionar conforme o esperado pelo usuário (por exemplo, ler o arquivo).

  • Exemplo 2: após a inspeção do erro no primeiro exemplo, você descobre que o erro é causado pelo fato de o caminho do arquivo ter mais de 259 caracteres. Então você refatora seu código para capturar PathTooLongException . Quando, na próxima vez, o usuário tentar abrir o mesmo arquivo, a nova versão do aplicativo mostrará uma mensagem explicando que o arquivo é muito longo e deve ser movido para outra pasta para encurtar o caminho completo para abrir esse arquivo. esta aplicação. Você também rastreia uma mensagem .

  • Exemplo 3: seu aplicativo passou vinte segundos abrindo e analisando um pequeno arquivo, enquanto a maioria dos arquivos leva de dez a cem milissegundos para abrir e analisar. Você rastreia um aviso com informações relevantes: o tipo de disco em que o arquivo realmente está, o sistema de arquivos, o tamanho do arquivo, o tempo exato gasto, a hora em que o computador estava ligado etc. o usuário reclama que leva vinte segundos para abrir o arquivo, você pega o rastreamento para descobrir o que acontece. Você acha, por exemplo, que leva tanto tempo para carregar os arquivos de um compartilhamento de rede quando o computador acaba de iniciar. Você explica ao usuário que o atraso é devido à rede e não está relacionado ao seu aplicativo.

  • Exemplo 4: o arquivo aberto é exibido incorretamente. Você ativa o rastreio detalhado onde você realmente vê como os dados são carregados do arquivo e depois analisados, passo a passo.

por 27.07.2011 / 00:46
fonte
5
 > say I want to do my tracing and logging using only the standard .NET classes

System.Diagnostics é ótimo porque você pode configurar onde as informações de rastreio devem ir onde (arquivo, eventlog, banco de dados, ....)

Infelizmente, se você quiser usar System.Diagnostics , deve saber antecipadamente ( em tempo de design ), quais fluxos de rastreamento devem ser possíveis de seguir. (No artigo de exemplo, estes são Transferir, Retomar, Suspender, ...). Estes podem ser configurados para serem desabilitados, Debuglevel ou Errorlevel.

Eu prefiro ter um sistema de logging onde eu possa decidir em tempo de execução em classlevel / namespacelevel , quão detalhado o log deve ser. Por exemplo, todos os Depuração e acima de MyNamespace.Business.* , mas não MyNamespace.Business.Calculations .

Se você estiver usando log4net (ou Common.logging), cada classe terá seu próprio registrador, para que você possa decidir facilmente quais classes serão registradas em qual nível.

Como as operações do banco de dados estão em uma classe separada, não há mais necessidade de uma regra distinta

Trace an "Information" event when inserting an item into the database.

Em vez disso, prefiro ter estas diretrizes:

  • O Tracelevel deve mostrar o fluxo de trabalho básico
  • O nível de depuração deve mostrar dados detalhados e processamento dentro do fluxo de trabalho,       incluindo decisões no fluxo de programa com motivos       (Criando novo item porque o item não existia no banco de dados)
  • Infolevel para iniciar / interromper serviços e uma entrada para cada fluxo de trabalho / GUI       ação iniciada
por 11.03.2011 / 19:37
fonte
2

Você pode experimentar a Estrutura da história , ela tem uma abordagem única para registrar como "faz" você gravar todos os registros ( e adicionar outras informações relevantes) em contexto, então quando você precisar ler mais tarde, você terá tudo o que precisa.

Ele adicionará automaticamente os conceitos "iniciar" e "parar" como o começo e o fim de uma história.

E com um sistema baseado em regras, você pode controlar o que fazer com cada história (contexto) com base nas informações que possui, por exemplo, imprimir todas as histórias com erro ou provenientes do usuário "admin".

Também mais informações sobre esta postagem no blog

    
por 01.12.2015 / 01:26
fonte

Tags