繁体   English   中英

Python记录器,打印没有父名称的子记录器%(名称)

[英]Python logger, print child logger %(name) without parent 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")

如果您希望名称为'bar'而不是'foo.bar',只需登录名为'bar'的记录器,然后将处理程序添加到根记录器。

为您的示例添加上下文过滤器:

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作为所有记录器的根(这是一种很好的做法),它允许最终用户决定格式。 你是这里你自己的日志的消费者,你只想打印到stdout,但情况并非总是如此。

你可以添加一个文件处理程序,将其设置为debug,并且不添加上下文过滤器,因此它包含SYS,因为现在它包含了一大堆其他记录器,而root很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM