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

时间:2019-07-31 00:50:02

标签: python logging pytest stderr

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

如何使日志记录模块将所有日志仅发送到stderr?我看过docs帖子,但它讨论的是除了将stemout发送给stderr 之外,还发送日志到stderr。

2 个答案:

答案 0 :(得分:0)

执行与链接答案相同的操作,但将stdout替换为stderr。因此,如果要专门将日志发送到stderr,则可以使用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

答案 1 :(得分:0)

您可以将给定记录器的日志输出定向到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)