grok-filter %{COMBINEDAPACHELOG}
将时间戳格式设置为dd/MMM/YYYY:HH:mm:ss Z
但是我需要格式为yyyy-MM-dd HH:mm:ss
的时间戳
我尝试了以下配置
grok {
match => [
"message", "%{COMBINEDAPACHELOG}",
]
break_on_match => false
}
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
target => ["datetime"]
}
但得到了以下解析错误:
Failed parsing date from field {:field=>"timestamp", :value=>"19/May/2012:12:40:18 -0700", :exception=>java.lang.IllegalArgumentException: Invalid format: "19/May/2012:12:40:18 -0700" is malformed at "/May/2012:12:40:18 -0700", :level=>:warn}
如果有人能够对此有更多启发,我们将非常感激。
答案 0 :(得分:4)
COMBINEDAPACHELOG模式期望日志条目中的日期与格式匹配,因此它可以将其推送到"时间戳"领域。它根本不会格式化您的时间戳。
将日期设置为" timestamp"后,您可以使用日期{}过滤器将其移至@timestamp。你在那里提供的模式应该匹配字段中的任何内容。
所以,传递" dd / MMM / yyyy:HH:mm:ss Z"作为日期{}的格式,您应该全部设置。
编辑:
根据您的其他详细信息,我希望您可以匹配输入日期的每个组件,然后将它们组合到一个新字段中。如果您尝试在字符串中交换firstName和lastName,那将会有效,但日期更复杂。简单的字符串交换不会处理转换" Jan"到" 01"或完全处理时区。
因此,我们回到创建日期对象,然后以您希望的格式将其输出为字符串。
# convert "timestamp" to a date field "datetime"
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
# convert "datetime" to a string "datestring"
ruby {
code => "
event['datestring'] = event['datetime'].strftime('%Y-%m-%d %H:%M:%S')
"
}
答案 1 :(得分:0)
对于最新版本的Logstash,代码为:
@将“ datetime”转换为字符串“ datestring”
ruby {
code => "event.set('datestring', event.get('datetime').strftime('%Y-%m-%d %H:%M:%S'))"
}