Python的RotatingFileHandler的Bug

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
View Code
 

查看日誌文件權限後,發現文件屬性全爲問號,而對其執行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)
View Code

 

二、可能致使日誌記錄操做異常,如出現以下異常(異常信息來自網絡):多線程

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
View Code

請嘗試以下修改:ide

1 if self.shouldRollover(record):
2     self.doRollover()
3 #修改成:
4 if self.shouldRollover(record):
5     self.doRollover(record)
View Code

 

三、按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>
View Code

請嘗試以下修改:測試

 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()
View Code

 

 

原始討論來自:http://www.44342.com/python-f871-t33115-p1.htmui

相關文章
相關標籤/搜索