1、直接在配置文件中自定义的时间格式
这是tomcat配置文件中的一段日志时间配置,按照这样的配置,那么输出的日志是这样子的:
"timestamp" : "2019-12-11 10:11:12 +0800"
然后你继续在logstash中这样子配置
date {
match=> [ "timestamp", "yyyy-MM-dd HH:mm:ss Z"]
target=> "@timastamp"}
此时logstash就不会报"_dateparsefailed"错误了。
这种形式在nginx、apache等web服务器中配置是最好的,也比较方便分析。
2、第二种,带有中括号的
[07/Feb/2018:16:24:19 +0800]
那么在grok插件中这样子定义就行:
\[%{HTTPDATE:timestamp}\]
date插件可以直接转换,如下:
date {
match=> ["timestamp","dd/MM/yyy:HH:mm:ss Z"]
target => "@timastamp"
}
3、ISO8601形式1
在日志文件中原生日志是这个样子的
2019-03-19 13:08:07.782
重点是后面的”.782“,后面附加以毫秒为单位的。
那么grok插件中可以这样子定义匹配的规则:
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_create_time}" }
}
date插件这样匹配
date {
match=> [ "log_create_time", "MMM d HH:mm:ss", "MMM DD HH:mm:ss", "ISO8601"]
target=> "@timestamp"}
或者这样,推荐使用这个,更加简介
date {
match=> [ "log_create_time", "yyyy-MM-dd HH:mm:ss.SSS"]
target=> "@timestamp"}
4、ISO8601形式2
时间 date 中带 T,日志原文如下:
2019-12-11T17:06:33 +08:00
此时, grok 可以这样写:
grok {
match=> { "message" => "%{TIMESTAMP_ISO8601}:log_create_time"}
}
而 date 插件 转存到 @timestamp 中可以这样匹配:
date {
match=> [ "log_create_time", "yyyy-MM-dd'T'HH:mm:ss ZZ"]
target=> "@timestamp"}
也可以用更简洁的写法:
date {
match=> [ "log_create_time", "ISO8601"]
target=> "@timestamp"}
4、Unix时间戳形式
典型的如 MySQL 的慢查询日志,日志原文:
# Time: 2019-12-11T01:50:21.123793Z //舍弃这个时间
# User@Host: root[root] @ elk-master01 Id: 4# Quert Time:4.650893 Lock time: 0.000000 Rows_sent: 1 Rows_examined: 0SET timestamp=1554342621; //需要的是这个
selecet sleep(4.65);
在 grok 中这样匹配:
%{NUMBER:timestamp_mysql_slowquery}
在 date 插件中这样匹配:
date {
match=> [ "timestamp_mysql_slow_query", "UNIX"]
target=> "@timestamp"}