Logstash
logstash 無法解析系統日誌輸入
我已經配置了 logstash (v1.5.0),帶有一個簡單的 syslog 輸入,如下所示:
input { syslog { type => syslog port => 5514 } } filter { kv {} } output { elasticsearch { cluster => "logs" host => "0.0.0.0" protocol => "transport" } }
但是,它似乎在某些 cron 日誌上失敗了。以下行無法使用 a 解析
_grokparsefailure_sysloginput
:<77>Jul 22 22:01:01 ip-172-31-2-48 run-parts(/etc/cron.hourly)[2599 finished 0yum-hourly.cron
最終的 JSON 輸出是:
{ "_index": "logstash-2015.07.22", "_type": "syslog", "_id": "AU63yLrC118PBgBqQxRA", "_score": null, "_source": { "message": "<77>Jul 22 22:01:01 ip-172-31-2-48 run-parts(/etc/cron.hourly)[2599 finished 0yum-hourly.cron\n", "@version": "1", "@timestamp": "2015-07-22T22:01:01.569Z", "type": "syslog", "host": "172.31.2.48", "tags": [ "_grokparsefailure_sysloginput" ], "priority": 0, "severity": 0, "facility": 0, "facility_label": "kernel", "severity_label": "Emergency" }, "fields": { "@timestamp": [ 1437602461569 ] }, "sort": [ 1437602461569 ] }
任何指針?
syslog 輸入在內部使用 grok,您的消息可能沒有 100% 遵循 syslog 標準。
此連結中的解決方案對我有用:http: //kartar.net/2014/09/when-logstash-and-syslog-go-wrong/
連結中的關鍵資訊是:
將 Logstash 配置中的現有 syslog 塊替換為:
input { tcp { port => 514 type => syslog } udp { port => 514 type => syslog } }
接下來,使用 grok 過濾器外掛替換我們的 syslog 輸入外掛的解析元素。
filter { if [type] == "syslog" { grok { match => { "message" => "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } } } }
您現在可以編輯過濾器匹配(“grok”)語法,以匹配您想要的格式。還可以通過創造性地使用 、 和 來支持多種不同
if
的else if
語法else
。