Eu trabalho com sistemas críticos de segurança em tempo real e a criação de log é muitas vezes a única maneira de pegar bugs raros que aparecem uma vez em uma lua azul a cada 53 terça-feira quando é lua cheia, se você me entende. Isso faz com que você fique obcecado com o assunto, então eu peço desculpas agora se começar a fazer espuma na boca. O seguinte foi escrito para logs de depuração de código nativo, mas a maior parte também é aplicável ao mundo gerenciado ...
Use arquivos de log de texto. Parece óbvio, mas algumas pessoas tentam gerar arquivos de log binários: isso é simplesmente idiota porque não preciso procurar uma ferramenta de leitura quando estou em campo. Além disso, se o texto e a depuração forem detalhados, há uma boa chance de o engenheiro de campo ler o arquivo e diagnosticar o problema sem precisar voltar para mim. Todo mundo ganha.
Eu projeto sistemas que são capazes de registrar praticamente tudo, mas eu não ligo tudo por padrão. As informações de depuração são enviadas para uma caixa de diálogo de depuração oculta que marca a data e a saída para uma caixa de listagem (limitada a cerca de 500 linhas antes da exclusão) e a caixa de diálogo permite interrompê-la, salvá-la em um arquivo de log ou desviá-la para um depurador conectado. Esse desvio me permite ver a saída de depuração de vários aplicativos todos perfeitamente serializados, o que pode ser um salva-vidas às vezes. Eu usei para usar os níveis de registro numérico (quanto mais alto você definir o nível, mais você capturará):
off
errors only
basic
detailed
everything
mas isso é inflexível demais - à medida que você se aproxima de um bug, é muito mais eficiente ser capaz de se concentrar exatamente no que precisa, sem ter que percorrer toneladas de detritos, e pode ser um tipo específico de transação ou operação que causa o erro. Se isso exige que você ligue tudo, você está apenas fazendo o seu próprio trabalho mais difícil. Você precisa de algo mais refinado.
Então, agora estou no processo de alternar para o log com base em um sistema de sinalização. Tudo o que é registrado tem um sinalizador detalhando que tipo de operação é, e há um conjunto de caixas de seleção que me permitem definir o que é registrado. Normalmente, essa lista é assim:
#define DEBUG_ERROR 1
#define DEBUG_BASIC 2
#define DEBUG_DETAIL 4
#define DEBUG_MSG_BASIC 8
#define DEBUG_MSG_POLL 16
#define DEBUG_MSG_STATUS 32
#define DEBUG_METRICS 64
#define DEBUG_EXCEPTION 128
#define DEBUG_STATE_CHANGE 256
#define DEBUG_DB_READ 512
#define DEBUG_DB_WRITE 1024
#define DEBUG_SQL_TEXT 2048
#define DEBUG_MSG_CONTENTS 4096
Este sistema de registro é fornecido com a versão release , ativado e salvando no arquivo por padrão. É tarde demais para descobrir que você deveria ter logado APÓS o bug ter ocorrido, se esse bug só ocorrer uma vez a cada seis meses em média e você não tiver como reproduzi-lo. O log que funciona apenas com compilações de depuração é apenas. avião. mudo.
O software geralmente vem com ERROR, BASIC, STATE_CHANGE e EXCEPTION ligados, mas isso pode ser alterado no campo através do diálogo de depuração (ou uma configuração do registro / ini / cfg, onde essas coisas são salvas).
Ah, e uma coisa - meu sistema de depuração gera um arquivo por dia. Suas necessidades podem ser diferentes. Mas certifique-se de que seu código de depuração inicie todos os arquivos com a data, versão do código que você está executando e, se possível, algum marcador para o ID do cliente, localização do sistema ou o que for. Você pode obter uma mistura de arquivos de log vindos do campo, e você precisa de um registro do que veio de onde e qual versão do sistema que eles estavam executando, que está nos dados em si, e você não pode confiar no cliente. / engenheiro de campo para lhe dizer qual versão eles têm - eles podem apenas dizer-lhe qual versão eles pensam que eles têm. Pior, eles podem relatar a versão exe que está no disco, mas a versão antiga ainda está em execução porque eles se esqueceram de reinicializar após a substituição. Faça seu código dizer você mesmo.
Por último, você não quer que seu código gere seus próprios problemas, então coloque uma função timer para limpar os arquivos de log depois de tantos dias ou semanas (apenas verifique a diferença entre o tempo agora e a hora da criação do arquivo). Isso é aceitável para um aplicativo de servidor que é executado o tempo todo, em um aplicativo do lado do cliente que você pode obter com a limpeza de dados antigos quando você inicializa. Normalmente, depois de 30 dias, em um sistema sem visitas frequentes de engenheiros, talvez você precise deixar mais tempo. Obviamente, isso depende do tamanho dos arquivos de log também.