我已经配置了 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 日志上失败了。以下行无法解析_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
]
}
有什么指点吗?
答案1
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
。
答案2
经过 4 年的努力,现在 logstash syslog 输入支持设置要使用的 grok 模式,详情请见文档。
为了保留系统日志输入功能,可以在grok_pattern
设置中插入非标准模式进行解析,例如:
input {
syslog {
port => 514
type => "syslog"
grok_pattern => "(?:<%{POSINT:priority}>%{SYSLOGLINE}|YOUR NONSTANDARD PATTERN HERE)"
}
}
或者同样修改默认<%{POSINT:priority}>%{SYSLOGLINE}
模式以使其也匹配非标准输入行。
答案3
我在 logstash 7.17 上遇到了同样的问题。通过添加 ecs_compatibility => "v8"
syslog 输入插件配置解决了该问题:
input {
syslog {
port => "514"
ecs_compatibility => "v8"
}
}
...