我使用的库通过logging
模块(logging.Logger
的{{1}}和warn()
方法)发出警告和错误。我想实现一个选项,将警告变为错误(即警告失败)。
有没有简单的方法来实现这一目标?
从文档中看,我看不到现成的解决方案。我假设可以通过添加自定义error()
对象来实现,但我不确定如何“正确”执行此操作。有什么指针吗?
答案 0 :(得分:3)
@ hoefling的答案很接近,但我会改变它:
class LevelRaiser(logging.Filter):
def filter(self, record):
if record.levelno == logging.WARNING:
record.levelno = logging.ERROR
record.levelname = logging.getLevelName(logging.ERROR)
return True
def configure_library_logging():
library_root_logger = logging.getLogger(library.__name__)
library_root_logger.addFilter(LevelRaiser())
原因是过滤器用于更改LogRecord
属性并过滤掉东西,而处理程序用于执行I / O.你在这里尝试做的不是I / O,因此并不属于处理程序。
答案 1 :(得分:2)
更新:我喜欢在Vinay中提出的this answer提案,注入自定义Filter
代替Handler
是一种更清洁的方式。请检查一下!
您正在实施自己的Handler
。这很容易实现。我会这样做:编写一个处理程序,在原地编辑LogRecord
并将一个处理程序实例附加到库的根记录器。例如:
# library.py
import logging
_LOGGER = logging.getLogger(__name__)
def library_stuff():
_LOGGER.warning('library stuff')
这是一个使用该库的脚本:
import logging
import library
class LevelRaiser(logging.Handler):
def emit(self, record: logging.LogRecord):
if record.levelno == logging.WARNING:
record.levelno = logging.ERROR
record.levelname = logging.getLevelName(logging.ERROR)
def configure_library_logging():
library_root_logger = logging.getLogger(library.__name__)
library_root_logger.addHandler(LevelRaiser())
if __name__ == '__main__':
# do some example global logging config
logging.basicConfig(level=logging.INFO)
# additional configuration for the library logging
configure_library_logging()
# play with different loggers
our_logger = logging.getLogger(__name__)
root_logger = logging.getLogger()
root_logger.warning('spam')
our_logger.warning('eggs')
library.library_stuff()
root_logger.warning('foo')
our_logger.warning('bar')
library.library_stuff()
运行脚本:
WARNING:root:spam
WARNING:__main__:eggs
ERROR:library:library stuff
WARNING:root:foo
WARNING:__main__:bar
ERROR:library:library stuff
请注意,警告级别仅在库的日志记录打印时提升到错误级别,其余部分保持不变。
答案 2 :(得分:0)
您可以在调用库中的方法之前将logging.warn
指定给logging.error
:
import logging
warn_log_original = logging.warn
logging.warn = logging.error
library_call()
logging.warn = warn_log_original