日志轮换场景,往轮换后的旧文件写日志 iLogtail 有时采集有时不采集 #950
-
有个 Java SpringBoot 项目的日志量比较少,logback 按天轮换,又将 immediateFlush 参数配置了 false ,这样在日志比较少的时候,ing 日志文件一直没内容,轮换后的日志文件才能看到日志,发现 iLogtail 有时采集轮换后的日志,有时没有采集。(immediateFlush 改为 true 实时写,采集正常没问题的) 手工模拟了一下,iLogtail 采集 ing 文件, move ing 文件后继续往move 后的日志文件里写内容,也会出现这样的情况。 iLogtail 采集配置:
手工模拟操作的脚本 buff_log.sh:
操作步骤:
如果直接执行模拟轮换的脚本,move 文件后,往 move 后的文件里面添加内容,iLogtail 没有采集输出; 如果先往日志中生成一条内容,ing 中的立即被采集,再执行模拟轮换的脚本,轮换后新增的日志也会被采集输出;
如果先往日志中生成一条内容,ing 中的被采集后,等待一段时间,再执行模拟轮换的脚本,如果等待的时间不超过180s,iLogtail 会采集输出,否则不再采集 (不是轮换后再等待,轮换后都是脚本立即写入的);
前两条轮换后新增的会采集,最后一条 sleep 181 轮换后新增的不会被采集。 |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments
-
目前看比较好的解决方法是使用immediateFlush=True |
Beta Was this translation helpful? Give feedback.
-
另外注意到,你们在采集springboot的日志,有没有对进行日志解析,我们正在收集案例,以便大家更好地使用ilogtail。如有可以贡献一下java-springboot-xxx.md,参见https://github.com/alibaba/ilogtail/tree/main/example_config/user_contrib 如果方便,可以将使用场景登记下。#693 |
Beta Was this translation helpful? Give feedback.
往move后的文件写入数据是采集不到的。因为这个文件都modify事件路径不匹配采集配置。如果在log to roll file前sleep 1,那就必然采集不到。如果不sleep的话,因为ing文件的create事件,导致还在队列中的老文件再读一次而读到数据。sleep 1后,老文件读取的时候新数据还没有写入,所以就必然采集不上来。
如果当前没有ing文件,创建并在ing文件中写一条数据,并立刻进行轮转也是采集不到数据的。因为当ilogtail收到事件并尝试打开ing文件时,叫ing的文件已经是新的文件,里面没有内容。
那为什么sleep <180可以采集到数据,>180不能呢?因为ilogtail每过180s(check_handler_timeout_interval)判断一次是否关闭当前打开的句柄,我们看看<180会发生什么。
1 写es/es-log.ing,正常读取文件中的内容。
2 sleep <180,句柄仍然保持打开
3 mv es/es-log.ing 到 rolling file,创建新的es/es-log.ing,并向rolling file写数据
4 ilogtail收到新的es/es-log.ing创建,尝试原来的es/es-log.in,因为句柄打开直接读取,然后将老句柄关闭,存入轮转队列。
再看看>180的。
1 写es/es-log.ing,正常读取文件中的内容。
2 sleep >180,句柄关闭
3 mv es/es-log.ing 到 rolling file,创建新的es/es-log.ing,并向rolling …