Elasticsearch的时区问题
首先
使用Logstash将数据存入Elasticsearch时,您是否遇到过索引与时间相差9小时的问题?我将作为备忘录写下跟数据时间相匹配的方法。
利用版本
Elasticsearch 6.6.1
Logstash 6.6.1
Elasticsearch 6.6.1和Logstash 6.6.1
时区问题是指不同地区在时间计算上存在差异的情况。
主要的困扰点有以下两点:
① 当使用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 的格式化时间字符串(从时间中)
概括
虽然有点土气,但也许意想不到地会很有用呢^^