syslog 到 logstash _grokparsefailure
Posted
技术标签:
【中文标题】syslog 到 logstash _grokparsefailure【英文标题】:syslog to logstash _grokparsefailure 【发布时间】:2018-01-30 16:29:27 【问题描述】:我有 ELK 5.4 版。 我从许多网络机器(如 cisco、Juniper、Fortigate、F5)获取 syslog。
logstash.conf 看起来像:
input
tcp
port => 514
type => syslog
udp
port => 514
type => syslog
filter
if [type] == "syslog"
grok
match => "message" => "%SYSLOGTIMESTAMP:syslog_timestamp %SYSLOGHOST:syslog_hostname %DATA:syslog_program(?:\[%POSINT:syslog_pid\])?: %GREEDYDATA:syslog_message"
add_field => [ "received_at", "%@timestamp" ]
add_field => [ "received_from", "%host" ]
syslog_pri
date
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
if !("_grokparsefailure" in [tags])
mutate
replace => [ "@source_host", "%syslog_hostname" ]
replace => [ "@message", "%syslog_message" ]
mutate
remove_field => [ "syslog_hostname", "syslog_message", "syslog_timestamp" ]
我得到了很多 _grokparsefailure。 也许有人有一个 logstash.conf 的例子,它可以在没有 _grokparsefailure 的情况下 grok 机器的所有系统日志?
以下是一些日志示例:
2018-01-30T09:30:14.675+0200: %ADMIN-6-INFO: [local] recorded login for administrator: (user)
Jan 25 17:26:47.767: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet8/11, changed state to down
Jan 30 01:13:43 SERVER_NAME lldpd[70354]: task_process_events: no read/accept method for (null) socket 0 <39>
Feb 1 09:14:43 SERVER_NAME rshd[64810]: user@user2 as root: cmd='/xxxx/xxxx/xxxx'
谢谢 助教
【问题讨论】:
有了给定的日志消息集,我可以帮助构建解析器。或者至少显示第一步,如果它太大,你可以完成工作。如果没有所有的日志模式或各种日志示例,我将无能为力。 谢谢,以下是一些日志示例:2018-01-30T09:30:14.675+0200:%ADMIN-6-INFO: [本地] 记录的管理员登录:(用户)1 月 25 日 17: 26:47.767:%LINEPROTO-5-UPDOWN:接口 FastEthernet8/11 上的线路协议,将状态更改为关闭 1 月 30 日 01:13:43 SERVER_NAME lldpd [70354]:task_process_events:没有(空)套接字 0 2 月 1 日 09:14:43 SERVER_NAME rshd[64810]: user@user2 as root: cmd='/xxxx/xxxx/xxxx' 【参考方案1】:我用这个网站来测试模式:
http://grokconstructor.appspot.com/do/match
这个网站寻找预制模式:
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
对于第一条消息,模式是这样的:
%TIMESTAMP_ISO8601:time: %SYSLOGPROG \[%WORD:level\] %GREEDYDATA:message
对于第三条消息,你可以使用这个(如果你喜欢的话):
%MONTH:month %MONTHDAY:day %TIME:time %NOTSPACE:serverName %NOTSPACE:task: %GREEDYDATA:message
在logstash中你可以这样使用:
filter
grok
match=>"message" => <pattern1>
if "_grokparsefailure" in [tags]
mutate remove_tag => [ "_grokparsefailure" ]
grok
match=>"message" => <pattern2>
if "_grokparsefailure" in [tags]
mutate remove_tag => [ "_grokparsefailure" ]
grok
match=>"message" => <pattern3>
这个想法是编写您的模式以匹配日志,如果一个不适合,您删除 _grokparsefailure 标记并尝试另一个。如果它失败,它不会尝试下一个。这有点乏味,但我没有更好的解决方案。如果您可以按来源标记日志,则可以通过编写 if 条件来加快此过程。 我希望这对您有所帮助或至少给您一些指导。
【讨论】:
谢谢,帮了大忙【参考方案2】:我建议您将解析失败写入文件,以便您可以根据失败创建新模式。
output
if "_grokparsefailure" in [tags]
file
path => "/tmp/var/log/parse_failures.log
并非所有设备都遵循 syslog RFC,因此几乎不可能拥有所有可用模式的列表。
【讨论】:
以上是关于syslog 到 logstash _grokparsefailure的主要内容,如果未能解决你的问题,请参考以下文章
如何从发送到 Logstash 的 syslog 日志中检索标签?
Logstash + Syslog 输入插件 VS Logstash + 文件输入插件 + Syslog 服务器
Python SysLogHandler -> syslog:logstash。设施未变
使用 filebeat 和 logstash 将 syslog 转换为 json