我用 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)点去查询?
现在我不知道,这个时区在哪里转换比较合适,谢谢大家哦~
1
Philippa 2018-02-01 22:55:30 +08:00 1
在服务器上,代码里全部统一使用 utc 时间。假如你用于开发的电脑不是 utc 那就改成 utc。Python 的 datetime 无论时 utc 还是不设 utc 都是返回数值但在 datetime 对象里不包含时区信息的,因此你需要手动配合 pytz 库加一个时区进去,或者在字符串结尾加 Z 和标注时区方式再转为 Python 对象。
这样到了 Elasticsearch 就会按照你的时区进行识别,否则默认是 utc,那样你会发现载入数据后慢了 8 小时。 |
2
billlee 2018-02-01 22:56:41 +08:00
程序访问的话,最好把时间格式统一成 epoch_millis 或 strict_date_time.
|
3
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 |
4
igaoliang 2018-02-02 09:30:47 +08:00
时区信息是前段根据当地时区自己转换的,例如 elk 技术栈中。kibana 负责展现 es 中的搜索结果,那么时区问题就是 kibana 自己转换的。
|
5
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" } ``` |
6
Weixiao0725 OP @wklken thank you bro
|