GELF 中的 Rsyslog 输出

GELF 中的 Rsyslog 输出

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")

相关内容