Logstash Grok - 如何使用HTTPDERROR_DATE模式解析@timestamp字段?

时间:2016-11-02 16:34:19

标签: logstash date-format logstash-grok logstash-configuration filebeat

我的日志文件有这种模式:

[Sun Oct 30 17:16:09 2016] [TRACE_HIGH] [TEST1] MessageTest1
[Sun Oct 30 17:16:10 2016] [TRACE_HIGH] [TEST2] MessageTest2

模式:

\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)

过滤器:

filter {
  if [type] == "mycustomlog" {
    grok {
      match => { "message" => "\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)"}
    }
    date {
      # Format: Wed Jan 13 11:50:44.327650 2016 (GROK: HTTPDERROR_DATE)
      match => [ "timestamp", "EEE MMM dd HH:mm:ss yyyy"]     
    }
    multiline {
      pattern => "^%{SYSLOG5424SD}%{SPACE}"
      what => "previous"
      negate=> true
    }
  }
} 

我正在尝试将我的日期时间日志用于@timestamp字段,但我无法将此格式解析为@timestamp。为什么日期过滤器没有替换@timestamp值?

我的@timestamp与日志行不同:

行[0]

  • @timestamp:[11月2日星期三15:56: 42 2016]
  • 消息:[11月2日星期三15:56: 41 2016]

enter image description here

我正在学习本教程:

https://www.digitalocean.com/community/tutorials/adding-logstash-filters-to-improve-centralized-logging

使用:

Elasticsearch 2.2.x,Logstash 2.2.x和Kibana 4.4.x

Grok构造函数打印: enter image description here

3 个答案:

答案 0 :(得分:1)

使用的grok模式\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)不会从%{HTTPDERROR_DATE}创建字段。
您需要拥有%{pattern:field},以便模式捕获的数据创建一个字段(cf documentation)。

所以在你的情况下它会是这样的:

\A\[%{HTTPDERROR_DATE:timestamp}](?<message>(.|\r|\n)*)

答案 1 :(得分:1)

我认为Elasticsearch / Kibana @timestamp 不支持“EEE MMM dd HH:mm:ss yyyy”格式。因此,您可以使用 mutate 处理器将时间戳设置为“dd / MMM / yyyy:HH:mm:ss.SSSSSS”格式。

以下代码段:

grok {
                match => [ "message", "\[%{DAY:day} %{MONTH:month} %{MONTHDAY:monthday} %{TIME:time} %{YEAR:year}\] %{GREEDYDATA:message}" ]
    }
   mutate {
                add_field => {
                                "timestamp" => "%{monthday}/%{month}/%{year}:%{time}"
        }
    }
   date {
                locale => "en"
                timezone => "UTC"
                match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss.SSSSSS"]
                target => "@timestamp"
                remove_field => ["timestamp", "monthday", "year", "month", "day", "time"]
    }

它可能对某人有所帮助。谢谢!

答案 2 :(得分:1)

要应用新字段,您必须输入目标以覆盖字段:

target =&gt; “@timestamp”

以示例:

 date {
      match => [ "timestamp", "dd MMM yyyy HH:mm:ss" ]
      target => "@timestamp"
      locale => "en"
      remove_field => [ "timestamp" ]
    }