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

时间:2014-09-04 17:16:20

标签: python logging

我正在尝试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 个答案:

答案 0 :(得分:1)

如果你想让这个名字说“' bar'而不是' foo.bar',只需登录名为' bar'的记录器,然后将处理程序添加到根记录器。

答案 1 :(得分:0)

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

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())

处理程序过滤器是logging flow的最后一部分。此过滤器会更改此时的名称。这允许您使用SYS作为所有记录器的根(这是一种很好的做法),它允许最终用户决定格式。你在这里是自己日志的消费者而你只想打印到stdout,但事实并非如此。

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