Python logger,如何在不显示父级名称的情况下打印子日志记录器%(name)

4 投票
2 回答
2324 浏览
提问于 2025-04-19 21:02

我正在尝试使用Python的日志功能。

因为我想让一些日志记录器共享一个格式,所以我使用了类似下面代码的层级结构。

你可以看到,格式是'%(asctime)s - %(name)s - %(message)s'

在这个时候,我希望日志记录器打印%(name)s部分时不包含父级的名字。

我的意思是,通常它会打印名字为'SYS.Start Up Routine',但我想要的是'Start Up Routine'

有没有什么办法可以做到这一点呢?

logging.root.level = logging.DEBUG
logger = logging.getLogger('SYS')
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s')

streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formatter)
logger.addHandler(streamHandler)

logger1 = logging.getLogger("SYS.Start Up Routine")
logger2 = logging.getLogger("SYS.Message Layer")
logger3 = logging.getLogger("SYS.Application Layer")

2 个回答

2

给你的例子添加一个上下文过滤器:

class ContextFilter:
    def filter(self, record):
        split_name = record.name.split('.', 1)
        if split_name[0] = 'SYS':
            record.name = split_name[1]

然后把它加到处理器里:

streamHandler.addFilter(ContextFilter())

处理器过滤器是日志流的最后一步。这个过滤器在这个阶段会改变日志的名称。这样你就可以把SYS作为所有日志记录器的根(这是个好习惯),同时也让最终用户可以决定日志的格式。在这里,你是自己日志的使用者,你只想把日志打印到标准输出,但这并不总是如此。

你可以添加一个文件处理器,把它设置为调试模式,并且不添加上下文过滤器,这样它就会包含SYS,因为现在它包含了很多其他的日志记录器,而根日志是很重要的。

1

如果你想让名字显示为'bar'而不是'foo.bar',那么只需要记录到一个叫'bar'的日志器中,并把你的处理器添加到根日志器上就可以了。

撰写回答