Quero centralizar o log em meus servidores usando o syslog-ng
que gravará uma linha no formato JSON em um arquivo, que por sua vez será captado logstash
e encaminhado para elasticsearch
. Essa configuração funciona, exceto por alguns problemas JSON específicos.
Eu formato no syslog-ng
log para estar em JSON por meio de uma destination
estrofe:
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")); };
format-json
ejson-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, comoselected-macros
ounv-pairs
ajudaria.format-json
ser 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.