日志字符串示例:
2014-06-01 00:00:48 192.168.1.1 968 http://yandex.ru
Logstash config:
input {
file {
path => "/home/michael/logs/squid.log"
start_position => "beginning"
}
}
filter {
grok {
match => [ "message", "%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}\t+%{TIME:time}\t+%{IPORHOST:userID}|{WORD:userID}\t+%{NUMBER:response_size}\t+%{URIHOST:dst_host}|{URI:dst_host}" ]
}
mutate {
add_field => { "timestamp" => "%{year}-%{month}-%{day} %{time}" }
}
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
}
}
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
虽然没有添加日期过滤器,但它完美运行:日志分析和字段添加。但是使用日期过滤器消息的某些部分消失了,logstash日志说:
{:timestamp=>"2014-07-26T22:48:44.413000+0600", :message=>"Failed parsing date from field", :field=>"timestamp", :value=>"%{year}-%{month}-%{day} %{time}", :exception=>java.lang.IllegalArgumentException: Invalid format: "%{year}-%{month}-%{day} %{time}", :level=>:warn}
这里发生了什么?
答案 0 :(得分:1)
使用您的配置和日志,它适用于我的版本1.4.1!
我认为这可能是你的grok模式解析错误,否则不会出现此错误消息:value=>"%{year}-%{month}-%{day} %{time}"
。
错误消息表示您添加的timestamp
字段的内容为%{year}-%{month}-%{day} %{time}
。
这意味着grok过滤器解析错误。
您可以执行的操作是,检查日志中的日志是whitespace (" ")
还是tab (\t)
。如果是空格,则不能在模式中使用\t
。
<强>更新强>
您可以将\t
更改为[ \t]
。此模式解析空白和\t
。
%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}[ \t]+%{TIME:time}[ \t]+%{IPORHOST:userID}|{WORD:userID}[ \t]+%{NUMBER:response_size}[ \t]+%{URIHOST:dst_host}|{URI:dst_host}
希望这可以帮到你。