Fluent-bit传输NestJS日志到ES报failed to flush chunk错误
问题原因
这个报错是ES批量写入部分失败导致的,不是全量写入失败:
- Fluent-bit按批次把日志发给ES时,只要批次里有1条日志写入失败,ES就会返回
errors:true标记 - 你贴的报错里ES返回的JSON被截断了,所有显示出来的条目都是201写入成功,失败的那条在截断的内容里
- Fluent-bit默认会把整个批次标记为失败重试,哪怕批次里绝大多数日志都已经写入成功,所以才会出现"日志看起来都正常进ES,但一直刷flush失败警告"的现象。
排查&修复步骤
- 先定位具体失败原因
你已经在ES输出配置里开了Trace_Error On,临时把[SERVICE]段的Log_level改成debug,重启后就能看到具体是哪条日志、因为什么原因写入失败。结合你当前的配置,最常见的几个诱因:- 配置里写了
Type docker,Fluent-bit 1.8以上版本对接ES 7.x+时,这个参数已经被废弃,强行传type会触发ES参数校验错误 - NestJS输出的日志存在字段类型冲突,比如同名字段在不同日志里分别是字符串、数字、对象格式,ES自动映射时拒绝写入
- 单条日志体积过大,超过ES默认的HTTP请求大小限制
- 开了
Logstash_Format On之后,你配置的Index fluentbit是不生效的,配置冲突也可能触发异常
- 配置里写了
- 优先修正现有配置的明显问题
替换ES输出段的配置为以下内容,适配高版本ES、避免常见冲突:
改动点说明:[OUTPUT] Name es Trace_Error On Match docker_logs Host 127.0.0.1 Port 9200 Logstash_Format On Logstash_Prefix docker_log Replace_Dots On Suppress_Type_Name On Retry_Limit 2 Buffer_Size 20M- 删除了废弃的
Type docker和不生效的Index fluentbit配置 - 加了
Replace_Dots On,自动把字段名里的.替换成_,避免ES字段映射冲突 - 加了
Suppress_Type_Name On,对接ES7+版本时不再提交type参数 - 调整重试次数为2次,避免失败的chunk无限重试堆积内存
- 限制单次批量请求体积为20M,避免超过ES的请求大小限制
- 删除了废弃的
- 补充过滤器处理冲突字段
在你现有的三个parser过滤器后面,加一个modify过滤器,移除容易和ES内置字段冲突的键:
避免日志自带的[FILTER] Name modify Match docker_logs Remove_key _id Remove_key _type_id、_type字段和ES内置文档字段冲突导致写入失败。
验证
改完配置重启Fluent-bit后观察运行日志:
- 如果不再出现chunk flush失败的警告,说明问题已经解决
- 如果还有报错,看debug日志里的具体错误原因,针对性处理即可,比如字段类型冲突可以提前在ES创建索引模板固定字段类型。
内容的提问来源于stack exchange,提问作者Erika
相关产品推荐
相关产品推荐

