gpt4 book ai didi

python - 如何为项目中的所有记录器设置处理程序?

转载 作者:行者123 更新时间:2023-12-01 00:02:23 25 4
gpt4 key购买 nike

我想在我的项目中使用内存记录器。它跟踪最后 n 个日志记录。一个最小的示例主文件如下所示:

import sys
import logging
from logging import StreamHandler
from test_module import do_stuff

logger = logging.getLogger(__name__)


class MemoryHandler(StreamHandler):
def __init__(self, n_logs: int):

StreamHandler.__init__(self)
self.n_logs = n_logs
self.my_records = []

def emit(self, record):
self.my_records.append(self.format(record))
self.my_records = self.my_records[-self.n_logs:]

def to_string(self):
return '\n'.join(self.my_records)


if __name__ == '__main__':
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

mem_handler = MemoryHandler(n_logs=10)
logger.addHandler(mem_handler)
logger.info('hello')
do_stuff()

print(mem_handler.to_string())

我从中导入 do_stuff 的测试模块如下所示:

import logging

logger = logging.getLogger(__name__)


def do_stuff():
logger.info('doing stuff')

当我运行 main 函数时,会出现两个日志语句。一个来自 main,一个来自 doing stuff,但是内存记录器只收到“hello”而不是“doing stuff”:

INFO:__main__:hello
INFO:test_module:doing stuff
hello

我认为这是因为 mem_handler 没有添加到 test_module 记录器中。我可以通过显式添加 mem_handler 来解决此问题:

logging.getLogger('test_module').addHandler(mem_handler)

但总的来说,我不想列出所有模块并手动添加 mem_handler。如何将 mem_handler 添加到项目中的所有记录器?

最佳答案

Python 日志系统是联合的。这意味着存在类似于包结构的树状结构。此结构按记录器名称工作,级别由点分隔。

如果您使用模块的 __name__ 来获取记录器,它将相当于包的点名称。例如:

package.subpackage.module

在此联合系统中,消息会向上发送到记录器结构(除非使用 propagate=False 显式配置其中一个记录器)。

因此,添加处理程序的最佳方法是将其添加到结构顶部的根记录器,并确保下面的所有记录器都传播。

您可以使用 logging.getLogger()(没有任何名称)获取根记录器,然后根据需要添加处理程序或其他配置。

关于python - 如何为项目中的所有记录器设置处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248982/

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