我正在检查服务器上的nginx错误日志,发现它们的日期格式为:
2015/08/30 05:55:20
即。 YYYY/MM/DD HH:mm:ss
。我试图找到一个现有的grok日期模式,这可能有助于我快速解析,但遗憾的是找不到任何这样的日期格式。最终,我不得不把模式写成:
%{YEAR}/%{MONTHNUM}/%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
我仍然希望相同的模式是否更短?
答案 0 :(得分:6)
没有。你在github上找到了included patterns。对datestamp
的评论似乎与您的YYYY / MM / DD相符,但DATE_US
和DATE_EU
不同。
我建议使用grok选项patterns_dir重载DATE
模式并使用DATESTAMP
。
DATE_YMD %{YEAR}/%{MONTHNUM}/%{MONTHDAY}
DATE %{DATE_US}|%{DATE_EU}|%{DATE_YMD}
或者只是将您的模式添加到模式文件中并使用grok的patterns_dir选项。
答案 1 :(得分:5)
成功的时间戳捕获策略包含3件事
使用$msec
来捕获毫秒数。否则你将无法对其进行精确排序。
log_format custom '[$msec] [$remote_addr] [$remote_user] '
'"$request" $status '
'"$http_referer" "$http_user_agent"';
使用GREEDYDATA:
grok {
match => { "message" => "\[%{GREEDYDATA:raw_timestamp}\] %{GREEDYDATA:message}" }
overwrite => [ "message" ]
}
date
过滤器来解析原始时间戳。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