logstash时间戳差8个小时

发布 : 2018-12-20 分类 : issue 浏览 :

问题说明

原始配置:


elasticsearch {
# manage_template => false
template_overwrite => true
template => "/opt/export/app/logstash-6.4.2/bin/dynamic_templates.json"
user => xxxxxxx
password => xxxxxxx
index => "%{sys_name}-%{+YYYY.MM.dd}"
hosts => ["172.19.3.51:9200","172.19.3.52:9200"]
}

在使用logstash输出内容要es中时, 指定index为系统名称+时间(年月日), 时间会自动匹配‘@timestamp’字段并格式化, 但是在实际使用过程中, 发现在上午八点之前的消息会被创建到昨天的索引里面.查阅相关资料, 有介绍在时间戳上面增加8个小时的方式, 也可以使用. 这里结合自己业务使用的其他方式.

解决方案

  1. 主要报送内容为filebeat的日志信息, 日志统一有时间戳, 格式如下:

    [trans-mediapay]-[2018-12-19 02:00:00:187]-[queryThreadPool-14]-[]-[WeBankServiceImpl.java:101]-[INFO ]-[测试2点的日志]
    
  2. 解析时间戳的时间

    1. 先匹配整体日志, 获取’log_time’字段
    2. 匹配’log_time’字段
    3. 生成元数据 ‘[@metadata][index_suffix]’
      filter {

      # 日志聚合使用全量配置
      grok {
      match => {
      "message" => "\[%{DATA:sys_name}\]-\[%{DATA:log_time}\]-\[%{DATA:thread_name}\]-\[%{DATA:trace_id}\]-\[%{DATA:class_name}\]-\[%{DATA:log_level}\]-%{GREEDYDATA:log_msg}"
      }
      }
      grok{
      match => { "log_time" => ["%{INT:index_year}-%{INT:index_mouth}-%{INT:index_day}"]}
      }
      mutate {
      # 使用元数据 [@metadata][index_suffix]
      add_field => { "[@metadata][index_suffix]" => "%{index_year}.%{index_mouth}.%{index_day}" }
      remove_field => ["host","beat","tags","[beat][name]","[beat][version]","prospector","@version","offset","input","y_index","M_index","d_index"]
      }

      }
  3. 输出时使用元数据, 该字段不会出现在es的字段中

    elasticsearch {
    # manage_template => false
    template_overwrite => true
    template => "/opt/export/app/logstash-6.4.2/bin/dynamic_templates.json"
    user => xxxxxxx
    password => xxxxxxx
    index => "%{sys_name}-%{[@metadata][index_suffix]}"
    hosts => ["xxxx:9200","xxxx:9200"]
    }

本文作者 : liuzhihang
原文链接 : https://liuzhihang.com/2018/12/20/logstash-timestamp-difference-8-hours.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW