Logstash日期匹配不更新@timestamp

时间:2014-07-26 17:09:33

标签: date format logstash

日志字符串示例:

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}

这里发生了什么?

1 个答案:

答案 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}

希望这可以帮到你。