捕获/返回Python日志的输出信息

3 投票
3 回答
4953 浏览
提问于 2025-04-16 15:38

有没有办法从调用 logging.debug() 中获取或返回消息呢?

谢谢

3 个回答

0

也许可以在启动时把 logging.debug 替换掉?

import logging
d = logging.debug
def myDebug(*args):
  print "I'm a spy", args
  d(*args)
logging.debug = myDebug
0

好吧,logging.debug 通常是把信息写到一个文件里。你可以用 open() 这个函数来读取那个文件。

4

没错,提供一种简单的方法来捕捉和重定向事件信息,而不需要修改发出这些事件的代码,这就是logging模块的主要目的。

你只需要在应用程序启动时调用一下logging.basicConfig(),就可以把记录的事件发送到你想要的地方。

最简单的方法就是直接记录到stdout(标准输出)上:

import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

如果你想了解更高级的选项,建议查看官方文档中的日志记录教程

如果你想在调用时以编程方式获取格式化的信息,那么logging模块就不太适合了。它是用来发出事件的,而不是用作直接调用str.format的替代品。

针对你在评论中提到的情况,你可以考虑设置一种层级日志记录,大致如下:

>>> import logging
>>> import sys
>>> logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
>>> master = logging.getLogger("master")
>>> child1 = logging.getLogger("master.child1")
>>> child2 = logging.getLogger("master.child2")
>>> child1.debug("Event from child 1")
DEBUG:master.child1:Event from child 1
>>> child2.debug("Event from child 2")
DEBUG:master.child2:Event from child 2

在这个设置中,我只在层级的根级别配置了一个处理器(作为basicConfig()调用的一部分)。logging理解日志记录器名称中的“父级.子级”表示法,所以它会把传递给子日志记录器的任何事件上送到主日志记录器,主日志记录器再把它们传递给根日志记录器。

你可以根据需要在masterchild级别添加额外的日志处理器,以便将输出重定向到你想要的地方。

撰写回答