使用Python 3.3.4和RotatingFileHandler时权限错误

13 投票
8 回答
10118 浏览
提问于 2025-04-17 22:41

我正在为一个用Python 3.3.4和PyQt4写的图形界面应用程序创建一个循环日志文件。

在我的主脚本中,有以下这段代码:

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'

而且没有任何日志被记录。非常感谢任何帮助。

8 个回答

1

在我的情况下(Windows Server 2016 + IIS + FastCGI + Flask),我最终通过关闭文件夹中的文件索引功能解决了问题。具体操作方法

来源:https://stackoverflow.com/a/22467917/9199668

顺便说一下,这个系统之前运行了几个月都没问题……我也不知道为什么会这样……

2

你不能在 basicConfig()RotatingFileHandler() 中同时指定相同的文件名。我之前也遇到过这个问题,后来我把 basicConfig() 中的文件名参数去掉了,现在就可以正常工作了。

5

与其把处理器添加到日志记录器对象上,不如直接在 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')
6

我花了半天时间,因为之前的回答都没能解决我的问题。

我找到的有效解决办法是使用 https://pypi.org/project/concurrent-log-handler/,而不是 RotatingFileHandler。在像 Flask 应用这样的多线程场景中,当我们尝试旋转达到最大大小的日志文件时,会出现权限错误(PermissionError)。

安装 pypiwin32 可以解决 No Module name win32con 的错误。

感谢这篇文章 https://www.programmersought.com/article/43941158027/

7

在我的情况下,这个问题只发生在Windows系统上。为了解决这个问题,我把我的TimedRotatingFileHandler日志处理器中的delay参数改成了True。

文档 -> https://docs.python.org/3/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler

撰写回答