我正在使用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