(Windows) de manipulação de exceção: para log de eventos ou para banco de dados?
-
04-07-2019 - |
Pergunta
Eu trabalhei em lojas onde eu implementadas Manipulação de exceção no log de eventos, e em uma tabela no banco de dados.
Cada um tem seus méritos, dos quais posso destacar alguns com base na minha experiência:
Log de eventos
- Indústria localização padrão para exceções (+)
- Facilidade de logging (+)
- Pode log problemas de conexão de banco de dados aqui (+)
- relatório de compilação Can e visualização de aplicativos em cima do log de eventos (+)
- Precisa ser lavada a cada tantas vezes, se um monte é relatado lá (-)
- Não é tão extensível como o log do SQL [campos add personalizados como nome do método em SQL] (-)
SQL / banco de dados
- Pode lidar com grandes volumes de dados (+)
- Pode lidar com inserções de volume rápidas de exceções (+)
- local de armazenamento para uma única excepção em ambiente de carga equilibrada (+)
- Muito personalizável (+)
- Um pouco mais fácil de relatórios build / notificação fora do armazenamento SQL (+)
- diferente de onde exceções típicas são armazenados (-)
Am I faltando quaisquer considerações importantes?
Tenho certeza de que alguns desses pontos são discutíveis, mas estou curioso o que funcionou melhor para outras equipes, e por que você sente fortemente sobre a escolha.
Solução
Você precisa diferenciar entre registro e rastreio. Enquanto as linhas são um pouco confuso, eu tendem a pensar de registrar como "coisas não desenvolvedor". Coisas como exceções não tratadas, arquivos corrompidos, etc. Estes são definitivamente não é normal, e deve ser um problema muito freqüente.
O rastreamento é o que um desenvolvedor está interessado. Os rastreamentos de pilha, parâmetros do método, que o servidor web retornou um status HTTP 401.3, etc. Estes são realmente barulhento, e pode produzir uma grande quantidade de dados em um curto espaço de tempo . Normalmente temos diferentes níveis de rastreamento, de cortar o ruído.
Para o log em um aplicativo cliente, eu acho que logs de eventos são o caminho a percorrer (eu teria que verificar novamente, mas acho Monitoramento ASP.NET Saúde pode escrever para o log de eventos também). Os usuários normais têm permissões para gravar o log de eventos, desde que você tem a configuração (que é instalado por um administrador de qualquer maneira) criar a origem do evento.
A maioria de suas vantagens para o log do SQL, embora verdadeira, não são aplicáveis ??a registro de eventos:
- Pode lidar com grandes volumes de dados: Você realmente tem grandes volumes de exceções não tratadas ou outras falhas de alto nível?
- Pode lidar com inserções de volume rápidas de exceções: A única excepção não deve trazer seu aplicativo para baixo - é inerentemente taxa limitada. Outros eventos interessantes para não desenvolvedores deve ser semelhante agregados.
- Muito personalizável: A mensagem em um log de eventos é muito bonito texto livre. Se precisar de mais informações, basta apontar para um texto ou XML estruturado ou log de arquivo binário
- Um pouco mais fácil de relatórios build / notificação fora do armazenamento SQL: Relatórios é construído com o Visualizador de Log de eventos e sistemas de notificação são, seja inerente - devido a uma falha de aplicativo - ou misturado com outros realmente crítico notificações - há pouco desculpa para faltar uma mensagem de log de eventos. Para aplicativos em rede corporativa ou outros, há um mil e 1 aplicativos diferentes que já abate de logs de eventos para erros ... as chances são o seu sysadmin já está usando um.
Para traçado , dos quais os detalhes específicos de uma exceção ou erros é uma parte, eu como arquivos simples - eles são fáceis de manter, fácil de grep, e pode ser importado para Sql para análise se eu gosto.
90% do tempo, você não precisa deles e eles estão pronto para avisar ou ERROR. Mas, quando você configurá-los para INFO ou DEBUG, você vai gerar um tonelada de dados. Um RDBMS tem um monte de sobrecarga - para o desempenho (ACID, simultaneidade, etc.), armazenamento (logs de transação, SCSI RAID-5 discos, etc.), e administração (backups, manutenção do servidor, etc.) - todos os quais são desnecessário para logs de rastreamento.
Outras dicas
Eu não log até para o banco de dados. Como você disse, as questões do banco de dados se tornar complicado para log:)
Gostaria de log para o sistema de arquivos, e depois ter um trabalho que Bulk-inserções de arquivos para o banco de dados. Pessoalmente eu gosto de ter os registros no banco de dados no log executar principalmente para a situação de escala - Eu praticamente suponho que vou ter mais de uma máquina rodando, e é útil para ser capaz de ter efetivamente um registro combinado. (Cada entrada deve indicar a máquina vem, é claro.)
Relatório e aplicativos de visualização pode ser feito muito facilmente a partir de um banco de dados -. Pode haver menos ferramentas de relatórios lá fora, no momento, mas praticamente todos os bancos de dados generalizaram Reportagem Especializada-log funcionalidade
Para facilitar a extração de madeira, eu usaria um quadro como log4net que leva uma grande parte do esforço fora dele, e é uma solução experimentada e testada. Além do mais, isso significa que você pode mudar a sua estratégia de saída com nenhuma alteração de código. Você poderia até mesmo log para o log de eventos eo banco de dados, se necessário, ou enviar alguns registros para um lugar e alguns para o outro. (Eu tenho assumido NET aqui, mas existem estruturas de registo semelhantes para várias plataformas.)
Uma coisa que precisa considerar sobre o registo de eventos é que existem produtos lá fora, que pode monitorar logs de eventos de seus servidores (como o Microsoft Operations Manager) e inteligentemente fazer a notificação, e reunir estatísticas sobre o seu conteúdo.
A "menos" de exploração madeireira baseada em SQL é que ele acrescenta outra camada de dependências para a sua aplicação, que pode ou não pode ser sempre aceitável. Eu tenho feito tanto em minha carreira. I uma ou duas vezes até usou um MSMQ baseada em mensagens fila para eventos de registro de fila e esvaziar a fila em um banco de dados MSSQL para eliminar a necessidade para o meu software cliente para ter uma conexão com o DB.
Uma nota sobre a escrita no log de eventos:. Que requer determinadas permissões para usuários do aplicativo que em alguns ambientes pode ser restringido por padrão
Onde eu estou fazemos a maioria de nosso registro para um banco de dados, com arquivos simples como backup. É muito bom, podemos fazer coisas como obter um feed RSS para um aplicativo para assistir por alguns dias quando nós fazer uma mudança.