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")); };