之前介绍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网络基础设置

    1.笔记 systenctl restart network:重启网卡网络服务 bash:刷新主机名称 netstat:查看网络状态 route -n:不做地址解析 mii-tool eno16777 ...

  2. VSCode编写C/C++语言,配置文件和注意事项

    前言 主要是自己先下载好VSCode,然后在自己电脑上安装好就行了,但是VSCode是编辑器,不是IDE,所以需要自己配置文件,主要有四个都是以.json结尾的文件,这里默认已经装过C/C++的编辑器 ...

  3. select标签刷新后保持之前选择值

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <selec ...

  4. 第02组 Beta冲刺(1/4)

    队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...

  5. [LeetCode] 79. Word Search 词语搜索

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  6. IDEA 最新破解方法,2019 版本已支持(持续更新,更新时间2019-05-14)

    一.安装进入官网下载适合自己系统的版本,下载地址:https://www.jetbrains.com/idea/download/#section=windows ​ 2. 安装中选择适合本机的64位 ...

  7. Spring事物隔离级别及事物传播行为@Transactional实现

    阅读本篇文章前,请先阅读如下文章: 四种事物隔离级别详解 先看下@Transactional可以配制那些参数及以其所代表的意义. isolation 枚举org.springframework.tra ...

  8. C#应用程序单例并激活程序的窗口 使其显示在最前端

    public class SoftHelper { ///<summary> /// 该函数设置由不同线程产生的窗口的显示状态 /// </summary> /// <p ...

  9. Java8 新特性 Steam() 中间有状态操作

    中间有状态操作 Java8 新特性 Stream 练习实例   中间操作,就是把数据处理成自己想要的类型,并且有状态操作,是在所有的数据基础上进行操作的.比如dictinct(去重),sorted(排 ...

  10. bizcharts 图表内容居中

    当图表内的数据只有一组时,会紧靠在y轴上,如下图: 想要图表的内容居中,解决方法分两种情况. 第一种:如果x轴是日期,则代码设置如下,图表的内容就居中了 const cols = { x: { ali ...