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