在pytest中使用logger时,日志被打印两次。我正在使用一个自定义的插件来收集每个测试的所有日志,并将它们记录在teardown中。我正在并行运行测试,所以我需要这样做,以便所有测试输出不会在控制台中混淆
class OutputHandler(object):
def __init__(self, log_to_console=True):
self.exceptions = {}
self.log_to_console = log_to_console
self.log_formatter = logging.Formatter(
fmt='%(asctime)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
def get_header(self, text):
return "\n" + " {} ".format(text).center(60, "-")
def get_subheader(self, text):
return "\n" + " {} ".format(text).center(30, "-")
def get_logger(self, file_path):
logger = logging.getLogger(file_path)
logging.propagate = False
logger.setLevel(logging.INFO)
if not logger.handlers:
if self.log_to_console:
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(self.log_formatter)
logger.addHandler(stream_handler)
return logger
def pytest_runtest_logreport(self, report):
**print(report.when)**
# Maintain all exceptions so we can report them all at once.
if report.outcome == "failed":
if report.nodeid not in self.exceptions:
self.exceptions[report.nodeid] = {}
self.exceptions[report.nodeid][report.when] = str(report.longrepr)
# Don't print anything until all output is done being captured in the final phase
if report.when == "teardown":
logs_directory = shared_resources.get_logs_directory()
file_path = os.path.abspath(os.path.join(logs_directory, report.location[-1]))
logger = self.get_logger(file_path)
**print("I am a print")
logger.info("I am an log")**
logger.info("\n{}".format(report.nodeid))
for report_section_name, report_section_content in report.sections:
logger.info(report_section_name)
logger.info(report_section_content)
if report.nodeid in self.exceptions:
logger.info(self.get_header("Exceptions"))
for k in self.exceptions[report.nodeid]:
logger.info(self.get_subheader(k))
logger.info(self.exceptions[report.nodeid][k])
logger.info("\n\n")
def pytest_addoption(parser):
group = parser.getgroup(constants.plugin_group_name)
def pytest_configure(config):
log_to_console = not config.getvalue("--quiet")
if log_to_console:
config.pluginmanager.register(
OutputHandler(log_to_console=log_to_console),
"output_handler")
若我添加一个print语句,它将在拆卸时只输出到控制台一次。但如果使用use logger,则会打印两次
输出:
[编辑输出以删除报告详细信息]。但我在上面的代码中添加了自定义日志和打印语句,其输出如下所示
召唤 我是一根木头 拆卸 我是一个印刷品 我是一根木头
目前没有回答
相关问题 更多 >
编程相关推荐