logstash/ES 时区问题

2018-02-01 22:04:54 +08:00
 Weixiao0725

我用 logstash 索引日志到 es 中,从日志中 grok 某个字段出来赋值给 @timestamp,然后存到 Es 中以后就少了 8 个小时,我知道只是因为 ES 存储统一用的 UTC 格式,网上建议说不要在 logstash -> es 过程中强制指定 timezone => "+00:00",因为 Kibana 会自动根据浏览器进行更改。

但是,我的数据存到 ES 以后,我是用 java/python 写代码去查,这样的话我不知道代码中的时间是否要我自己转成 utc 的时间去 ES 里查,还是说直接传东八区给 ES,es 会进行转换。

比如,es 中现在存的是 utc 时间 9 点,那么中国时间肯定是 17 点了,那么如果我写代码去查询 Es 的话,代码中我是要传 17 点还是( 17-8)点去查询?

现在我不知道,这个时区在哪里转换比较合适,谢谢大家哦~

10007 次点击
所在节点    Elasticsearch
6 条回复
Philippa
2018-02-01 22:55:30 +08:00
在服务器上,代码里全部统一使用 utc 时间。假如你用于开发的电脑不是 utc 那就改成 utc。Python 的 datetime 无论时 utc 还是不设 utc 都是返回数值但在 datetime 对象里不包含时区信息的,因此你需要手动配合 pytz 库加一个时区进去,或者在字符串结尾加 Z 和标注时区方式再转为 Python 对象。

这样到了 Elasticsearch 就会按照你的时区进行识别,否则默认是 utc,那样你会发现载入数据后慢了 8 小时。
billlee
2018-02-01 22:56:41 +08:00
程序访问的话,最好把时间格式统一成 epoch_millis 或 strict_date_time.
scriptB0y
2018-02-01 23:01:43 +08:00
17-8,从这里 https://logstash.jira.com/browse/LOGSTASH-973 看 logstash 是存储 UTC 时间的,这样我们写起脚本来更加准确和方便,因为心中很明确 ES 里面的时间必定是 UTC 时间。

准确来说应该是:时间在 ES 中是 UTC 表示,实际以时间戳存储,查询应该以 UTC 为准,但是 PUT 如果带上时区,ES 会处理并最终以时间戳存储。参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
igaoliang
2018-02-02 09:30:47 +08:00
时区信息是前段根据当地时区自己转换的,例如 elk 技术栈中。kibana 负责展现 es 中的搜索结果,那么时区问题就是 kibana 自己转换的。
wklken
2018-02-02 09:50:43 +08:00
es/logstash/前端等都不动, 查询代码还是用 17:00, 多指定一个 timezone 就行

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/search-aggregations-bucket-datehistogram-aggregation.html#_time_zone



```
"format": "yyyy-MM-dd HH:mm:SS",
"time_zone": "+08:00"
```

某些场景直接使用相对时间

```
"@timestamp": {
"gt": "now-1h"
}
```
Weixiao0725
2018-02-02 10:55:18 +08:00
@wklken thank you bro

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/427840

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX