[英]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{} 用于将非结构化字符串转换为结构化数据。 运行后,您现在有一个名为“timestamp”的字符串。 如果这就是你所需要的,你就完成了!
但是,如果你想使用该值作为一个日期,而不是字符串是什么? 这就是 date{} 过滤器的用武之地。您为 date{} 提供字符串字段和字符串格式,它将使您成为一个日期对象,然后您可以将其存储在 elasticsearch 中。
然后,您可以使用与 elasticsearch 日期相关的查询(“自 5 分钟前有多少条记录?”),如果您只有一个字符串,这是不可能的。
默认情况下,date{} 设置 @timestamp 字段,这是 kibana 想要用于直方图 x 轴的字段,因此将其设置为事件生成的时间(而不是由 logstash 处理的时间) ) 是一件“好事”。
一旦 date{} 过滤器使用值更新了 @timestamp,删除时间戳字段可能是有意义的。 您可以使用日期过滤器的 remove_field 参数来执行此操作(仅当过滤器成功时才会运行)。
希望有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.