根据您的示例,我创建了一个自定义的格式化程序
,它将处理该树。
import logging
class TreeFormatter(logging.Formatter):
formatPrefix = {}
def format(self, record):
s = ""
if not record.name in self.formatPrefix:
f = self.getFormatPrefix(record)
s += "%s \"%s\"\n" % (f, record.name)
s += "%s %s: %s" % (self.formatPrefix[record.name], record.levelname, record.msg)
return s
def getFormatPrefix(self, record):
depth = record.name.count(".")
self.formatPrefix[record.name] = " |" * (depth+1)
if depth == 0:
return "<--"
return "%so<--" % ( (" |" * depth)[:-1])
您可以使用它来创建第一级记录器(这里是a)。其余代码保持不变。
以下是示例:
def createTreeLogger(name, level=logging.DEBUG):
logger = logging.getLogger(name)
logger.setLevel(level)
ch = logging.StreamHandler()
ch.setLevel(level)
ch.setFormatter(TreeFormatter())
logger.addHandler(ch)
return logger
if __name__ == '__main__':
logger_a = createTreeLogger("a")
logger_a_b = logging.getLogger("a.b")
logger_a_b_c = logging.getLogger("a.b.c")
logger_a.debug("One")
logger_a_b.warning("two")
logger_a_b.warning("three")
logger_a_b_c.critical("Four")
logger_a_b.warning("Five")
logger_a.warning("Six")
值得注意的是,日志记录包的内部会自动为子包(a.b,a.b.c)使用相同的处理程序。因此,通过运行此代码,您将获得:
<-- "a"
| DEBUG: One
o<-- "a.b"
| | WARNING: two
| | WARNING: three
| o<-- "a.b.c"
| | | CRITICAL: Four
| | WARNING: Five
| WARNING: Six
一个缺点是,如果您有多个包层次结构,日志会变得混乱。但是TreeFormatter
类很容易调整以满足您的需求。
logging.StreamHandler
。 - Tom Dalton