desde que você queira formatar a mensagem como JSON, e não analisá-la, você precisa do função format-json () do syslog-ng .
BTW, as versões mais recentes de O syslog-ng pode enviar mensagens diretamente para o Elasticsearch .
HTH, Robert
Eu quero centralizar o registro em meus servidores usando syslog-ng
, que gravará uma linha formatada em JSON em um arquivo, que por sua vez será selecionado por logstash
, que encaminhará para elasticsearch
. Esta configuração funciona, exceto por alguns problemas específicos de JSON.
Formatei em syslog-ng
o log para estar em JSON por meio de uma sub-rotina destination
:
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, às cotações existentes em $MSG
.
Existe uma maneira melhor de formatar a mensagem? Eu estava olhando para o incorporado em json-parser
mas parece que requer pares de valores-chave como entrada, enquanto eu gostaria de explodir os campos disponíveis em uma entrada JSON
EDITAR & SOLUÇÃO:
Eu encontrei no blog Dustin Oprea ' a solução exata:
destination d_json { file("/tmp/test.json" template("$(format-json --scope selected_macros --scope nv_pairs)\n")); };
desde que você queira formatar a mensagem como JSON, e não analisá-la, você precisa do função format-json () do syslog-ng .
BTW, as versões mais recentes de O syslog-ng pode enviar mensagens diretamente para o Elasticsearch .
HTH, Robert
Tags syslog-ng