Existem dois avanços fundamentais com a abordagem estruturada que não podem ser emulados usando logs de texto sem (por vezes níveis extremos) esforço adicional.
Tipos de evento
Quando você escreve dois eventos com log4net como:
log.Debug("Disk quota {0} exceeded by user {1}", 100, "DTI-Matt");
log.Debug("Disk quota {0} exceeded by user {1}", 150, "nblumhardt");
Estes produzirão texto semelhante:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Mas, no que diz respeito ao processamento de máquinas, elas são apenas duas linhas de texto diferente.
Você pode querer encontrar todos os eventos de "cota de disco excedido", mas o caso simplista de procurar eventos like 'Disk quota%'
cairá tão logo ocorra outro evento parecido com:
Disk quota 100 set for user DTI-Matt
O log de texto elimina as informações que temos inicialmente sobre a origem do evento, e isso deve ser reconstruído ao ler os logs normalmente com expressões de correspondência mais elaboradas.
Por outro lado, quando você escreve os dois eventos Serilog seguintes:
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Estes produzem uma saída de texto semelhante à versão do log4net, mas por trás das cenas, o modelo de mensagem "Disk quota {Quota} exceeded by user {Username}"
é carregado pelos dois eventos.
Com um coletor apropriado, você pode mais tarde gravar as consultas where MessageTemplate = 'Disk quota {Quota} exceeded by user {Username}'
e obter exatamente os eventos em que a cota de disco foi excedida.
Nem sempre é conveniente armazenar o modelo de mensagem inteiro em cada evento de log, portanto, alguns coletores fazem o modelo de mensagem em um valor EventType
numérico (por exemplo, 0x1234abcd
) ou você pode adicionar um enfileiramento ao pipeline de registro para faça você mesmo .
É mais sutil do que a próxima diferença abaixo, mas é maciçamente poderosa quando se lida com grandes volumes de log.
Dados estruturados
Novamente considerando os dois eventos sobre o uso de espaço em disco, pode ser fácil usar logs de texto para consultar um usuário em particular com like 'Disk quota' and like 'DTI-Matt'
.
Mas, os diagnósticos de produção nem sempre são tão diretos. Imagine que é necessário encontrar eventos em que a cota de disco excedida estava abaixo de 125 MB?
Com o Serilog, isso é possível na maioria dos coletores usando uma variante de:
Quota < 125
Construir esse tipo de consulta a partir de uma expressão regular é possível, mas fica cansativo rapidamente e geralmente acaba sendo uma medida de último recurso.
Agora, adicione a isso um tipo de evento:
Quota < 125 and EventType = 0x1234abcd
Você começa a ver aqui como esses recursos se combinam de maneira direta para tornar a depuração de produção com logs uma atividade de desenvolvimento de primeira classe.
Um benefício adicional, talvez não tão fácil de prevenir, mas uma vez que a depuração de produção tenha sido removida da terra de hackery de regex, os desenvolvedores começam a valorizar muito mais os logs e exercitar mais cuidado e consideração ao escrevê-los. Melhores registros - > aplicações de melhor qualidade - > mais felicidade ao redor.