宝塔用户_hbhuad 发表于 2026-6-8 10:37:46

【已记录】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 从头续写,面板显示就完全正常了。希望开发能早点修复!


大炮运维V587 发表于 2026-6-16 09:39:24

感谢您的反馈!已记录
页: [1]
查看完整版本: 【已记录】Docker日志切割BUG反馈