logstash数据写入es后,通过kibana查看的UTC时区问题

问题:

  • 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的查询会完全乱掉,所以放弃掉
  #将业务字段的时间转换为timestamp,由于logstash默认@timestamp为utc,需要转换为utc+8
  # date固定语法,提供指定字段的时间格式与时区转换为@timestamp,@timestamp会生成一个相同时间的utc时间(比上海时间晚8小时)
  date {
    match => [ "req_time", "yyyy/MM/dd HH:mm:ss" ]
    timezone => "Asia/Shanghai"
    target => "@timestamp"
   }
  # 获取到utc时间后,通过ruby脚本,将@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的生成
  # 此处的时间匹配和根据自己的时间格式进行匹配,具体patterns可参考[官方地址](https://github.com/logstash-plugins/logstash-patterns-core/blob/main/patterns/ecs-v1/grok-patterns)
  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" ] #中间字段用完就删除
  }
  • 三、实际使用:在完成上两步后,可达到两个效果:
    1. discover正常展示,且@timestamp与真实实际展示相同在这里插入图片描述
    2. discover查询时,可以支持两种方式的查询,1、utc时间,与req_time一致(时区不一致),2,时间戳,需要是req_time+8的时间戳
      在这里插入图片描述
  1. ES查询,正常展示,查询条件@timestamp可使用req_time对应的时间戳(Asia/Shanghai)或req_time+8的时间戳

这个方案算是个妥协的方案,最终是以@timestamp作为时间来查询了,如果有更好的方案,可以分享一下,学习一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值