如何全局地向Python Logger对象添加处理程序?
我想为我的项目创建一个日志记录器,它有一个跨所有子模块工作的自定义处理程序,并记录未捕获的异常。下面是我的概念证明;请注意,我正在使用一个文件处理程序作为最终将成为我的自定义处理程序的替代 main.py:如何全局地向Python Logger对象添加处理程序?,python,logging,Python,Logging,我想为我的项目创建一个日志记录器,它有一个跨所有子模块工作的自定义处理程序,并记录未捕获的异常。下面是我的概念证明;请注意,我正在使用一个文件处理程序作为最终将成为我的自定义处理程序的替代 main.py: import logging import sys from module import divide logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) fh = logging.FileHandler(
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")
module.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
显然什么也没做(也没有控制台输出)。错误是什么?我也有类似的问题,这就是我解决这个问题的方法:- 模块.py 在main.py中 通过将记录器作为第三个参数传递来调用divide()
print divide(5,2, logger)
在您的情况下,没有为module.py设置处理程序,请将您的自定义处理程序添加到根记录器并完成。如果您不更改任何其他内容(没有其他默认设置),则只要其他记录器的级别允许,所有模块的日志记录都将传递给该处理程序
所有(其他)记录器都是根记录器的后代。应该有助于理解日志记录中的信息流。我刚刚遇到了这个问题,我的根日志记录格式没有在其他子模块中使用。我通过改变来解决这个问题
logger=logging.getLogger(\uuuuu name\uuuuu)
在main.py模块中
logger=logging.getLogger()
因此它实际上得到的是根
记录器,而不是主
记录器
请参见看起来您只是在
main.py
中添加记录器的处理程序;根据中的示例,尝试使用BasicConfig
为所有模块设置日志记录。@jornsharpe据我所知,BasicConfig
只能用于内置处理程序;当然,在上面的概念验证中,这是可以的,但当我用自己的自定义处理程序替换FileHandler
时就不行了。除非我错了?问题是module.py实际上可能有十几个模块,每个模块都有十几个类和函数-当然不需要重构整个项目就可以让日志正常工作?除此之外,@jornsharpe在上面的评论中提出了一个很好的观点:使用BasicConfig设置记录器确实允许全局使用记录器。如果这个函数能正确地与自定义处理程序一起工作,那么我想我会处于良好状态。这是关于设计选择的,在我看来,拥有全局记录器就像拥有全局变量一样,我们知道使用全局变量的副作用。如果我们有很多模块,那么我们可能不喜欢在单个日志文件中转储所有日志
import logging
def divide(a, b, logger):
logger.info("dividing " + str(a) + " by " + str(b))
return a/b
print divide(5,2, logger)