1.日志模块设置日志文件大小以及最大备份数量(使用了日志配置文件):
def init_loggers(self, project_path): logging.config.fileConfig(os.path.join(project_path, 'config', 'log.conf')) logger = logging.getLogger("mylogger") handler = logging.handlers.RotatingFileHandler( filename=os.path.join(project_path, 'output', 'report', 'server_log.log'), maxBytes=1 * 1024 * 1024, backupCount=10,) handler.setLevel(logging.INFO) handler.setFormatter(logger.handlers[0].formatter) logger.addHandler(handler) self.logger = logger
当日志文件超出大小后发现不会自动备份,系统报错,经分析日志文件处于占用状态,不能进行重命名,原因是由于logger添加了多个handler,如果改成一个handler即可进行备份了
Traceback (most recent call last): File "C:Python27liblogginghandlers.py", line 77, in emit self.doRollover() File "C:Python27liblogginghandlers.py", line 142, in doRollover os.rename(self.baseFilename, dfn) WindowsError: [Error 32]
2.使用多进程初始化同一日志模块,会导致日志备份报错,因为两个进程同时打开了日志文件,在重命名时会出现WindowsError: [Error 32]错误,该错误是由于文件已被打开,
按照官方文档的介绍,logging 是线程安全的,也就是说,在一个进程内的多个线程同时往同一个文件写日志是安全的。但是(对,这里有个但是)多个进程往同一个文件写日志不是安全的,为了解决这个问题,可以使用 ConcurrentLogHandler,ConcurrentLogHandler 可以在多进程环境下安全的将日志写入到同一个文件,并且可以在日志文件达到特定大小时,分割日志文件。在默认的 logging 模块中,有个 TimedRotatingFileHandler 类,可以按时间分割日志文件,可惜 ConcurrentLogHandler 不支持这种按时间分割日志文件的方式。