问题:
- ES @timestamp字段默认是utc时区,不可更正
- Logstash output中根据日期生成index
xxx_log-{+YYYY.MM.DD}
是根据@timestamp的日期来的,如果不进行处理的话,会导致索引晚生成8小时,丢失8小时数据 - kibana展示时,可能会出现强行转换@timestamp时间的情况,原因:kibana展示时是按照浏览器的时区来的
直接查看最终解决版本
解决方案–试错版:
- ES@timestamp时区问题:一般来说都会有自己的时间字段,我的方案是:放弃掉@timestamp字段,用自己的时间字段,@timestamp只用来做index生成和kibana展示
- logstash生成index解决方案: 这个方案确实可以将@timestamp的时间与req_time保持一致,但存在一个问题就是kibana和es的查询会完全乱掉,所以放弃掉
date {
match => [ "req_time", "yyyy/MM/dd HH:mm:ss" ]
timezone => "Asia/Shanghai"
target => "@timestamp"
}
ruby {
code => "event.set('t_time', event.get('@timestamp').time.localtime + 8*60*60); event.set('@timestamp', event.get('t_time'))"
}
kibana @timestamp被修改时区问题,由于我上述将@timestamp进行了+8,则在kibana展示时,需要将时区从浏览器时区修改为UTC时区 这个改动会影响到X-pack的监控和kibana其他的功能,不建议这样改,且在discover也会完全乱掉..
最终妥协版
- 一、保留logstash中的
@timestamp
,但不做+8操作,延用UTC时间,原因:kibana整个系统的默认时区为浏览器时区,如果修改掉,则会导致所有功能都乱掉,得不偿失。且,如果@timestamp
为UTC时间,经过kibana处理后,与原时间字段req_time
一致
date {
match => [ "req_time", "yyyy/MM/dd HH:mm:ss" ]
timezone => "Asia/Shanghai"
target => "@timestamp"
}
- 二、修改动态索引依赖的字段,由于第一步不在对
@timestamp
进行+8后,会出现索引直到第二天8点才能生成的情况,因此需要中间字段,来负责Index的生成
grok {
match => { "req_time" => "%{YEAR:year}/%{MONTHNUM:month}/%{MONTHDAY:day} %{HOUR:hour}:%{MINUTE:minute}:%{SECOND:second}" }
add_field => {
"[date]" => "%{year}-%{month}-%{day}"
}
remove_field => [ "year", "month", "day", "hour", "minute", "second" ]
}
- 三、实际使用:在完成上两步后,可达到两个效果:
- discover正常展示,且@timestamp与真实实际展示相同

- discover查询时,可以支持两种方式的查询,1、utc时间,与req_time一致(时区不一致),2,时间戳,需要是req_time+8的时间戳

- ES查询,正常展示,查询条件@timestamp可使用req_time对应的时间戳(Asia/Shanghai)或req_time+8的时间戳
这个方案算是个妥协的方案,最终是以@timestamp作为时间来查询了,如果有更好的方案,可以分享一下,学习一下