Python的庫很是強大,基本能找到咱們全部須要的lib。logging模塊是Python中的日誌記錄庫,借鑑了Java中的LOG4J模塊的思想,能很是方便的用於記錄軟件執行日誌。python
最近有在開發自動化測試工具,恰好須要logging模塊,但在使用logging模塊的RotatingFileHandler時,常拋出異常。打印相似於以下異常信息:網絡
1 lne 86, in __init__ 2 rotatingHandler.doRollover() 3 File "c:\python24\lib\logging\handlers.py", line 131, in doRollover 4 os.rename(self.baseFilename, dfn) 5 OSError: [Errno 13] Permission denied
查看日誌文件權限後,發現文件屬性全爲問號,而對其執行copy或者move命令後,文件屬性恢復正常。網上有說是在多個地方調用Getlogger以後致使的問題,排查發現並沒有其餘多餘模塊獲取了一樣的Logger,暫時無解。(後來發現:存在多個線程經過logging直接記錄日誌到日誌文件,多線程同時操做一個日誌文件可能致使該錯誤)
隨後google到一篇早期討論帖才找到辦法:
一、找到logging庫下的handlers.py文件,定位到RotatingFileHandler的基類的doRollover方法,修改以下代碼:
1 try: 2 os.rename(self.baseFilename, dfn) 3 #記得先import shutil,替換爲: 4 try: 5 shutil.move(self.baseFilename, dfn)
二、可能致使日誌記錄操做異常,如出現以下異常(異常信息來自網絡):多線程
1 Traceback (most recent call last): 2 File "C:\Python24\lib\logging\handlers.py", line 72, in emit 3 self.doRollover() 4 File "C:\Python24\lib\logging\handlers.py", line 141, in doRollover 5 self.handleError(record) 6 NameError: global name 'record' is not defined
請嘗試以下修改:ide
1 if self.shouldRollover(record): 2 self.doRollover() 3 #修改成: 4 if self.shouldRollover(record): 5 self.doRollover(record)
三、按Ctrl+C退出程序時,可能將打印以下異常:工具
1 Error in atexit._run_exitfuncs: 2 Traceback (most recent call last): 3 File "C:\Python24\lib\atexit.py", line 24, in _run_exitfuncs 4 func(*targs, **kargs) 5 File "C:\Python24\lib\logging\__init__.py", line 1333, in shutdown 6 h.close() 7 File "C:\Python24\lib\logging\__init__.py", line 772, in close 8 StreamHandler.close(self) 9 File "C:\Python24\lib\logging\__init__.py", line 674, in close 10 del _handlers[self] 11 KeyError: <logging.handlers.RotatingFileHandler instance at 0x01E098A0> 12 Error in sys.exitfunc: 13 Traceback (most recent call last): 14 File "C:\Python24\lib\atexit.py", line 24, in _run_exitfuncs 15 func(*targs, **kargs) 16 File "C:\Python24\lib\logging\__init__.py", line 1333, in shutdown 17 h.close() 18 File "C:\Python24\lib\logging\__init__.py", line 772, in close 19 StreamHandler.close(self) 20 File "C:\Python24\lib\logging\__init__.py", line 674, in close 21 del _handlers[self] 22 KeyError: <logging.handlers.RotatingFileHandler instance at 0x01E098A0>
請嘗試以下修改:測試
1 _acquireLock() 2 try: #unlikely to raise an exception, but you never know... 3 del _handlers[self] 4 _handlerList.remove(self) 5 finally: 6 _releaseLock() 7 8 #修改成: 9 _acquireLock() 10 try: #unlikely to raise an exception, but you never know... 11 #del _handlers[self] 12 if ( _handlers.has_key(self) ): del _handlers[self] 13 #if ( self in _handlerList ): _handlerList.remove(self) 14 _handlerList.remove(self) 15 finally: 16 _releaseLock()