logstash timestamp时间差8小时问题及解决

本文介绍了一种在Logstash配置中解决时间戳偏差的方法,通过调整时间偏移确保@timestamp字段与服务器时间一致,从而避免影响文件命名及后续流程。

最近在测试使用logstash将数据从redis同步到es,并且按小时生成文本,但是在使用中发现logstash中的时间与服务器时间差8小时,导致@timestamp字段中的时间不对,并且生成文本名字中的时间不对,影响后续流程处理,logstash版本6.3.2,解决方式如下,不需要修改源码:

input { 
	redis { 
		host => "127.0.0.1"
		port => "6379"
		password => "password"
		db => 0
		key => "key_test"            #队列名称
		data_type => "list"          #队列类型
		threads => 1
	}
}
filter {
	ruby { 
		code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" 
	}
	ruby {
		code => "event.set('@timestamp',event.get('timestamp'))"
	}
	mutate {
		remove_field => ["timestamp"]
	}
}
output {
	elasticsearch {
		hosts => ["127.0.0.1:9200"]
		action => index
		index => "index_test"              #es中的索引名称
		document_id => "%{id}"             #以数据中的哪个字段做es中的_id
		document_type => "type_test"       #es中的mapping名称
		codec => json_lines
	}
	file {
        path => "/root/data/%{+yyyyMMddHH}.txt"
    }
}

logstash生成文件名中的日期是从@timestamp字段的值中获取,通过设置filter将timestamp中的时间转换成系统时间,问题解决。

### 解决 Elasticsearch 时间与时区差异的方法 Elasticsearch 和 Kibana 的时间显示问题通常源于同组件之间的时区设置一致。以下是针对该问题的具体解决方案: #### 方法一:调整 Logstash 配置 如果使用 Logstash数据写入 Elasticsearch,则可以在 Logstash 的配置文件中指定 `timezone` 参数,确保时间字段被正确解析并转换为 UTC 时区。 ```ruby filter { date { match => ["timestamp", "yyyy-MM-dd HH:mm:ss"] target => "@timestamp" timezone => "+08:00" # 设置为中国标准时间 (CST),即东八区 } } ``` 通过上述方式可以确保 Logstash 处理数据时间字段统一为 UTC 或者目标时区[^4]。 --- #### 方法二:修改 Kibana 的日期格式化设置 由于 Kibana 默认会根据用户的浏览器时区来展示时间,因此可以通过更改 Kibana 的高级设置 (`Advanced Settings`) 来强制其使用特定的时区(如 UTC)。具体操作如下: 1. 登录 Kibana 并导航至 **Management -> Advanced Settings**。 2. 找到参数 `dateFormat:tz` 并将其值更改为 `"UTC"` 或其他所需的时区字符串(例如 `"Asia/Shanghai"` 表示中国标准时间)。 3. 保存设置后刷新页面即可生效。 此方法适用于希望在前端层面解决问题改变底层存储逻辑的需求场景[^3]。 --- #### 方法三:直接在 Elasticsearch 中定义索引模板 为了使新创建的文档自动携带正确的时区信息,在建立索引之前可预先定义好映射规则,并明确指出相关字段应采用何种格式及时区表示法。例如: ```json PUT _template/my_template { "index_patterns": ["my_index_*"], "mappings": { "properties": { "custom_time_field": { "type": "date", "format": "strict_date_optional_time||epoch_millis", "ignore_malformed": false, "doc_values": true } } }, "settings": { "number_of_shards": 1, "number_of_replicas": 1 } } ``` 注意此处并未显式涉及任何具体的时区偏移量;这是因为推荐的做法是在应用程序层面上完成必要的转换后再提交给 ES 存储[^1]。 --- #### 方法四:利用 Ruby 插件修正时间戳 对于某些特殊情况下无法单纯依赖配置项达成目的的情形下,还可以考虑借助自定义脚本来动态调整每条记录中的时间属性值大小。比如下面这段代码片段展示了如何增加固定秒数从而补偿跨区域带来的偏差效果: ```ruby filter { ruby { code => " event.set('adjusted_time', event.get('@timestamp').time.localtime + Rational(8,24)) " } } ``` 过需要注意的是这种方法可能会引入额外计算开销以及潜在一致性风险等问题,因而仅作为备选方案存在[^4]。 --- 以上四种途径均可有效应对由时区差异引发的各种异常状况,请依据实际情况选取最合适的策略实施优化改进工作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值