Logstash消费Kinesis日志写入ES时出现UTF-8字符编码报错
问题根因
该编码报错和你写入的JSON业务数据无关,是Logstash Kinesis输入插件消费流数据时,会同时读到插件自身持久化在流内的二进制checkpoint元数据,这类内容不是UTF-8编码的文本,触发codec的编码校验报错。
因为二进制元数据解析失败不会中断插件的消费流程,后续正常的业务事件会被正常解析写入Elasticsearch,所以才会出现报错但消息可在Kibana正常查看的现象。
你之前修改plain codec指定UTF-8字符集无效,原因是plain codec默认仍会对读到的全量字节做UTF-8校验,只要读到二进制元数据块就会触发报错,和codec类型无直接关系。
解决方案
- 配置codec容错跳过非法字符
修改kinesis输入段的codec配置,增加非法字符处理规则,遇到非UTF-8字节直接替换不抛出错误,不影响正常业务数据解析:
配置中新增的input { kinesis { kinesis_stream_name => "otelpoc" region => "ap-southeast-2" application_name => "logstash-otelpoc-consumer" codec => json { charset => "UTF-8" invalid_char_handling => "replace" } } } output { elasticsearch { hosts => ["elasticsearch:9200"] index => "otelpoc-logstash-%{+YYYY.MM.dd}" } }application_name用于指定消费组名称,避免多实例消费时checkpoint元数据混读。 - 过滤丢弃异常二进制事件
如果不想修改codec配置,可以新增filter段,将不包含业务字段的异常事件直接丢弃,避免脏数据进入后续处理流程:filter { if ![message] or ![level] { drop {} } } - 规范AWS CLI写入方式(测试场景可选)
部分版本AWS CLI使用file://前缀读取文件时,会按本地系统默认编码读取内容传输,可能引入非UTF-8字节,测试时可先将payload转base64编码后再写入Kinesis:PAYLOAD=$(base64 -i payload.json) aws kinesis put-record --stream-name otelpoc --data $PAYLOAD --partition-key 1
补充说明:该问题和你使用的ELK 6.7.1旧版本无强关联,升级版本不会自动解决该类元数据解析报错。
内容的提问来源于stack exchange,提问作者Ryan.Bartsch
相关产品推荐
相关产品推荐

