ELK时间戳
ELK时间戳
在我们使用ELK过程中,总会遇到时间戳的问题。首先
logstash
如果没有加以处理的话,那么它默认使用的是采集的时间戳,然后存入ES
。那么这样的话时间显示的是错误的,再接着因ES
默认使用的是UTC时间,那么我们在看数据的时候,看到的时间与实际的时间也是慢8小时的,但Kibana
默认使用的是你浏览器的时区,所以这一块问题不是很大,如果在你logstash
时间处理是正常的情况下,kibana
看的时候发现时间不正常的话,那么我们只需在web界面修改一下时区即可达到时间正确的目的。接下来我就logstash
时间问题来看一下相关配置。
例子,我就拿我前几天部署的mysql慢日志来做例子吧,yaml
文件如下:
input {
redis {
host => "10.228.81.51"
port => 6379
password => "123456"
db => "1"
data_type => "list"
key => "mysqllog"
}
}
filter {
json {
source => "message"
}
grok {
match => [ "message" , "(?m)^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+(?:(?<clienthost>\S*) )?\[(?:%{IPV4:clientip})?\]\s+Id:\s+%{NUMBER:row_id:int}\n#\s+Query_time:\s+%{NUMBER:query_time:float}\s+Lock_time:\s+%{NUMBER:lock_time:float}\s+Rows_sent:\s+%{NUMBER:rows_sent:int}\s+Rows_examined:\s+%{NUMBER:rows_examined:int}\n\s*(?:use %{DATA:database};\s*\n)?SET\s+timestamp=%{NUMBER:timestamp};\n\s*(?<sql>(?<action>\w+)\b.*;)\s*(?:\n#\s+Time)?.*$" ]
}
date { # 将日志的 timestamp 时间字段,转成UNIX格式后,并赋值给默认的时间戳
locale => "en"
match => ["timestamp","UNIX"]
target => "@timestamp"
}
ruby { ##设置一个自定义字段'timecode'[这个字段可自定义],将默认时间戳中的值加8小时后并重新赋值给 timecode
code => "event.set('timecode', event.get('@timestamp').time.localtime + 8*3600)"
}
#ruby {#设置一个自定义字段 'time' 字段,然后将上一步自定义 ‘timecode’ 时间字段中的值重新赋给 time 自定义字段
# 因生成环境需要,所我不需要将默认时间戳加八小时
# 如果需要es展示的就是加八小时的时间戳的话,那么可以直接将 date 字段中的内容注释掉,然后打开这一块内容。并将 'time' 字段修改成 '@timestamp' 字段。那么logstash所看到的时间戳则是 加八小时后的时间
# code => "event.set('time',event.get('timecode'))"
#}
# mutate {
# remove_field => ["timecode"]
# }
}
output {
#stdout {
# codec => rubydebug
#}
if [tags][0] == "mysql-slow-log" {
elasticsearch {
hosts => ["10.228.81.51:9200"]
index => "%{[tags][0]}-%{+YYYY.MM.dd}"
}
}
}