Logstash:修改apache日期格式

时间:2015-07-06 23:55:03

标签: apache logstash logstash-grok

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}

如果有人能够对此有更多启发,我们将非常感激。

2 个答案:

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