博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的RotatingFileHandler的Bug
阅读量:4922 次
发布时间:2019-06-11

本文共 2716 字,大约阅读时间需要 9 分钟。

Python的库非常强大,基本能找到我们所有需要的lib。logging模块是Python中的日志记录库,借鉴了Java中的LOG4J模块的思想,能非常方便的用于记录软件执行日志。

最近有在开发自动化测试工具,刚好需要logging模块,但在使用logging模块的RotatingFileHandler时,常抛出异常。打印类似于如下异常信息:

 
1 lne 86, in __init__2     rotatingHandler.doRollover()3   File "c:\python24\lib\logging\handlers.py", line 131, in doRollover4     os.rename(self.baseFilename, dfn)5 OSError: [Errno 13] Permission denied
View Code
 
查看日志文件权限后,发现文件属性全为问号,而对其执行copy或者move命令后,文件属性恢复正常。网上有说是在多个地方调用Getlogger之后导致的问题,排查发现并无其他多余模块获取了同样的Logger,暂时无解。(后来发现:存在多个线程通过logging直接记录日志到日志文件,多线程同时操作一个日志文件可能导致该错误) 随后google到一篇早期讨论帖才找到办法: 1、找到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

 

2、可能导致日志记录操作异常,如出现如下异常(异常信息来自网络):

1 Traceback (most recent call last):2   File "C:\Python24\lib\logging\handlers.py", line 72, in emit3     self.doRollover()4   File "C:\Python24\lib\logging\handlers.py", line 141, in doRollover5     self.handleError(record)6 NameError: global name 'record' is not defined
View Code

请尝试如下修改:

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

 

3、按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 close10     del _handlers[self]11 KeyError: 
12 Error in sys.exitfunc:13 Traceback (most recent call last):14 File "C:\Python24\lib\atexit.py", line 24, in _run_exitfuncs15 func(*targs, **kargs)16 File "C:\Python24\lib\logging\__init__.py", line 1333, in shutdown17 h.close()18 File "C:\Python24\lib\logging\__init__.py", line 772, in close19 StreamHandler.close(self)20 File "C:\Python24\lib\logging\__init__.py", line 674, in close21 del _handlers[self]22 KeyError:
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

 

 

原始讨论来自:

 

 
 
 

转载于:https://www.cnblogs.com/txsf/p/3585596.html

你可能感兴趣的文章
为什么要把时间戳追加到目标URL?
查看>>
Python爬虫入门七之正则表达式
查看>>
redis5.0主从配置
查看>>
JavaScript严谨模式(Strict Mode)提升开发效率和质量
查看>>
python_控制台输出带颜色的文字方法
查看>>
luogu2178/bzoj4199 品酒大会 (SA+单调栈)
查看>>
Spark在Yarn上运行Wordcount程序
查看>>
拉普拉斯平滑
查看>>
系统隐形杀手——阻塞与等待
查看>>
25个佳作分享:原来404页面也可如此有趣
查看>>
浅谈对MJRefresh(上)下拉刷新控件的理解
查看>>
MapReduce执行WordCount操作
查看>>
青蛙学Linux—Apache的MPM模式和httpd-mpm.conf
查看>>
06-图1 列出连通集 (25 分)
查看>>
mac os ssh远程链接centos提示证书错误解决方法
查看>>
Hadoop-2.9.2单机版安装(伪分布式模式)(一)
查看>>
JS页面打印预览功能
查看>>
Android - 传统蓝牙通信聊天
查看>>
【PHP】创瑞短信接口
查看>>
Final Exam Arrangement
查看>>