Python logging模块

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:\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 不支持这种按时间分割日志文件的方式。
posted @ 2017-09-20 16:04  好奇的小明  阅读(1006)  评论(0编辑  收藏  举报