Chr*_*ler 7 python logging python-3.x
我正在尝试为我正在使用 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')
Run Code Online (Sandbox Code Playgroud)
我的 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'
Run Code Online (Sandbox Code Playgroud)
并且没有记录任何内容。任何帮助深表感谢。谢谢
小智 6
花了半天时间,因为之前的答案解决了我的问题。
我的工作解决方案是使用https://pypi.org/project/concurrent-log-handler/而不是 RotatingFileHandler。在像 Flask 应用程序这样的多线程场景中,当我们旋转达到最大大小的日志文件时,将引发 PermissionError。
安装pypiwin32以消除No Module name win32con错误。
感谢访问https://www.programmerought.com/article/43941158027/
小智 6
就我而言,它只发生在 Windows 中。为了解决这个问题,我将TimedRotatingFileHandler 日志处理程序的延迟参数更改为 True。
文档-> https://docs.python.org/3/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler
小智 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')
Run Code Online (Sandbox Code Playgroud)