问题说明
Logstash用的UTC时间, logstash在按每天输出到elasticsearch时,因为时区使用utc,造成每天8:00才创建当天索引,而8:00以前数据则输出到昨天的索引
# 使用logstash写入elasticsearch时的配置
output {
elasticsearch {
id => "logstash-%{+YYYY.MM.dd}"
}
}
logstash和elasticsearch是按照UTC时间的,kibana却是按照正常你所在的时区显示的,是因为kibana中可以配置时区信息。
解决问题
-
添加一个字段
该字段利用logstash的fileter进行生成,由多种方式实现,新生成的字段为
timestamp
如下# ruby 插件实现 ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" } # grok 从日志正则匹配得到 grok { match => {"message"=> "%{TIMESTAMP_ISO8601:timestamp}"} } # date 把日志时间重写为@timestamp #date { # match => ["message", "^\[(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3})"] # target => "@timestamp" # timezone => "+08:00" #}
-
用mutate插件对数据进行转换,提取想要的日期字段
# convert转换为string类型,gsub只处理string类型的数据,在用正则匹配,最终得到想要的日期 mutate { convert => ["timestamp", "string"] gsub => ["timestamp", "T([\S\s]*?)Z", ""] gsub => ["timestamp", "-", "."] }
-
配置output
elasticsearch { hosts => ["localhost:9200"] index => "log-%{timestamp}" }
注意:在使用grok进行正则匹配是,可以使用的方法可以参考这里
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
grok 测试平台
http://grokdebug.herokuapp.com/