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

未设置 logback logstash 编码器 Syslog 标头

logstash配置--syslog