Syslog

從 syslog-ng 中的 csv-parser 中提取值

  • January 18, 2017

我有一個 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'

引用自:https://serverfault.com/questions/826940