[英]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.