【问题标题】:python logging: Different formatters for the same log filepython logging:同一日志文件的不同格式化程序
【发布时间】:2015-02-20 18:22:28
【问题描述】:

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

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

【问题讨论】:

    标签: python logging


    【解决方案1】:

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

    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)
    

    这只是您可以迭代的一种方法。一个人可以很容易地想出其他人。

    【讨论】:

    • 对不起,只是马虎。显然,类定义中的(...) 应该是__init__。已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2014-02-13
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多