我正在使用pytest测试产生某些输出的CLI。运行测试时,我想将CLI的日志级别设置为DEBUG。但是,我不希望CLI日志干扰正在解析CLI输出的测试。
如何使日志记录模块将所有日志仅发送到stderr?我看过docs帖子,但它讨论的是除了将stemout发送给stderr 之外,还发送日志到stderr。
答案 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)