Existem dois avanços fundamentais na abordagem estruturada que não podem ser emulados usando logs de texto sem (às vezes níveis extremos de) esforço adicional.
Tipos de Eventos
Quando você escreve dois eventos com o 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");
Isso produzirá texto semelhante:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Mas, no que diz respeito ao processamento da máquina, são apenas duas linhas de texto diferente.
Você pode encontrar todos os eventos de "cota de disco excedida", mas o caso simplista de procurar eventos like 'Disk quota%'
cairá assim que outro evento ocorrer:
Disk quota 100 set for user DTI-Matt
O registro de texto descarta as informações que temos inicialmente sobre a origem do evento, e isso deve ser reconstruído ao ler os registros geralmente com expressões de correspondência cada vez mais elaboradas.
Por outro lado, quando você escreve os dois eventos Serilog a seguir :
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Eles produzem saída de texto semelhante à versão log4net, mas nos bastidores, o "Disk quota {Quota} exceeded by user {Username}"
modelo de mensagem é carregado pelos dois eventos.
Com um coletor apropriado, você pode escrever consultas posteriormente 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 com cada evento de log; portanto, alguns afundamentos colocam o modelo de mensagem em hash em um EventType
valor numérico (por exemplo 0x1234abcd
), ou você pode adicionar um enricher ao pipeline de log para fazer isso sozinho .
É mais sutil que a próxima diferença abaixo, mas extremamente poderosa ao lidar com grandes volumes de log.
Dados Estruturados
Novamente, considerando os dois eventos sobre o uso do espaço em disco, pode ser fácil usar logs de texto para consultar um usuário específico like 'Disk quota' and like 'DTI-Matt'
.
Porém, os diagnósticos de produção nem sempre são tão diretos. Imagine que seja necessário encontrar eventos em que a cota de disco excedida esteja abaixo de 125 MB?
Com o Serilog, isso é possível na maioria dos sumidouros usando uma variante de:
Quota < 125
Construir esse tipo de consulta a partir de uma expressão regular é possível, mas torna-se cansativo rápido e normalmente acaba por ser 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 fazer com que a depuração da produção com logs pareça uma atividade de desenvolvimento de primeira classe.
Um benefício adicional, talvez não tão fácil de prevenir antecipadamente, mas depois que a depuração da produção foi removida da área de hackers regex, os desenvolvedores começam a valorizar os logs muito mais e a ter mais cuidado e consideração ao escrevê-los. Melhores registros -> aplicativos de melhor qualidade -> mais felicidade ao redor.