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}
#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}
s*(?:use %{DATA:database};s*
)?SETs+timestamp=%{NUMBER:timestamp};
s*(?<sql>(?<action>w+).*;)s*(?:
#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}"
      }
   }
}

参考文档

原文地址:https://www.cnblogs.com/98record/p/elk-shi-jian-chuo.html