之前介绍filter date插件时就谈到时区问题,但是没有说明白。最近在使用range查询时间范围内的数据时出现了数据量不一致的情况。特地了解了下ELK Stack中关于时区的问题。

问题:

使用kibana discovery界面搜索时,数据量一致。使用curl 搜索时少了数据。

再说时间问题前,简单了解下UTC:

UTC(Universal Time Coordinated) 叫做世界统一时间,中国大陆和 UTC 的时差是 + 8 ,也就是 UTC+8。

UTC时区参考文档

查看官方文档后得到的结论:

ELK Stack集群各服务对时间处理的介绍:

logstash :根据所在机器的时区并对date类型数据进行处理,整理成UTC时间

elastic :所有date类型数据都存储为GMT(毫秒级)

kibana :根据kibana配置的时区,从elastic取出的timestamp时间转换为相应时区的时间。

问题原因:

logstash处理后以UTC时间存储进elastic,kibana取出来后,在恢复成相应时区的时间。因为我机器都是CST的时间,所以使用kibana搜索没有问题,但是curl命令不会对所取出来的时间进行时区转换,所以就少了8小时数据。

解决方法:

一:

logstash 过滤字段信息时,删除或分开匹配时间和时区信息,timestamp只匹配具体时间,timezone则匹配+0800这样的时区信息,并同时定义timezone为UTC,这样从根本上就得到原始的时间。

UTC时间的示例:

$ bin/logstash -f text.conf
[26/Mar/2019:00:00:08 +0800] #这里以nginx日志中的时间为例
{
"timestamp" => "26/Mar/2019:00:00:08",
"message" => "[26/Mar/2019:00:00:08 +0800]",
"@timestamp" => 2019-03-26T00:00:08.000Z, #@timestamp的时间和输入的时间一致
"@version" => "1",
"timezone" => "+0800",
"host" => "node2007"
} $ cat text.conf
input {
stdin {}
}
filter {
grok {
match => {
"message" => "\[%{NOTSPACE:timestamp} %{INT:timezone}\]"
}
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss" ]
timezone => "UTC" #无法从timestamp中提取时区。设置时区为UTC时间,忽略系统时区,如果date插件中的match匹配到了时区,则此处的时区不生效。所以在grok插件中将timezone和timestamp分隔开
}
}
output {
stdout{
codec => rubydebug
}
}

正常时间处理:

$ bin/logstash -f text.conf
[26/Mar/2019:00:00:08 +0800]
{
"@version" => "1",
"@timestamp" => 2019-03-25T16:00:08.000Z, #转换成UTC时间,减少8小时,
"message" => "[26/Mar/2019:00:00:08 +0800]",
"host" => "node2007",
"timestamp" => "26/Mar/2019:00:00:08 +0800"
} $ cat text.conf
input {
stdin {}
}
filter {
grok {
match => {
"message" => "\[%{HTTPDATE:timestamp}\]"
}
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
timezone => "UTC"
}
}
output {
stdout{
codec => rubydebug
}
}

系统日志中不带有时区信息,则可以直接在配置文件中指定timezone => "UTC"即可。无需要做匹配工作。

二:

匹配到时区时间没有关系,可以在过滤时,在把时间补回来。

