我正在尝试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")
答案 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很重要。