需要在logstash中通过grok过滤器自定义日志字段

问题描述 投票:2回答:1

我在我的系统上安装了logstash,kibana和elasticsearch,具有以下过滤器配置:

    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}" ]
    }
    mutate {
            add_field => {
                            "timestamp" => "%{TIME} %{MONTH} %{monthday}"
                         }
        }

    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

并在kibana上接收输出为:

但我需要一些字段如下:@timestamp @version _id _index _type _file日志级别主机名主机IP进程名称响应时间

我尝试添加Timestamp但是它打印相同的字符串而不是动态结果

logstash logstash-grok
1个回答
0
投票

你将模式与字段混淆了。

模式是表示正则表达式的简写符号,例如%{WORD}作为“\ b \ w + \ b”的快捷方式。

字段是存储数据(包括与模式匹配的信息)的地方。可以将模式放到这样的字段中:%{WORD:my_field}

在你的grok {}中,你匹配:%{SYSLOGTIMESTAMP:syslog_timestamp},它将匹配的所有内容放入一个名为syslog_timestamp的字段中。这是在syslog消息前面看到的月,月和时间。

即使SYSLOGTIMESTAMP本身定义为“%{MONTH} +%{MONTHDAY}%{TIME}”,它们也没有“:name”语法,因此不会为MONTH,MONTHDAY和TIME创建任何字段。

假设您确实想要以您描述的格式创建一个新字段,您需要:

  1. 创建一个新模式来替换所有可以从信息中创建字段的SYSLOGTIMESTAMP。
  2. 使用现有模式来创建syslog_timestamp字段,然后使用简单模式将其分开以将其拆分。

我推荐#2,所以你最终得到这样的东西:

grok {
      match => { "syslog_timestamp" => "%{MONTH:month} +%{MONTHDAY:monthday} %{TIME:time}" }
}

应该这样做。

请注意,您的字段将是一个字符串,因此它不会在范围查询等中使用。您应该使用date {}过滤器将@timestamp替换为syslog_timestamp信息。

祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.