我的日志格式如下:
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无法解析。
答案 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)