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

Is there any existing grok{} pattern for date format YYYY/MM/DD HH:mm:ss?

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

2015/08/30 05:55:20

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

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

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

没有。您在 github 上找到 included patternsdatestamp 的评论似乎适合您的 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 选项。

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

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

有帮助link供参考:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

成功的时间戳捕获策略由 3 件事组成

  1. 原始日志中的精度和时区。更改您的 nginx 时间戳日志格式。

使用$msec捕捉毫秒。否则无法准确排序。

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

使用 GREEDYDATA:

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

reference

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

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

%{DATESTAMP:mytimestamp}

在 Logstash 6.5 上测试

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