使记录模块将所有日志写入STDERR



我正在使用pytest测试产生一些输出的CLI。在进行测试时,我想将CLI的日志级别设置为调试。但是,我不希望CLI日志干扰正在解析CLI输出的测试。

如何使记录模块将所有日志发送到STDERR?我查看了这篇文章,但它谈到了将日志发送到stderr 之外的文章。 stdout。

您可以将给定记录器的日志输出引向stderr,如下所示。此默认为stderr以进行输出,但是如果您喜欢的话,可以使用sys.stdout。

import logging
import sys
DEFAULT_LOGGER_NAME = 'default_logger'

def init_logging(logger_name=DEFAULT_LOGGER_NAME,
                 log_level=logging.DEBUG,
                 stream=None):
    # logging
    logger = logging.getLogger(logger_name)
    logger.setLevel(log_level)
    # create formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # create console handler and set level to debug
    if stream is None:
        stream = sys.stderr
    ch = logging.StreamHandler(stream=stream)
    ch.setLevel(log_level)
    # add formatter to ch
    ch.setFormatter(formatter)
    # add ch to logger
    logger.addHandler(ch)
    return logger

需要在程序开头调用此功能(例如 main ((的开始(。

然后在代码中,您只需要调用以下内容:

logger = logging.getLogger(LOGGER_NAME) 

执行链接答案的做法,但用stderr替换了stdout。因此,您将使用logging.StreamHandler(sys.stderr)创建一个处理程序,并确保如果您要专门拥有日志,则是唯一的活动处理程序。

正如@tomerikoo正确指出的那样,您无需执行任何操作,尽管记录默认值以与STDERR一起使用StreamHandler。下面代码的唯一实际值是它设置了与默认值不同的级别。只有没有其他设置的logging.warning('log')就会将日志发送到stderr。

附录:您也可以使用BasicConfig实现此目标,以具有较少的样板代码。

import logging
import sys
logging.basicConfig(stream=sys.stderr, level=logging.INFO)
logging.info('test') # sends log to stderr

相关内容

  • 没有找到相关文章

最新更新