rsyslog 功能强大,但它的文档并不那么明确。我不知道如何解析日志文件并将其直接路由到GELF格式的 Graylog。
我找到了一些关于在 rsyslog 中输出 gelf的文档,但我不确定如何继续。
到目前为止,它试图将下面的 conf 放入,/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
}
由于 Gelf 的空字节消息分隔符规范,您遇到此问题是因为通过 tcp 发送无法使用 rsyslog。来自官方 rsyslog 文档:(http://www.rsyslog.com/doc/v8-stable/tutorials/gelf_forwarding.html)“请注意,上述情况仅适用于 UDP 传输。使用 TCP 时,Graylog 需要 Nullbyte作为消息分隔符。这目前在 rsyslog 中是不可能的。” 但是,您的示例应该通过 udp 工作。
一句忠告,我肯定会建议检查 rsyslog 过滤器规则,因为消息处理将继续您的示例(检查波浪字符)。
摘自:https ://www.rsyslog.com/doc/master/tutorials/gelf_forwarding.html
使用 TCP 时,Graylog 需要 Nullbyte 作为消息分隔符。因此,要使用 TCP,您需要通过 TCP_FrameDelimiter 选项更改分隔符。