logstash 写入数据到elasticsearch 索引相差8小时解决办法

问题说明

Logstash用的UTC时间, logstash在按每天输出到elasticsearch时,因为时区使用utc,造成每天8:00才创建当天索引,而8:00以前数据则输出到昨天的索引

# 使用logstash写入elasticsearch时的配置
output {
  elasticsearch {
    id => "logstash-%{+YYYY.MM.dd}"
  }
}

logstash和elasticsearch是按照UTC时间的,kibana却是按照正常你所在的时区显示的,是因为kibana中可以配置时区信息。

解决问题

  1. 添加一个字段

    该字段利用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"
    #}
    
  2. 用mutate插件对数据进行转换,提取想要的日期字段

    # convert转换为string类型,gsub只处理string类型的数据,在用正则匹配,最终得到想要的日期
    mutate {
         convert => ["timestamp", "string"]
         gsub => ["timestamp", "T([\S\s]*?)Z", ""]
         gsub => ["timestamp", "-", "."]
    }
    
  3. 配置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/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值