我正在研究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
}
这样做是存储具有不同格式日期的另一个字段。我的问题是,为什么用两种不同的格式存储代表相同日期的两个日期字段。我们可以不使用第一阶段的日期字段,我们可以使用第二阶段的日期字段吗?
答案 0 :(得分:3)
grok {}用于将非结构化字符串转换为结构化数据。运行后,您现在有一个名为“timestamp”的字符串。如果这就是你所需要的,那就完成了!
但是,如果您想使用该值作为日期而不是字符串,该怎么办?这就是date {}过滤器的用武之地。你给date {}字符串字段和字符串的格式,它会使你成为一个日期对象,然后你可以存储在elasticsearch中。
然后,您可以使用与弹性搜索日期相关的查询(“自5分钟以来有多少记录?”),如果您拥有的只是一个字符串,那将是不可能的。
默认情况下,date {}设置@timestamp字段,这是kibana想要用于直方图的x轴的字段,因此将其设置为生成事件的时间(而不是每当它生成时)由logstash处理)是一件“好事”。
一旦date {}过滤器使用该值更新了@timestamp,删除timestamp字段可能是有意义的。您可以使用remove_field参数执行此操作到日期过滤器(只有在过滤器成功时才会运行)。
希望有所帮助。