如何以 JSON 格式写入日志?

如何以 JSON 格式写入日志?

我想使用 在我的服务器上集中记录日志,syslog-ng它会将 JSON 格式的行写入文件,然后会被 拾取logstash,然后 会将其转发给elasticsearch。此设置有效,但有些特定的 JSON 问题除外。

syslog-ng通过以下节将日志格式化为 JSON 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")); };

这通常可以正常工作,但有时 JSON 最终会格式错误,例如由于 中存在引号$MSG

有没有更好的方法来格式化消息?我正在查看内置json-parser但它看起来需要键值对作为输入,而我想将可用字段分解为 JSON 条目

编辑和解决方案:

我发现Dustin Oprea' blog精确解:

destination d_json { file("/tmp/test.json" template("$(format-json --scope selected_macros --scope nv_pairs)\n")); };

答案1

因为你想将消息格式化为 JSON,而不是解析它,所以你需要 syslog-ng 的 format-json() 函数(请参阅管理员指南> 模板和重写 > 自定义消息格式 > 模板函数 > format-json)。

syslog-ng 的最新版本可以将消息直接发送到 Elasticsearch(请参阅管理员指南> 目标 > Elasticsearch)。

HTH,罗伯特

相关内容