grok:grok模式时间戳和logstash的日期过滤器之间有什么区别

时间:2015-09-01 17:45:15

标签: logstash grok

我正在研究logstash以及如何使用它的过滤器和grok模式。我怀疑我需要澄清一下。

假设我们的日志包含一个时间戳字段,如:

[01/Sep/2015:06:22:11 -0400]

使用grok,我可以定义一个模式来捕获它作为HTTPDATE,如下所示:

\[%{HTTPDATE:timestamp}\]

在grok调试器中,我可以看到它已经能够从中识别日期,时间等:

{
  "timestamp": [
    [
      "01/Sep/2015:06:22:11 -0400"
    ]
  ],
  "MONTHDAY": [
    [
      "01"
    ]
  ],
  "MONTH": [
    [
      "Sep"
    ]
  ],
  "YEAR": [
    [
      "2015"
    ]
  ],
  "TIME": [
    [
      "06:22:11"
    ]
  ],
  "HOUR": [
    [
      "06"
    ]
  ],
  "MINUTE": [
    [
      "22"
    ]
  ],
  "SECOND": [
    [
      "11"
    ]
  ],
  "INT": [
    [
      "-0400"
    ]
  ]
}

现在,我正在查看logstash网站上的一个教程,他们正在使用另一个日期过滤器将其存储到日期字段中。像这样:

date {
    match => [ "timestamp", "dd/MMM/YYYY:MM:mm:ss Z"]
    locale => en
}

这样做是存储具有不同格式日期的另一个字段。我的问题是,为什么用两种不同的格式存储代表相同日期的两个日期字段。我们可以不使用第一阶段的日期字段,我们可以使用第二阶段的日期字段吗?

1 个答案:

答案 0 :(得分:3)

grok {}用于将非结构化字符串转换为结构化数据。运行后,您现在有一个名为“timestamp”的字符串。如果这就是你所需要的,那就完成了!

但是,如果您想使用该值作为日期而不是字符串,该怎么办?这就是date {}过滤器的用武之地。你给date {}字符串字段和字符串的格式,它会使你成为一个日期对象,然后你可以存储在elasticsearch中。

然后,您可以使用与弹性搜索日期相关的查询(“自5分钟以来有多少记录?”),如果您拥有的只是一个字符串,那将是不可能的。

默认情况下,date {}设置@timestamp字段,这是kibana想要用于直方图的x轴的字段,因此将其设置为生成事件的时间(而不是每当它生成时)由logstash处理)是一件“好事”。

一旦date {}过滤器使用该值更新了@timestamp,删除timestamp字段可能是有意义的。您可以使用remove_field参数执行此操作到日期过滤器(只有在过滤器成功时才会运行)。

希望有所帮助。