Kyl*_*tan 4 python logging python-2.7
我有以下日志记录类,在代码中指定为格式化程序时工作正常.它通过在要记录的消息的开头添加字符串来扩展现有格式化程序,以帮助显示消息的重要性.(我不只是%(levelname)s
在格式字符串中使用,因为我不想显示DEBUG或INFO前缀.)
class PrependErrorLevelFormatter(logging.Formatter):
def __init__(self, default):
self._default_formatter = default
def format(self, record):
if record.levelno == logging.WARNING:
record.msg = "[WARNING] " + record.msg
elif record.levelno == logging.ERROR:
record.msg = "[ERROR] " + record.msg
elif record.levelno == logging.CRITICAL:
record.msg = "[CRITICAL] " + record.msg
return self._default_formatter.format(record)
Run Code Online (Sandbox Code Playgroud)
现在我希望能够通过logging.config.fileConfig()加载的配置文件来分配它.我试过这样的语法:
[formatter_PrependErrorLevelFormatter]
format=%(asctime)s %(message)s
datefmt=%X
class=PrependErrorLevelFormatter
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到解决这个类的错误:
File "C:\Python27\lib\logging\config.py", line 70, in fileConfig
formatters = _create_formatters(cp)
File "C:\Python27\lib\logging\config.py", line 127, in _create_formatters
c = _resolve(class_name)
File "C:\Python27\lib\logging\config.py", line 88, in _resolve
found = __import__(used)
ImportError: No module named PrependErrorLevelFormatter
Run Code Online (Sandbox Code Playgroud)
我尝试使用它所在的模块的名称为类名添加前缀,但是得到相同的错误.即使它可以解析类,它也可能不起作用,因为我需要提供额外的默认格式化器参数.
如何使用logging.config系统实现我想要的结果?
Vin*_*jip 10
当您使用Python 2.7时,您可以使用以下基于字典的配置dictConfig()
:这比使用更灵活fileConfig()
,因为它允许使用任意callables作为工厂返回例如处理程序,格式化程序或过滤器.
如果必须使用fileConfig()
,则必须构造一个callable,它接受format
和datefmt
字符串值并返回类的实例.该class
值只需要解析为可调用的,而不是实际的类.这是一个有效的设置:在这个要点中,我有一个custfmt.py
包含格式化程序定义的文件,以及一个fcfgtest.py
使用它的脚本fileConfig()
.只需将文件放入临时目录并运行fcfgtest.py
- 您应该看到如下输出:
20:17:59 debug message
20:17:59 info message
20:17:59 [WARNING] warning message
20:17:59 [ERROR] error message
20:17:59 [CRITICAL] critical message
Run Code Online (Sandbox Code Playgroud)
这似乎是你需要的.
请注意,您可以为格式化程序使用替代设计,它应该执行相同的工作:
class AltCustomFormatter(logging.Formatter):
def format(self, record):
if record.levelno in (logging.WARNING,
logging.ERROR,
logging.CRITICAL):
record.msg = '[%s] %s' % (record.levelname, record.msg)
return super(AltCustomFormatter , self).format(record)
Run Code Online (Sandbox Code Playgroud)
要使用它,您不需要单独的工厂功能,因此您可以使用
class=custfmt.AltCustomFormatter
Run Code Online (Sandbox Code Playgroud)
代替
class=custfmt.factory
Run Code Online (Sandbox Code Playgroud)
它应该工作 - 当我刚刚使用Python 2.7.1进行测试时它确实适用于我:-)
归档时间: |
|
查看次数: |
9479 次 |
最近记录: |