Python logger,如何在不显示父级名称的情况下打印子日志记录器%(name)
我正在尝试使用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'的日志器中,并把你的处理器添加到根日志器上就可以了。