Filter syslog至logstash_grokparsefailure

Filter syslog至logstash_grokparsefailure,filter,tags,logstash,elastic-stack,syslog,Filter,Tags,Logstash,Elastic Stack,Syslog,我有麋鹿5.4版。 我从很多网络机器(如cisco、Juniper、Fortigate、F5)获得系统日志 logstash.conf看起来像: input { tcp { port => 514 type => syslog } udp { port => 514 type => syslog } } filter { if [type] == "syslog" { grok { match =&

我有麋鹿5.4版。 我从很多网络机器(如cisco、Juniper、Fortigate、F5)获得系统日志

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" ]
    }
  }
}
我得到了很多乐趣。 也许有人有一个logstash.conf的例子,它可以在没有\u grokparsefailure的情况下检查机器的所有系统日志

以下是一些日志示例:

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接口上的线路协议,状态更改为down
Jan 30 01:13:43服务器名称lldpd[70354]:任务处理事件:没有(null)套接字0的读取/接受方法
二月一日09:14:43服务器名称rshd[64810]:user@user2根目录:cmd='/xxxx/xxxx/xxxx'
谢谢
TA

我使用这个网站来测试模式:

和此网站来查找预制模式:

对于第一条消息,此模式为:

%{TIMESTAMP_ISO8601:time}: %{SYSLOGPROG} \[%{WORD:level}\] %{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>}
    }
  }
}
过滤器{
格罗克{
匹配=>{“消息”=>}
}
如果[tags]中有“\u grokparsefailure”{
mutate{remove_tag=>[“\u grokparsefailure”]}
格罗克{
匹配=>{“消息”=>}
}
}
如果[tags]中有“\u grokparsefailure”{
mutate{remove_tag=>[“\u grokparsefailure”]}
格罗克{
匹配=>{“消息”=>}
}
}
}
其思想是编写与日志匹配的模式,如果其中一个不匹配,则删除_grokparsefailure标记并尝试另一个。如果它成功了,它就不会尝试下一个。这有点乏味,但我没有更好的解决办法。如果您可以按日志的源标记日志,则可以通过写入If条件来加快此过程。

我希望这对您有所帮助,或者至少给您一些指导。

我建议您将解析失败写入一个文件,以便您可以基于失败创建新模式

output {
  if "_grokparsefailure" in [tags] {
    file {
      path => "/tmp/var/log/parse_failures.log
    }
  }
}

并非所有设备都遵循syslog RFCs,因此几乎不可能有所有可用模式的列表。

通过给定的日志消息集,我可以帮助构建解析器。或者至少展示第一步,这样你就可以完成任务,如果任务太大的话。如果没有所有的日志模式或各种日志示例,我就无能为力了。谢谢,这里有一些日志示例:2018-01-30T09:30:14.675+0200:%ADMIN-6-INFO:[本地]管理员的记录登录:(用户)Jan 25 17:26:47.767:%LINEPROTO-5-UPDOWN:FastEthernet8/11接口上的线路协议,状态更改为down Jan 30 01:13:43服务器名称lldpd[70354]:任务\u进程\u事件:无(null)套接字的读取/接受方法0 Feb 1 09:14:43服务器\u名称rshd[64810]:user@user2作为root:cmd='/xxxx/xxxx/xxxx'谢谢,帮助很大
output {
  if "_grokparsefailure" in [tags] {
    file {
      path => "/tmp/var/log/parse_failures.log
    }
  }
}