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 不支持這種按時間分割日誌文件的方式。