如何正确格式化 json 消息并使用 syslog-ng 通过 amqp 发送它们?
json 格式应该是这样的。
{"log":"This is the error message...", "date":"xxx", "source":"xxx"}
我遇到的问题是消息并不总是有效的 json 字符串。
例如
"log":"This is a "serious" error message."
我该如何逃避这个消息?
我的 syslog-ng 配置看起来像这样。
destination d_amqp {
amqp(
vhost("/")
host("127.0.0.1")
port(5672)
username("guest") # required option, no default
password("guest") # required option, no default
exchange("syslog")
exchange_type("header")
routing_key("my-routing-key")
body("\{\"log\":\"${MSG}\"\}")
persistent(yes)
value-pairs(
scope("selected-macros" "nv-pairs" "sdata")
)
);
};
这只是一个例子,因为我现在面前没有实际的配置。
答案1
您应该使用 $(format-json) 模板函数,而不是手工制作 json 有效负载。
这将为您完成转义。更不用说您可以查询消息中的名称-值对集并使 json 更加动态,例如通过添加具有特定前缀的所有名称-值对。
Algernon 也发表了一篇关于 json 的长博客文章。请参见此处: https://algernon.blogs.balabit.com/2012/02/cee-handling-with-syslog-ng-ose/