python 日志记录:同一日志文件的不同格式化程序

python logging: Different formatters for the same log file

我是 python 日志模块的新手。我正在尝试以 html 格式写入日志。我想将所有日志写入同一个文件。所有 INFO 日志都没有时间戳,所有其他严重性级别在日志中都有时间戳。我该怎么做呢?我在 python 日志记录手册中看到过示例,但它显示了如何在多个目的地执行此操作。我想知道是否有一种方法可以根据严重性级别指定不同的格式化程序。

https://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations

是的,这是可能的,而且我经常做这种事情。我经常感到惊讶的是,文档中没有更频繁地给出这个例子。您可以设置这样的一种方法来创建自定义 Formatter,根据日志消息的级别使用不同的格式。有几种方法可以解决这个问题。这个特殊的例子有点 hacky,但是可以重用 Formatter base class 中的大部分代码,只需包装多个格式化程序并根据日志级别选择要使用的一个:

class LevelFormatter(logging.Formatter):
    def __init__(self, fmt=None, datefmt=None, level_fmts={}):
        self._level_formatters = {}
        for level, format in level_fmts.items():
            # Could optionally support level names too
            self._level_formatters[level] = Formatter(fmt=format, datefmt=datefmt)
        # self._fmt will be the default format
        super(LevelFormatter, self).__init__(fmt=fmt, datefmt=datefmt)

    def format(self, record):
        if record.levelno in self._level_formatters:
            return self._level_formatters[record.levelno].format(record)

        return super(LevelFormatter, self).format(record)

然后您可以像这样使用它:

formatter = LevelFormatter(fmt='<default log format>', level_fmts={logging.INFO: '<format string for info>'})
handler.setFormatter(formatter)

这只是您可以反复使用的一种方法。人们可以很容易地想出其他人。