Fluentd配置append=true时out_file插件未写入新事件是什么原因?
问题原因
这个问题是Fluentd 1.14.3版本在macOS平台下的典型兼容问题,结合你的配置,具体触发点有两个:
- 缓冲机制叠加:macOS系统的文件系统缓冲+Ruby 3.0的IO默认缓冲行为,即使配置了
flush_mode immediate,写入操作也只是提交到了Fluentd进程内存缓冲和系统文件缓冲,没有立刻同步到磁盘,你用cat读取的是磁盘持久化后的文件内容,因此看不到新提交的事件。 - 配置缺失:当前配置没有开启out_file插件的
sync参数,该参数会强制每次写入后调用fsync把所有缓冲落地到磁盘。
解决方案
可任选以下一种方案修复:
- 方案1:在file输出配置段添加
sync true参数,强制每次写入都刷盘,修改后配置如下:
<match hack.**> @type file path hack append true sync true <format> @type json </format> <buffer> flush_mode immediate </buffer> </match>
- 方案2:在buffer配置段添加
timekey 1s参数,强制buffer按秒切分触发强制落盘,适合需要按时间严格切分日志的场景:
<match hack.**> @type file path hack append true <format> @type json </format> <buffer time> timekey 1s flush_mode immediate </buffer> </match>
- 方案3:升级Fluentd到1.14.4及以上版本,该版本已修复out_file插件append模式配合immediate flush时的写入不生效bug。
验证方法
修改配置重启Fluentd后再次提交两次测试请求,第二条数据正常出现在日志文件中即修复完成。如果临时需要查看未刷盘的数据,可以给Fluentd进程发送USR1信号强制刷盘:kill -USR1 <Fluentd进程ID>,之后再查看日志文件即可看到所有写入的事件。
内容的提问来源于stack exchange,提问作者Jingguo Yao
相关产品推荐
相关产品推荐

