Logstash:修改apache日期格式
Logstash: modify apache date format
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}
如果有人能对此给予更多的启发,我们将不胜感激。
COMBINEDAPACHELOG 模式期望日志条目中的日期与格式匹配,以便将其推入 "timestamp" 字段。它根本不会格式化你的时间戳。
日期被 grok'ed 到 "timestamp" 后,您可以使用 date{} 过滤器将其移动到 @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')
"
}
对于最新版本的 Logstash,代码为:
@将"datetime"转换为字符串"datestring"
ruby {
code => "event.set('datestring', event.get('datetime').strftime('%Y-%m-%d %H:%M:%S'))"
}
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}
如果有人能对此给予更多的启发,我们将不胜感激。
COMBINEDAPACHELOG 模式期望日志条目中的日期与格式匹配,以便将其推入 "timestamp" 字段。它根本不会格式化你的时间戳。
日期被 grok'ed 到 "timestamp" 后,您可以使用 date{} 过滤器将其移动到 @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')
"
}
对于最新版本的 Logstash,代码为:
@将"datetime"转换为字符串"datestring"
ruby {
code => "event.set('datestring', event.get('datetime').strftime('%Y-%m-%d %H:%M:%S'))"
}