Python logging模塊

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 不支持這種按時間分割日誌文件的方式。
相關文章
相關標籤/搜索