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'))"
}