Closed VanLiuZhi closed 1 year ago
感觉可能是因为采集进度offset是使用inode+deviceId作为唯一标识来记录的,如果docker的这个日志发生rotate之后,存在inode复用的情况,导致文件的offset大于rotate后文件的size,这个时候就没办法去采集了,我具体验证一下看看
@ethfoo 明白你的意思了,我感觉docker "log-opts": {"max-size":"1024m"} 配置下,只保留一个文件,文件size到上限的时候,清空文件内容,此时再看文件大小已经没有1G了,我验证一下多文件的rotate,能否绕过这种情况 "log-opts": { "max-size": "10m", "max-file": "5" }
"log-opts": { "max-size": "10m", "max-file": "5" }
可以,不会中断采集,那情况就比较清晰了,因为设置多文件的情况下,官方文档的说法,当日志文件 xxx-json 满了之后,把这个文件重命名为 xxx-json.1, 然后新的日志再写入到同名创建的新文件 xxx-json 中。只是线上要动这个docker配置,确实很麻烦,log-opts的配置要重建容器才生效
我们内部讨论一下,是否ack offset大于size这种情况下,直接重新采集;本质上这种是需要支持copytruncate的日志轮转策略。
create 和 copytruncate 2种策略吧,发现这种日志采集要兼容各种 runtime 还是挺复杂的
@ethfoo 有没有什么临时修补方案,我不太确定在源码的哪个时间点改比较合适
这个问题解决了吗?我测试过程中也发现,采集 pod 的日志也会不采集。重启 loggie 就好了,并且如果日志文件创建新文件之后,发现不了新文件。
这个问题解决了吗?我测试过程中也发现,采集 pod 的日志也会不采集。重启 loggie 就好了,并且如果日志文件创建新文件之后,发现不了新文件。
你这个是另外那个issues提到的使用containerd无挂载模式导致的问题吧?和copytruncate无关?copytruncate模式已经在v1.5.0-rc.0版本支持了
我看是解决了,升级 v1.5.0-rc.0 版本后没有采集中断的情况了
环境: k8s: v1.19.6 docker: v18, v20 都有 loggie:v1.4.0
遇到一个问题求助一下:
采集日志,过一段时间后,某些pod的日志就采集中断了(从es那边看,就一直没有数据上报,相当于停止了)。我部署了监控,从grafan看,经过我多次测试,大概总结了一下原因,监控里面,只要是 采集进度超过 100% 的,日志就会停止
会出现这种情况,我认为是我们docker容器做了配置,限制了日志文件大小 "log-opts": {"max-size":"1024m"},这样容器日志超过1g的,json文件就被清空了,此时 loggie 的 size,就很小了,而文件的 offset 没有被重置,所以算出来的采集进度也就是如图所示的情况
此时,如果我重启节点的 loggie,采集恢复,我看到有这样的日志,源码这个位置 source/file/watch.go func (w *Watcher) eventBus(e jobEvent)
这段代码应该是重启的时候,会执行,它重置了 existAckOffset ,所以又能采集了。
小结一下: