Logging

GELF 中的 Rsyslog 輸出

  • April 9, 2020

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://serverfault.com/questions/785776