Syslog
從 syslog-ng 中的 csv-parser 中提取值
我有一個 csv 格式的 syslog 提要,syslog-ng 使用 csv-parser 攝取並寫入磁碟。
據我了解,使用 csv-parser 應該為傳入的數據提供 syslog-ng 上下文以及什麼值意味著什麼。我想使用該上下文使 syslog-ng 基於該邏輯應用過濾器。
例如,如果 csv 列之一與特定值匹配,我希望它僅將事件記錄到磁碟。
csv-parser文件似乎表明這應該是可能的。
我的配置看起來有點像:
parser p_my_app { csv-parser( columns("MY_APP.COLOUR","MY_APP.SIZE","MY_APP.SERIAL_NUMBER") delimiters(",") flags(escape-double-char) ); }; source s_my_app { syslog(ip(0.0.0.0) port(6514) transport("tcp") ); }; filter f_my_app { match("123456" value("MY_APP.SERIAL_NUMBER") ); }; destination d_my_app { file("/var/log/my_app.log" create_dirs(yes) ); }; log { source(s_my_app); filter(f_my_app); parser(p_my_app); destination(d_my_app); };
但是,似乎無論我如何嘗試,匹配都不會匹配。這是帶有該配置的 sylog-ng 調試輸出:
Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname - - - red,large,123456 ' Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18' Filter node evaluation result; result='not-match' Filter rule evaluation result; result='not-match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
我(希望?)我遺漏了一些非常明顯的東西,但是經過數小時的Google搜尋後,我無法在網上找到任何完整的範例,只是提取似乎永遠不會起作用。有沒有人能夠看到我做錯了什麼和/或提供一個完整的工作範例?
好吧,似乎總是這樣,我花了一周的時間解決一個問題,放棄,決定尋求幫助——然後一個小時後自己找出解決方案。
我的問題是
log()
聲明中項目的順序。具體來說,該parser()
行必須在filter()
語句之前。確實,文件(我一定已經閱讀了 10 次並錯過了)指出:
注意 log 語句中過濾器、重寫規則和解析器的順序很重要,因為它們是按順序處理的。
因此,工作程式碼是使用:
log { source(s_my_app); parser(p_my_app); filter(f_my_app); destination(d_my_app); };
另外,要注意的另一件事是,它
match()
實際上應該是一個正則表達式,所以為了更清楚起見,我還將過濾器更新為:filter f_my_app { match("123456" value("MY_APP.SERIAL_NUMBER") type("string")); };
現在使用 syslog-ng 報告:
Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname - - - red,large,123456 ' Message parsing complete; result='1', rule='p_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:14:2' Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18' Filter node evaluation result; result='match' Filter rule evaluation result; result='match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'