Elasticsearch的时区问题

首先

使用Logstash将数据存入Elasticsearch时,您是否遇到过索引与时间相差9小时的问题?我将作为备忘录写下跟数据时间相匹配的方法。

利用版本

Elasticsearch 6.6.1
Logstash 6.6.1

Elasticsearch 6.6.1和Logstash 6.6.1

时区问题是指不同地区在时间计算上存在差异的情况。

image.png

主要的困扰点有以下两点:
① 当使用Alerting(旧称Watcher)在指定时间范围内发送警报时,需要编写查询并减去9个小时。
② 当将索引名称设置为YYYY.MM.dd时,索引会在第二天上午9点切换,导致时间出现偏差。
* 当使用Curator备份/删除索引时,时间偏差会导致运营变得复杂。

output {
  elasticsearch {
    hosts => [ "ElasticsearchのIPアドレス:9200" ]
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

解决方案

如果使用logstash的ruby filter,就能够解决这个问题。似乎Elastic公司的立场是,ruby filter是在其他filter无法解决问题时的最后手段。它被广泛应用的场景也很多,呵呵。

【参考】
– Ruby 过滤插件
– 将自定义的 Ruby 代码从 Logstash 管道中移出

通过使用过滤句中的ruby过滤器在日本时区获取时间,并利用输出句来避免在Elasticsearch索引名称中使用,这样做是可行的。

filter {
  ruby {
    code => "event.set('[@metadata][local_time]',event.get('[@timestamp]').time.localtime.strftime('%Y-%m-%d'))"
  }
}

output {
  elasticsearch {
    hosts => [ "ElasticsearchのIPアドレス:9200" ]
    index => "logstash-%{[@metadata][local_time]}"
  }
}
    • ruby filterのevent.setで(field,value)を作成しています。(rubyのputs的な処理)

 

    • field nameは[@metadata][local_time]としていますが、[@metadata]を付与することでElasticsearchにIndexingされないfieldにすることができます。

 

    • ruby filterのevent.getで[@timestamp]のfield nameを指定して、現時刻情報を拾っています。

.time.localtimeで[@timestamp]で取得した時刻をローカル時刻に変換しています。

.strftime(‘%Y-%m-%d’)で取得した時刻を文字列に変換しています。

【参考】
・事件 API
・Ruby 的本地时间(时间类)
・Ruby 的格式化时间字符串(从时间中)

概括

虽然有点土气,但也许意想不到地会很有用呢^^

广告
将在 10 秒后关闭
bannerAds