【发布时间】:2021-03-19 23:06:01
【问题描述】:
我创建了一个自定义 Python 日志记录处理程序,其中我覆盖了 handleError() 方法。为了测试它,我删除了包含日志文件的目录以强制记录错误。下次我尝试使用记录器记录某些内容时,我希望这会触发对 handleError() 的调用。然而,这并没有发生。异常直接传递给我的方法进行日志记录。
最小可重现示例:
import logging
import os
import shutil
from logging.handlers import WatchedFileHandler
from pathlib import Path
class MySpecialWatchedFileHandler(WatchedFileHandler):
def handleError(self, record):
print("******************** HANDLING AN ERROR!!!! *********************")
super().handleError(record)
print("************** Start ************")
test_logger = logging.getLogger(__name__)
test_logger.handlers = []
log_directory = "/tmp/test_logdir"
Path(log_directory).mkdir(parents=True, exist_ok=True)
handler = MySpecialWatchedFileHandler(os.path.join(log_directory, "test_logfile.log"), delay=False)
test_logger.addHandler(handler)
test_logger.setLevel(logging.INFO)
# Force a failure by deleting the logging directory, so that it does not auto-recover.
shutil.rmtree(log_directory, ignore_errors=False)
test_logger.info("This is a test")
print("************** End ************")
结果输出:
/home/joe/percipient/mirage-backend-django/venv/bin/python /home/joe/.config/JetBrains/PyCharm2020.3/scratches/scratch.py
************** Start ************
Traceback (most recent call last):
File "/home/joe/.config/JetBrains/PyCharm2020.3/scratches/scratch.py", line 25, in <module>
test_logger.info("This is a test")
File "/usr/lib/python3.6/logging/__init__.py", line 1308, in info
self._log(INFO, msg, args, **kwargs)
File "/usr/lib/python3.6/logging/__init__.py", line 1444, in _log
self.handle(record)
File "/usr/lib/python3.6/logging/__init__.py", line 1454, in handle
self.callHandlers(record)
File "/usr/lib/python3.6/logging/__init__.py", line 1516, in callHandlers
hdlr.handle(record)
File "/usr/lib/python3.6/logging/__init__.py", line 865, in handle
self.emit(record)
File "/usr/lib/python3.6/logging/handlers.py", line 481, in emit
self.reopenIfNeeded()
File "/usr/lib/python3.6/logging/handlers.py", line 471, in reopenIfNeeded
self.stream = self._open()
File "/usr/lib/python3.6/logging/__init__.py", line 1061, in _open
return open(self.baseFilename, self.mode, encoding=self.encoding)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/test_logdir/test_logfile.log'
Process finished with exit code 1
请注意,******************** HANDLING AN ERROR!!!! ********************* 永远不会被打印出来。
为什么我的处理程序没有捕捉到那个异常?
不确定这是否重要,但我已经尝试将logging.raiseExceptions 设置为True 和False,并在处理程序中同时设置True 和False 的延迟,以及行为两种选择都一样。
【问题讨论】:
-
@llamaking136 是的,我有,当然会捕获异常,但我担心并非所有日志记录错误都一定会表现为异常,我想测试实际的官方错误处理机制。
-
您是否在文件处理程序上设置了
delay参数?我无法重现您的错误。请提供一个最小的可重现示例。 stackoverflow.com/help/minimal-reproducible-example -
@blues 谢谢。我已经尝试将
delay设置为True和False,但这并没有什么不同。我已将我的问题更新为一个最小的可重现示例,以及生成的输出。我在一个临时文件中运行了它。
标签: python python-logging