Logstash JDBC输入插件同步ES时时间偏移问题及修正咨询
你遇到的这个问题其实是时区转换的正常表现——Elasticsearch默认以UTC时区存储和展示时间,而你的MySQL里的create_time是上海时区(UTC+8)的时间,所以16:27的上海时间转成UTC自然就是08:27。不过我们可以通过两种简单的方式让时间显示符合你的预期,或者调整存储的时间格式:
方案1:在Kibana中设置默认时区(最省心的方式)
如果只是希望在查询展示时看到上海时区的时间,完全不需要修改Logstash配置,直接在Kibana里调整全局时区设置就行:
- 进入Kibana的「管理 > 高级设置」(Management > Advanced Settings)
- 找到
dateFormat:tz这个选项,把它的值改成Asia/Shanghai - 之后Kibana里展示的所有时间字段都会自动转换为上海时区,ES底层存储的UTC时间其实是正确的,只是在显示层面做了转换,不影响数据准确性
方案2:在Logstash中添加Filter处理时间字段
如果你希望ES中存储的create_time字段直接带有上海时区的偏移(比如2018-01-12T16:27:59+08:00),或者想确保字段被正确解析为上海时区的时间对象,可以给Logstash加上filter块,用date插件处理:
修改你的Logstash配置,加入以下内容:
filter { date { match => ["create_time", "yyyy-MM-dd HH:mm:ss"] timezone => "Asia/Shanghai" target => "create_time" # 这里可以选择覆盖原字段,或者指定新字段比如@timestamp } }
这个配置会告诉Logstash:按照上海时区来解析create_time字段的字符串,把它转换成标准的带时区偏移的时间格式后再输出到ES。这样ES识别为date类型后,存储的时间戳是准确的,同时查看原始文档时能直接看到带+8偏移的时间字符串。
另外,建议检查你的ES索引映射,确保create_time字段被正确映射为date类型。如果是自动创建的索引,ES通常会自动识别,但如果有自定义映射,参考下面的格式:
{ "mappings": { "properties": { "create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSSZ||epoch_millis" } } } }
补充说明
你当前配置里的jdbc_default_timezone => "Asia/Shanghai"是完全正确的,这一步确保了Logstash从MySQL读取时间时使用上海时区,不会出现读取阶段的时区偏差。问题的核心就是ES默认以UTC展示时间,所以通过上面两种方式就能轻松解决你的需求。
内容的提问来源于stack exchange,提问作者chaos

