- 由于 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