Logstash日期过滤器在特殊情况下

时间:2014-12-17 09:09:35

标签: logstash

我的日志格式如下:

201407022000.log:2014-07-02 20:00;10.112.64.250;3;972819;ULC Primeline

因为它是一个csv我可以很容易地分割出第一部分:

csv {
    columns => ["fulldate","ip","port","electricity","customer"]
    separator => ";"
    remove_field => "message" 
}

现在我想将 fulldate 字段拆分为“日期之前的任何内容”(201407022000.log:)和实际日期字段(2014-07-02 20:00

我尝试使用这样的日期过滤器:

date {
    match => [ "fulldate", "YYYY-MM-dd HH:mm" ]
    timezone => "Europe/Berlin"
}

我收到以下错误

  

无法从字段{:field =>“date”解析日期,   :value =>“201407022000.log:2014-07-02 20:00”,   :exception => java.lang.IllegalArgumentException:格式无效:   “201407022000.log:2014-07-02 20:00”格格不入   “000.log:2014-07-02 20:00”,:level =>:warn}

不幸的是,这不起作用logstash无法解析。

1 个答案:

答案 0 :(得分:1)

失败的原因是你试图解析这个:

201407022000.log:2014-07-02 20:00

使用符合格式的过滤器:

"YYYY-MM-dd HH:mm"

你可以做的是在解析它之前在该字段上使用grok:

filter {
  grok {
    match => { "fulldate" => "[0-9.]+log:%{TIMESTAMP_ISO8601:date}" }
  }
}

如果你还想在开始时捕获文件名,你可以创建一个新的模式(可以放在模式目录中的文件中,通常是基于UNIX的系统中的/ opt / logstash / patterns):

LOGFILENAMEPATTERN [0-9.]+log

然后你的格言会成为:

filter {
  grok {
    match => [ "fulldate" => "%{LOGFILENAMEPATTERN:filename}:%{TIMESTAMP_ISO8601:date}" ]
  }
}

最后,您的日期模式将变为:

date {
    match => [ "date", "yyyy-MM-dd HH:mm" ]
    timezone => "Europe/Berlin"
}

注意,我已经更改了你要匹配的字段的名称,因为我在grok中将其重命名,并且我已经用yyyy替换了YYYY,因为Y是年代,y是年份,它们不是相同(根据documentation