容器日志按 100M 轮转,轮转后 Kibana 里这个 Pod 的日志停在 03:12,之后 40 分钟一条都没有。Filebeat 日志里 harvester 还挂在 order.log.1 上,新文件 order.log 没被打开。乍看像缓存或者权限的锅,追下去往往不是。
filebeat test config -c filebeat.yml ls -li /var/log/app/order.log* ./filebeat -e -d 'publisher' 2>&1 | grep harvester
追下去是这么回事:采集器按 inode 跟踪文件,轮转后新文件是新 inode。旧文件被 rename 后 harvester 继续读到 EOF 就停在那里,注册表里记的还是旧路径。容器里 /var/log 挂的是 emptyDir,Pod 重建后注册表对不上。
「harvester 旧 inode」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,确认采集的是容器 stdout 还是挂载目录 优先走 stdout;开启 close_renamed 和 close_removed 让旧句柄及时关闭;注册表落到宿主机持久目录 别放在容器可写层;轮转后看 harvester 数量是否跟着新建。
验收就看一点,轮转后 30 秒内新文件开始入库,Kibana 里时间连续没有断档。
