- 由于 2 号进程将 error.log 重命名为 error.log-2020-05-15,也会导致 1 号进程继续向 error.log-2020-05-15 写入,这样就造成了写入错乱。
原因清楚了,那么,有什么解决办法呢?两个方案:
使用 concurrent-log-handler 包
这个包通过加锁的方式实现了多进程安全,并且可以在日志文件达到特定大小时,分割文件,但是不支持按时间分割。
包的源码我并没有仔细研究,也就没办法再细说了,大家如果感兴趣的话可以自己找来看。
由于我的需求是按时间进行分割,显然就不能用了,自己写吧。
重写 TimedRotatingFileHandler
通过上面的分析可以知道,出问题的点就是发生在日志分割时,一是删文件,二是没有及时更新写入句柄。
所以针对这两点,我的对策就是:一是去掉删文件的逻辑,二是在切割文件时,及时将写入句柄更新到最新。
代码如下:
解决多进程日志写入混乱问题
import os
import time
from logging.handlers import TimedRotatingFileHandler
class CommonTimedRotatingFileHandler(TimedRota

本文介绍了在Django多进程环境下,由于日志文件重命名导致的写入错乱问题及其解决方法。建议使用concurrent-log-handler包实现日志安全写入,或者重写TimedRotatingFileHandler类,去除删除文件逻辑并及时更新写入句柄,避免日志混乱。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



