在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。我并不是绝对必须这样做,并且可以使用全局重命名,但我宁愿不这样做。我已经遍布源代码,找不到可以让我这样做的钩子。
我错过了什么吗?
答案 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