【已记录】Docker日志切割BUG反馈
问题现象请参考旧帖【待反馈】Docker日志切割BUG反馈26年了还是遇到同样的问题,面板执行Docker日志切割后,面板实时日志一直为0字节,Docker面板里再也刷不出新日志了,生产环境随时要监看且不可能总是重启,这个bug就导致要是开启了日志分割,面板监看就完全失效了。
看了一下/www/server/panel/script/dk_log_split.py源码,脚本里用的是 `os.rename()` 把日志移走,然后新建一个空文件。
`os.rename()` 移动文件并不会改变文件的 inode。Docker 守护进程是一直占着原来那个 inode 持续写日志的。这就导致 Docker 其实一直在往被挪走的“历史备份文件”里写数据,而我们新建的那个同名空文件(拥有全新的 inode)根本接收不到任何 Docker 日志。
建议必须保证原日志文件的 inode 不变,改用复制备份并清空原文件
建议官方修改,在脚本顶部加上 `import shutil`,然后把 `day_split` 和 `size_split` 里的这段重命名逻辑:
os.rename(task['log_path'], split_path + task['pid'] + "-json.log" + '_' + str(int(time.time())))
public.writeFile(task['log_path'], '')
改成下面这样:
target_file = split_path + task['pid'] + "-json.log" + '_' + str(int(time.time()))
shutil.copyfile(task['log_path'], target_file)
with open(task['log_path'], 'r+') as f:
f.truncate(0)
这样就可以又备份日志又能让 Docker 从头续写,面板显示就完全正常了。希望开发能早点修复!
感谢您的反馈!已记录
页:
[1]