rsyslog 功能强大,但其文档不够清晰。我无法弄清楚如何解析日志文件并将其直接路由到 Graylog胃肠道疾病格式。
我找到了一些关于在 rsyslog 中输出 gelf但我不确定该如何进行。
到目前为止,它尝试放置下面的配置/etc/rsyslog.d/01-access.conf
但似乎不起作用……
template(name="gelf" type="list") {
constant(value="{\"version\":\"1.1\",")
constant(value="\"host\":\"")
property(name="hostname")
constant(value="\",\"short_message\":\"")
property(name="msg" format="json")
constant(value="\",\"timestamp\":\"")
property(name="timegenerated" dateformat="unixtimestamp")
constant(value="\",\"level\":\"")
property(name="syslogseverity")
constant(value="\"}")
}
input(type="imfile"
File="/var/log/apache2/access.log"
Tag="apache-access"
)
if $programname == 'apache-access' then {
action(
type="omfwd"
Target="GRAYLOG-IP"
Port="12201"
Protocol="tcp"
template="gelf"
)
stop
}
答案1
您遇到此问题是因为 Gelf 的空字节消息分隔符规范导致 rsyslog 无法通过 tcp 发送。摘自 rsyslog 官方文档:(http://www.rsyslog.com/doc/v8-stable/tutorials/gelf_forwarding.html)“请注意,上述情况仅适用于 UDP 传输。使用 TCP 时,Graylog 需要 Nullbyte 作为消息分隔符。目前 rsyslog 无法实现这一点。”但是,您的示例应该可以通过 udp 工作。
一句忠告,我绝对建议检查 rsyslog 过滤规则,因为消息处理将继续按照您的示例进行(检查波浪号)。
答案2
摘自:https://www.rsyslog.com/doc/master/tutorials/gelf_forwarding.html
使用 TCP 时,Graylog 需要 Nullbyte 作为消息分隔符。因此,要使用 TCP,您需要通过 TCP_FrameDelimiter 选项更改分隔符。
action(type="omfwd" target="graylogserver" port="12201" protocol="tcp" template="gelf" TCP_FrameDelimiter="0" KeepAlive="on")