我有一些只有时间作为条目的日志
1. 17:20:45.331|ERR|....
2. 17:20:54.715|SYS|.....Logging started for [....] (Date=[07/28/2014], ...
3. 17:20:54.716|SYS....
等等
我只在一行日志中有日期。基于我想要创建一个时间戳,例如日志中的记录日期+每个条目中的时间
我能够在每个条目中获得时间。我可以得到log_message => "记录开始[....](日期= [07/28/2014],..."作为一个条目。
任何帮助将不胜感激,因为我刚接触了logstash
我在logstash conf中的过滤器
filter {
grok { match => [ "message", "%{TIME:time}\|%{WORD:Message_type}\|%{GREEDYDATA:Component}\|%{NUMBER:line_number}\| %{GREEDYDATA:log_message}"]
}
date {
match => ["timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] => need to modify this as date+%{time}
}
}
时间字段也有毫秒。
答案 0 :(得分:1)
您的选择是:
memorize
插件(我提交了pull request以尝试在将来的版本中获取它。)该插件详见this answer。使用此解决方案的警告是,如果插件错过了具有日期的行,则您将遇到文件其余部分的问题。如果你重新启动logstash会发生这种情况,所以你需要添加一些逻辑来处理这个问题 - 在下面这个例子中,我假设如果没有看到日期,那就是今天。
使用memorize
插件的实现如下所示:
filter {
if ([message] =~ /Date=/) {
grok { match => [ "message", "Date=%{DATE:date}" ] }
}
# either add the field date to the saved date or pull the date from the saved data
memorize { fields => ["date"] }
# if we still don't have a date, lets just assume it's today
if ([date] == '') {
ruby {
code => 'event["date"]=ime.now.strftime("%m/%d/%Y")'
}
}
if ([message] !~ /Date=/) {
# grok to parse message
grok { match => [ "message", "%{TIME:time}\|%{WORD:Message_type}\|%{GREEDYDATA:Component}\|%{NUMBER:line_number}\| %{GREEDYDATA:log_message}"]
# now add in date
mutate {
add_field => {
datetime => "%{date} %{time}"
}
}
}
}
(此示例尚未经过测试,因此可能存在语法/逻辑错误,但它应该让您走上正确的道路。)