1.日志模块设置日志文件大小以及最大备份数量(使用了日志配置文件):html
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便可进行备份了python
Traceback (most recent call last): File "C:\Python27\lib\logging\handlers.py", line 77, in emit self.doRollover() File "C:\Python27\lib\logging\handlers.py", line 142, in doRollover os.rename(self.baseFilename, dfn) WindowsError: [Error 32]
2.使用多进程初始化同一日志模块,会致使日志备份报错,由于两个进程同时打开了日志文件,在重命名时会出现WindowsError: [Error 32]错误,该错误是因为文件已被打开,安全
按照官方文档的介绍,logging 是线程安全的,也就是说,在一个进程内的多个线程同时往同一个文件写日志是安全的。可是(对,这里有个可是)多个进程往同一个文件写日志不是安全的,为了解决这个问题,能够使用 ConcurrentLogHandler,ConcurrentLogHandler 能够在多进程环境下安全的将日志写入到同一个文件,而且能够在日志文件达到特定大小时,分割日志文件。在默认的 logging 模块中,有个 TimedRotatingFileHandler 类,能够按时间分割日志文件,惋惜 ConcurrentLogHandler 不支持这种按时间分割日志文件的方式。