Logstash Grok - 如何使用 HTTPDERROR_DATE 模式解析 @timestamp 字段?
Logstash Grok - How to parse @timestamp field using HTTPDERROR_DATE pattern?
我的日志文件有这样的模式:
[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]
我正在学习本教程:
使用:
Elasticsearch 2.2.x、Logstash 2.2.x 和 Kibana 4.4.x
Grok 构造函数打印:
所使用的 grok 模式,\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)
不会从 %{HTTPDERROR_DATE} 创建字段。
您需要有 %{pattern:field} 以便模式捕获的数据创建一个字段(cf documentation)。
所以在你的情况下它会是这样的:
\A\[%{HTTPDERROR_DATE:timestamp}](?<message>(.|\r|\n)*)
我认为 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"]
}
它可能对某人有帮助。谢谢!
要应用新字段,您必须输入目标以覆盖该字段:
目标 => "@timestamp"
举例:
date {
match => [ "timestamp", "dd MMM yyyy HH:mm:ss" ]
target => "@timestamp"
locale => "en"
remove_field => [ "timestamp" ]
}
我的日志文件有这样的模式:
[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]
我正在学习本教程:
使用:
Elasticsearch 2.2.x、Logstash 2.2.x 和 Kibana 4.4.x
Grok 构造函数打印:
所使用的 grok 模式,\A\[%{HTTPDERROR_DATE}](?<message>(.|\r|\n)*)
不会从 %{HTTPDERROR_DATE} 创建字段。
您需要有 %{pattern:field} 以便模式捕获的数据创建一个字段(cf documentation)。
所以在你的情况下它会是这样的:
\A\[%{HTTPDERROR_DATE:timestamp}](?<message>(.|\r|\n)*)
我认为 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"]
}
它可能对某人有帮助。谢谢!
要应用新字段,您必须输入目标以覆盖该字段:
目标 => "@timestamp"
举例:
date {
match => [ "timestamp", "dd MMM yyyy HH:mm:ss" ]
target => "@timestamp"
locale => "en"
remove_field => [ "timestamp" ]
}