Logstash 不会从 apache 日志更新@timestamp
Logstash does not update @timestamp from apache log
如果您将日志回填到 logstash 中,您应该尝试以某种方式提取正确的时间戳。否则,他们将被分配到 logstash 收到日志行的时间。
这是使用 date
过滤器实现的,例如:
date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] }
但不幸的是,这对我不起作用。
所以我有以下 Apache 日志行:
10.80.161.251 - - [15/Oct/2015:09:13:45 +0000] "- -" "POST /xxx HTTP/1.1" 200 696 29416 "-" "xxx" 4026
以及以下模式
ACCESS_LOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:[@metadata][timestamp]}\] "(?:TLSv%{NUMBER:tlsversion}|-) (?:%{NOTSPACE:cypher}|-)" "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes_in}|-) (?:%{NUMBER:bytes_out}|-) %{QS:referrer} %{QS:agent} %{NUMBER:tts}
以及以下 logstash 配置
# INPUTS
input {
file {
path => '/var/log/test.log'
type => 'apache-access'
}
}
# filter/mix/match
filter {
if [type] == 'apache-access' {
grok {
patterns_dir => [ '/root/logstash-patterns' ]
match => [ "message", "%{ACCESS_LOG}" ]
}
if !("_grokparsefailure" in [tags]) {
mutate { add_field => ["timestamp_submitted", "%{@timestamp}"] }
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
}
}
# now output
output {
stdout { codec => rubydebug }
}
我在这里做错了什么。我尝试添加时区、语言环境等等。它仍然不起作用。非常感谢任何帮助(如果您碰巧在保加利亚的索非亚,还可以选择一杯饮料)。
自我提示:仔细阅读
这里的问题是没有匹配正确的字段。
由于 apache 日志的默认模式,日志行的时间戳在 [@metadata][timestamp]
而不是 timestamp
所以日期匹配过滤器应该是:
date {
match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
如果您将日志回填到 logstash 中,您应该尝试以某种方式提取正确的时间戳。否则,他们将被分配到 logstash 收到日志行的时间。
这是使用 date
过滤器实现的,例如:
date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] }
但不幸的是,这对我不起作用。
所以我有以下 Apache 日志行:
10.80.161.251 - - [15/Oct/2015:09:13:45 +0000] "- -" "POST /xxx HTTP/1.1" 200 696 29416 "-" "xxx" 4026
以及以下模式
ACCESS_LOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:[@metadata][timestamp]}\] "(?:TLSv%{NUMBER:tlsversion}|-) (?:%{NOTSPACE:cypher}|-)" "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes_in}|-) (?:%{NUMBER:bytes_out}|-) %{QS:referrer} %{QS:agent} %{NUMBER:tts}
以及以下 logstash 配置
# INPUTS
input {
file {
path => '/var/log/test.log'
type => 'apache-access'
}
}
# filter/mix/match
filter {
if [type] == 'apache-access' {
grok {
patterns_dir => [ '/root/logstash-patterns' ]
match => [ "message", "%{ACCESS_LOG}" ]
}
if !("_grokparsefailure" in [tags]) {
mutate { add_field => ["timestamp_submitted", "%{@timestamp}"] }
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
}
}
# now output
output {
stdout { codec => rubydebug }
}
我在这里做错了什么。我尝试添加时区、语言环境等等。它仍然不起作用。非常感谢任何帮助(如果您碰巧在保加利亚的索非亚,还可以选择一杯饮料)。
自我提示:仔细阅读
这里的问题是没有匹配正确的字段。
由于 apache 日志的默认模式,日志行的时间戳在 [@metadata][timestamp]
而不是 timestamp
所以日期匹配过滤器应该是:
date {
match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ]
}