Como gravar logs no formato JSON?

1

Quero centralizar o log em meus servidores usando o syslog-ngque gravará uma linha no formato JSON em um arquivo, que por sua vez será captado logstashe encaminhado para elasticsearch. Essa configuração funciona, exceto por alguns problemas JSON específicos.

Eu formato no syslog-nglog para estar em JSON por meio de uma destinationestrofe:

destination d_json { file("/var/log/all_syslog_in_json.log" perm(0666) template("{\"@timestamp\": \"$ISODATE\", \"facility\": \"$FACILITY\", \"priority\": \"$PRIORITY\", \"level\": \"$LEVEL\", \"tag\": \"$TAG\", \"host\": \"$HOST\", \"program\": \"$PROGRAM\", \"message\": \"$MSG\"}\n")); };

Isso geralmente funciona bem, mas às vezes o JSON acaba malformado devido, por exemplo, a cotações existentes em $MSG.

Existe uma maneira melhor de formatar a mensagem? Eu estava olhando para o interno,json-parser mas parece que ele requer pares de valores-chave como entrada, enquanto eu gostaria de explodir os campos disponíveis em uma entrada JSON

EDIÇÃO E SOLUÇÃO:

Encontrei no blog de Dustin Oprea a solução exata:

destination d_json { file("/tmp/test.json" template("$(format-json --scope selected_macros --scope nv_pairs)\n")); };
WoJ
fonte

Respostas:

0

como você deseja formatar a mensagem como JSON, não a analisa, você precisa da função format-json () do syslog-ng .

BTW, as versões mais recentes do syslog-ng podem enviar mensagens diretamente para o Elasticsearch .

HTH, Robert

Robert Fekete
fonte
Após a sua resposta, li novamente os documentos e, enquanto eles são muito, muito obscuros, consigo o que precisava. Eu atualizei minha pergunta de acordo. Obrigado.
WoJ
Olá, qual parte dos documentos você achou obscura? Eu ficaria feliz em melhorá-los.
Robert Fekete
Olá Robert: ao pesquisar sobre como formatar a saída JSON, encontrei format-jsone json-parser. Eu não estava claro sobre como usar qualquer um deles. A parte das macros também não declara explicitamente quais elementos dos dados do syslog de entrada são analisados ​​em quais campos. Fiquei muito duro, desculpe, com a afirmação "realmente, muito obscura" - é mais que para alguém que não é especialista na área, não é óbvio o que usar. Acredito que a adição de um exemplo prático e, possivelmente, explique mais elementos práticos, como selected-macrosou nv-pairsajudaria.
WoJ 27/10/2015
(continuação) Eu também pensei que uma entrada JSON era necessária para format-jsonser usada - você menciona no exemplo que * a fonte é uma mensagem de log codificada em JSON * - o que me enganou ao pensar que ela trabalha com JSON apenas como fonte (o que não é verdade, depois de ler atentamente os documentos). E, no entanto, OBRIGADO por este excelente software.
WoJ 27/10/2015
Olá WoJ, muito obrigado pelo seu feedback e pela descrição detalhada do seu problema. Você não foi nada severo :) Adicionei isso à minha lista de tarefas e espero revisar e melhorar essas partes do guia nas próximas semanas. Se você encontrar problemas semelhantes, deixe-me saber, eu realmente aprecio os comentários.
Robert Fekete