出于某种原因,当我尝试替换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"
}
}
结果是:
实际应该是:
感谢。
答案 0 :(得分:0)
平均而言,只有1/1000日志以毫秒= 000处理,如@timestamp所示。
你能猜出当你把HH:mm:ss传递给日期{}时会发生什么?这是正确的 - 输入中没有提供毫秒信息,它被设置为000。
所以,我认为你的约会{}节工作正常。
您可以通过在输出中查找“date_filtered”标记来确认这一点;只有在日期{}成功时才会添加标记。