是否可以在Python日志记录中为不同的处理程序设置不同的级别名称

时间:2014-04-25 22:42:50

标签: python logging python-2.6

在python 2.6中(可能是更高版本但我现在只看2.6),似乎日志记录模块的_levelnames映射是一个不属于任何类的顶级对象:

_levelNames = {
    CRITICAL : 'CRITICAL',
    ERROR : 'ERROR',
    WARNING : 'WARNING',
    INFO : 'INFO',
    DEBUG : 'DEBUG',
    NOTSET : 'NOTSET',
    'CRITICAL' : CRITICAL,
    'ERROR' : ERROR,
    'WARN' : WARNING,
    'WARNING' : WARNING,
    'INFO' : INFO,
    'DEBUG' : DEBUG,
    'NOTSET' : NOTSET,
}

该模块提供了覆盖这些名称的方法:

def addLevelName(level, levelName):
    """
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    """
    _acquireLock()
    try:    #unlikely to cause an exception, but you never know...
        _levelNames[level] = levelName
        _levelNames[levelName] = level
    finally:
        _releaseLock()

但这是全球性的。

我需要登录到syslog,以便将ERROR日志消息标记为“MAJOR”,并将WARNING日志消息标记为“MINOR”。

现在使用addLevelName()方法更改名称很容易,但同样,这是全局的。我希望我的syslog处理程序使用MAJOR和MINOR,但为程序日志留下ERROR和WARNING。我并不是绝对必须这样做,并且可以使用全局重命名,但我宁愿不这样做。我已经遍布源代码,找不到可以让我这样做的钩子。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您可以在相应的处理程序上使用自定义Formatter,将levelname的{​​{1}}属性更改为您想要的任何内容。这不会对级别名称进行任何全局更改:

LogRecord

答案 1 :(得分:0)

Vinay Sajip的答案基本上是正确的想法但是语法错误,至少在python 2.6下。

这是我对他的回答的修改:

from logging import Formatter
class MyFormatter(Formatter):
    def format(self, record):
        orig_levelname = record.levelname
        if record.levelname == 'ERROR':
            record.levelname = 'MAJOR'
        elif record.levelname == 'WARNING':
            record.levelname = 'MINOR'
        result = Formatter.format(self, record)
        record.levelname = orig_levelname
        return result