Logstash 时区问题导至数据被写进错误的 ES 索引的解决方法

Python023

Logstash 时区问题导至数据被写进错误的 ES 索引的解决方法,第1张

在上篇: .NET 的 ELK 监控方案 里, 我们将 Logstash 的配置节点 output 这样写:

logstash 会自动从数据中找到 i 这个字段, 并结合 @timestamp 来指定这条数据到要写到哪个 index 下面去.

如果配置中没有指定 @timestamp 从哪里取值, logstash 会默认把第一次读到取这条数据时间做为 @timestamp .

但是请注意, logstash 使用的是 UTC 时间. 这个地方将会引发标题所描述的问题.

比如, 当前时间是 2018-08-17T00:29:59.618+08:00 , 转换为 UTC 时间就成了 2018-08-16T16:29:59.618Z

Logstash 把这个 UTC 时间用来确定数据该存到哪个 Index 里面, 这就导至了 本来是 8月17日的数据, 却被写到 8月16 日的索引下面去了.

如果只是用 Kibana 做为可视化工具, 问题不大.

但是我们每天大概能收集到 100G的日志, 搜索条件多样化 , 在加上对语法不熟悉, Kibana 已经不能给我们提供便捷的使用体验了.

但是对自制的查询工具而言, 又不能跨 index 查询(有重复的日志), 所以这个问题被无限放大了.

要解决这个问题, 又不能作大规模的改动, 最好的办法就是看有什么方法把 @timestamp 用中国时间来表示.

从百度上找了两篇文章, 说用 date filter 来修改时区, 但是写到 es 里的 @timestamp 依然是 UTC 时间, 估计也是行不通, 就没有继续在上面尝试.

和之前的配置比起来, 这个新配置多了一个节点: filter

用 ruby 脚本把事件的 timestamp 的本地时间赋值给 index_day (这个 index_day 并不存在于原始的日志数据中),

然后在 output 节点的 index 中使用这个 index_day. 这样一来每天8点之前的日志就会写到正确的 index 中了.

不过, 每天结束的那几分钟产生的日志有可能会被写到下一天的索引里去..

TimeZone 配置参见 Date Filter , logstash 将日志北京时间保存成utc

Filter Ruby 参见, Logstash Filter Ruby , 不要问我, 我也不会

Output elashtic Index 配置参见 Elasticsearch output plugin

歌手资料--卢春如

性别:

出生:12-27

地区:N/A

类型:

星座:山羊座

介绍

学历:加拿大卑诗省科技学院大众传播系(BCIT)兴趣:唱歌、电影、听音乐专长:唱歌、电影制作、广告设计未来的希望:希望能够当导演拍电影和主持节目演艺经历1.戏剧:◎国中:舞台歌剧-"TheWeepingadonna","Makin''It"◎高中:舞台剧-"David&Lisa","Fame!"…..etc.和一些小型戏剧表演2.歌唱:国中和高中得过各种大小不同的歌唱奖-1996年新年歌唱比赛优胜奖1996年加侨协会主办海华新春联欢晚会表演嘉宾1996年自由党温哥华区庆祝晚会特别来宾1998年第二届中文新秀歌唱大赛温哥华擂台赛优胜奖1998年第二届中文新秀歌唱大赛温哥华比赛最佳台风奖1998年第二届中文新秀歌唱大赛温哥华比赛亚军,并代表温哥华去多伦多参加全加拿大新秀大赛,代表歌曲是 张惠妹的"BadBoy"和WhitneyHouston的"Ibelieveinyouandme"….等等1998年温哥华百万行(WalkwiththeDragon)表演嘉宾3.电视:客串主持温哥华新时代电视节目-"流行音乐时区"(广东话)客串主持温哥华城巿电视节目-"城巿妙听闻"(国语)4.电台:◎客串主持加拿大中文电台节目-"茶包理论"三集Ruby卢春如,9岁时就离开了台湾移民到加拿大,去年年初刚从加拿大回台湾定居。毕业于加拿大一所科技学院的大众传播系的她对唱歌有极大的兴趣。经过长时间的筹备,她终于在去年年底推出她第一张个人专辑《我不是她》。