如何将`logging`警告变成错误?

时间:2017-11-21 14:47:04

标签: python logging

我使用的库通过logging模块(logging.Logger的{​​{1}}和warn()方法)发出警告和错误。我想实现一个选项,将警告变为错误(即警告失败)。

有没有简单的方法来实现这一目标?

从文档中看,我看不到现成的解决方案。我假设可以通过添加自定义error()对象来实现,但我不确定如何“正确”执行此操作。有什么指针吗?

3 个答案:

答案 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