日期格式是否存在任何grok {}模式YYYY / MM / DD HH:mm:ss?

时间:2015-09-05 17:40:01

标签: logstash logstash-grok

我正在检查服务器上的nginx错误日志,发现它们的日期格式为:

2015/08/30 05:55:20

即。 YYYY/MM/DD HH:mm:ss。我试图找到一个现有的grok日期模式,这可能有助于我快速解析,但遗憾的是找不到任何这样的日期格式。最终,我不得不把模式写成:

%{YEAR}/%{MONTHNUM}/%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}? 

我仍然希望相同的模式是否更短?

4 个答案:

答案 0 :(得分:6)

没有。你在github上找到了included patterns。对datestamp的评论似乎与您的YYYY / MM / DD相符,但DATE_USDATE_EU不同。

我建议使用grok选项patterns_dir重载DATE模式并使用DATESTAMP

DATE_YMD %{YEAR}/%{MONTHNUM}/%{MONTHDAY}
DATE %{DATE_US}|%{DATE_EU}|%{DATE_YMD}

或者只是将您的模式添加到模式文件中并使用grok的patterns_dir选项。

答案 1 :(得分:5)

成功的时间戳捕获策略包含3件事

  1. 原始日志中的精度和时区。更改您的nginx时间戳日志格式。
  2. 使用$msec来捕获毫秒数。否则你将无法对其进行精确排序。

    log_format custom '[$msec] [$remote_addr] [$remote_user] '
                      '"$request" $status '
                      '"$http_referer" "$http_user_agent"';
    
    1. 原始时间戳。使用贪婪匹配将原始数据捕获到字段中。
    2. 使用GREEDYDATA:

      grok {
        match => { "message" => "\[%{GREEDYDATA:raw_timestamp}\] %{GREEDYDATA:message}" }
        overwrite => [ "message" ]
      }
      
      1. 解析时间戳。使用date过滤器来解析原始时间戳。
      2. reference

        date {
          match => [ "timestamp", "yyyy/MM/dd HH:mm:ss.S z" ]
          target => "@timestamp"
        }
        

答案 2 :(得分:3)

要匹配2015/08/30 05:55:20,请使用:

%{DATESTAMP:mytimestamp}

在Logstash 6.5上测试

来源: https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

答案 3 :(得分:1)

您还可以简单地包含简单和简短的joda.time模式。

date {
  match => [ "timestamp", "yyyy/MM/dd HH:mm:ss" ]
  target => "@timestamp"
}

有用的链接供参考:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html