python - 使用 python 3.3.4 和 RotatingFileHandler 时的 PermissionError

标签 python python-3.x logging

我正在尝试为我正在使用 python 3.3.4 和 PyQt4 编写的 GUI 应用程序获取旋转日志文件。

我的主脚本中有以下代码片段:

import logging
import resources

logger = logging.getLogger('main.test')

def main():
    logger.setLevel(logging.DEBUG)

    fh = RotatingFileHandler(resources.LOG_FILE_PATH, maxBytes=500, backupCount=5)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)

    logger.addHandler(fh)
    logger.info('main')

我的 maxBytes 很低,以便我可以测试旋转是否正常工作,但事实并非如此。每当应该轮换日志时,我都会收到以下错误:
Traceback (most recent call last):
File "C:\Python33\lib\logging\handlers.py", line 73, in emit
self.doRollover()
File "C:\Python33\lib\logging\handlers.py", line 176, in doRollover
self.rotate(self.baseFilename, dfn)
File "C:\Python33\lib\logging\handlers.py", line 116, in rotate
os.rename(source, dest)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\myuser\\.logtest\\test.log.1'

并且没有记录任何内容。任何帮助深表感谢。
谢谢

最佳答案

您可以直接在 basicConfig() 中指定处理程序,而不是向记录器对象添加处理程序。如果将 RotatingFileHandler 添加到记录器对象,则一个对象可能会打开日志文件,同时另一个对象可能会尝试重命名它,从而引发 PermissionError。

下面的代码似乎工作得很好。

import logging
import resources
from logging.handlers import RotatingFileHandler

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[RotatingFileHandler(filename=resources.LOG_FILE_PATH, maxBytes=500, backupCount=5)])
logger = logging.getLogger('main.test')

def main():
    logger.setLevel(logging.DEBUG)
    logger.info('main')

关于python - 使用 python 3.3.4 和 RotatingFileHandler 时的 PermissionError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22459850/

相关文章:

java - 日志文件已创建但文件为空

java - 如何创建 MyLogger?

python - 在python中使用正则表达式提取科学记数法数字

python - numpy object_ 数组中最长的字符串

python - 使用户制作的 HTML 模板安全

python-3.x - 如何在 python 中使用 selenium 定位并单击 netflix 上的 "speed test"链接?

asp.net - 如何在 ASP.NET 中使用 log4net 在日志文件中包含 SessionID?

python - 我是否需要锁定来保护我的代码中的多线程竞争条件

python - 列表相对于另一列的频率分布

python - pyinstaller 无法使用 tkinter