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

grok: what is the difference between grok pattern timestamp and date filter of logstash

我正在研究 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
}

这是在存储另一个具有不同格式日期的字段。我的问题是,为什么存储两个日期字段表示相同的日期,只是格式不同。我们不能像使用第二阶段的日期字段那样使用第一阶段的日期字段吗?

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

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

然后您可以使用 elasticsearch 日期相关查询 ("how many records since 5 minutes ago?"),如果您只有一个字符串,这将是不可能的。

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

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

希望对您有所帮助。