Como gravar logs no formato JSON?

1

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")); };
    
por WoJ 22.10.2015 / 18:34

1 resposta

0

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

    
por 23.10.2015 / 12:14

Tags