gpt4 book ai didi

python - 如何在全局范围内向 Python Logger 对象添加处理程序?

转载 作者:行者123 更新时间:2023-12-05 01:46:30 25 4
gpt4 key购买 nike

我想为我的项目创建一个记录器,它有一个跨所有子模块工作的自定义处理程序,并记录未捕获的异常。以下是我的概念验证;请注意,我使用文件处理程序作为最终将成为我的自定义处理程序的替代品。

主要.py:

import logging
import sys
from module import divide

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

fh = logging.FileHandler("test.log")
fh.setLevel(logging.INFO)
logger.addHandler(fh)

def uncaught_error(exc_type, exc_value, exc_traceback):
logger.error("Uncaught Exception", exc_info = (exc_type, exc_value, exc_traceback))
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return

sys.excepthook = uncaught_error

if __name__ == '__main__':
logger.info("first division problem")
print(divide(5,2))
logger.info("second division problem")
print(divide(10,0))
logger.info("end")

模块.py:

import logging

logger = logging.getLogger(__name__)

def divide(a, b):
logger.info("dividing " + str(a) + " by " + str(b))
return a/b

在我运行 main.py 之后,这是 test.log 的输出:

first division problem
second division problem
Uncaught Exception
Traceback (most recent call last):
File "main.py", line 23, in <module>
print(divide(10,0))
File "/some/path/logging_test/module.py", line 7, in divide
return a/b
ZeroDivisionError: division by zero

module.py 中未捕获的异常被漂亮地记录了下来,但是行

logger.info("dividing " + str(a) + " by " + str(b))

显然什么也没做(也没有控制台输出)。什么错误?

最佳答案

我刚遇到这个问题,我的根日志记录格式没有在其他子模块中使用。我通过更改

解决了这个问题

logger = logging.getLogger(__name__)

在main.py模块中

logger = logging.getLogger()

这样它实际上得到了 root 记录器而不是 __main__ 记录器。

参见 https://docs.python.org/2/library/logging.html#logging.getLogger

关于python - 如何在全局范围内向 Python Logger 对象添加处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com