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

时间:2015-01-22 07:11:40

标签: logstash logstash-grok

我的系统上安装了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上接收输出为: Kibana output

但我需要一些字段如下: @timestamp @版 _ID _指数 _类型 _文件 日志级别 主机名 主机IP 进程名称 响应时间

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

Kibana output

1 个答案:

答案 0 :(得分: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字段,然后使用简单模式将其拆分为<}。
  3. 我建议#2,所以你最终会得到这样的结果:

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

    应该这样做。

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

    祝你好运。