【发布时间】:2014-12-10 18:03:49
【问题描述】:
由于某种原因,当我尝试替换我的 apache 访问日志事件中的 @timestamp 字段时,它不起作用。对于 Nginx,它确实可以使用相同的日期格式。
这是我的日志日期格式:[10/Dec/2014:13:01:06 -0500]
这是我的 logstash.conf -
if [type] == "apache" {
grok {
match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)" }
add_tag => [ "apache", "grokked" ]
}
date {
match => [ "[time]" , "dd/MMM/YYYY:HH:mm:ss Z" ]
locale => "en"
add_tag => ["date_filtered"]
}
}
@timestamp 字段保持这种格式 - 2014-12-10T18:01:06.000Z
更新: 这是完整的配置 -
日志中没有错误,只有logstash启动日志行。
我的logstash配置文件如下:
input {
redis {
host => "<redis_server>"
port => "<redis_port>"
data_type => 'list'
key => 'logstash'
type => 'redis'
threads => 300
}
filter {
multiline {
pattern => "(^\s)|(^INFO.+)|(^SEVERE.+)"
what => "previous"
add_tag => ["multiline"]
stream_identity => '%{host}.%{file}.%{type}'
}
if [type] == "apache" {
grok {
match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time}\] \"(?:%{WORD:method} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)" }
add_tag => [ "apache", "grokked" ]
}
date {
match => [ "[time]" , "dd/MMM/YYYY:HH:mm:ss Z" ]
locale => "en"
add_tag => ["date_filtered"]
}
}
}
output {
elasticsearch {
host => "<ES_server>"
port => "9300"
cluster => "elasticsearch"
embedded => false
node_name => "logstash"
}
}
结果是:
什么时候应该是:
谢谢。
【问题讨论】:
-
我在你的 grok 过滤器中没有看到
time?你是如何从message中提取时间的? -
@Vaibhav:
\[%{HTTPDATE:time}\]包含在模式中。 -
我在 grok 过滤器中提取它 - [%{HTTPDATE:time}]
-
@user3323914:不确定你在这里问的是什么。您的最后一条语句表明您希望时间戳字段具有另一个 format,但该字段的格式是 always ISO8601,如您的示例所示。还是日期过滤器无法解析时间戳的问题?如果是这样,日志将包含指向正确方向的错误消息。
-
@MagnusBäck,谢谢。如果我理解正确,这是两种不同的格式? - [10/Dec/2014:13:01:06 -0500] 和 2014-12-10T18:01:06.000Z ?你知道我应该怎么做才能使它与当前格式一起工作吗?谢谢!