...
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "time"
}
ruby {
code => "event.set('timestamp', event.get('time').time.localtime + 8*60*60)" #处理时将logstash自动减少的时间在给加回来
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
...

以上代码经过我测试,可以正常使用。这里使用ruby插件,我不懂,time -> timestamp -> @timestamp需要经由两个变量才能最后赋值给@timestamp,为什么不能直接使用@timestamp处理并赋值,如果有懂得的人,还请留言告知。

对时间进行处理后,我们可以使用curl命令随意进行查询啦,但是使用kibana时,还需要设置一下默认的时区: Management -> kibana(高级设置) -> Timezone for date formatting 并选择UTC时间展示。
![](https://img2018.cnblogs.com/blog/1202606/201903/1202606-20190328154358262-1829927564.png)

总结:

ELK Stack一整套组合拳的时区特性特别好用,但是在国内还是统一时区吧。统一时区还是再数据存储前做调整,否则后期查询会流泪的。

elastic date时区问题解决办法的更多相关文章

  1. 苹果ios用js的Date()出现NaN问题解决办法

    原文:苹果ios用js的Date()出现NaN问题解决办法 ios使用如下方法获得NaN,安卓手机则是正常计算,解决方法是换个这个时间的格式 new Date("2017-04-28 23: ...

  2. CefSharp 提示 flash player is out of date 运行此插件 等问题解决办法

    CefSharp 提示 flash player is out of date 或者 需要手动右键点 运行此插件 脚本 等问题解决办法 因为中国版FlashPlayer变得Ad模式之后,只好用旧版本的 ...

  3. Windows XP系统下添加任务计划常出现问题解决办法

    Windows XP系统下添加任务计划常出现问题解决办法 计划任务就是让电脑在指定的时间内执行指定的动作(计划动作),这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的(通俗一些就是双击 ...

  4. Open Sans字体兼容问题解决办法[font-face]

    参考:http://www.tantengvip.com/2014/11/open-sans/ 1.font-face使用方法 font-face是CSS3中的一个模块,主要是把自定义的Web字体嵌入 ...

  5. ASP+Access UTF-8 网页乱码问题解决办法

    用ACCESS数据库和ASP做网站时用UTF-8编码有时会出现乱码,再者网页出错或者刷新页面后就是乱码,如果数据库取值乱码在开头加上<%@LANGUAGE="VBSCRIPT" ...

  6. 易通电脑锁2007V6.3.3.3无法卸载问题解决办法

    易通电脑锁2007V6.3.3.3无法卸载问题解决办法把原版文件拷贝回去.bat@echo offcolor 2Fecho 该批处理会把易通电脑锁2007版原文件拷贝回去,解决易通电脑锁卸载时出现的运 ...

  7. Sublime Text 3 若干问题解决办法

    1.在高分屏下中文文件夹名显示异常问题解决办法 新买了个2K的屏,有些中文文件夹名全部变成了“口口”. 在“preferences” - "设置-用户" 添加 "dpi_ ...

  8. C盘不能新建文件的问题解决办法

    C盘不能新建文件的问题解决办法 主要症状: 1.C 盘文件不能修改2.C 盘不能新建文件3.总之就是只能读取不能,写入和修改这样对于平时操作造成了极其的不方便~~~复制文件到C 盘会提示:错误0×80 ...

  9. iOS常见异常Exec_Bad_Access问题解决办法

    iOS常见异常Exec_Bad_Access问题解决办法     在iOS开发中,经常遇到Exec_Bad_Access异常,导致程序奔溃问题,一般这个问题都是因为过早的release对象,然后又对该 ...

随机推荐

  1. Linux性能优化实战学习笔记:第三十讲

    一.性能指标 二.文件系统I/O性能指标 1.存储空间的使用情况 文件系统向外展示的空间使用,而非磁盘空间的真是用量,因为文件系统的元数据也会占用磁盘空间 2.索引节点的使用情况 如果存储过多的小文件 ...

  2. [LeetCode] 24. Swap Nodes in Pairs 成对交换节点

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  3. [Powershell]发布基于.NET Framework的WebAPI和Job控制台程序项目

    获取要发布的定时计划任务. 禁用和停止定时计划任务. 批量强制结束Job进程. 打印定时计划任务状态. 备份项目文件夹. 发布项目文件夹. 删除部署包. 启用定时计划任务. <# .NOTES ...

  4. 【08月02日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年08月02日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2019年08月02日市盈率在300以下的公司. 1 - XD栖霞建(SH600533) - 历 ...

  5. Loj #3045. 「ZJOI2019」开关

    Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...

  6. odoo action

    动作的加载: 刷新视图页面执行load_views方法 /web/dataset/call_kw/model_name/load_views 在odoo/models.py的BaseModel中有一个 ...

  7. 如何解决github/amazonaws访问不了的问题

    原文链接: https://www.clclcl.fun/2019/12/12/github-blocked/ 如何解决github/amazonaws访问不了的问题 缘起: github.githu ...

  8. VUE的$refs和$el的使用

    ref 被用来给元素或子组件注册引用信息 ref 有三种用法: 1.ref 加在普通的元素上,用this.$refs.(ref值) 获取到的是dom元素 2.ref 加在子组件上,用this.$ref ...

  9. forever帮助node应用后台运行

    windows系统下,运行node应用的时候,会有个命令窗存在,看着就碍眼,而且一不小心就关掉了,那有没有方法让node应用也可以运行在后台呢?方法也不止一种,我这里就选forever了,因为安装使用 ...

  10. Sentry异常捕获平台

    本文包括Sentry平台的介绍,以及环境搭建两部分,更多细节请查阅官方文档. 简介 Sentry是一个实时事件的日志聚合平台.它专门监测错误并提取所有有用信息用于分析,不再麻烦地依赖用户反馈来定位问题 ...