You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:39:19