在pytest中使用logger时,日志被打印两次。[我检查了所有stackoverflow链接,并没有任何建议修复了我的问题]

2024-06-01 01:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在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,则会打印两次

输出:

[编辑输出以删除报告详细信息]。但我在上面的代码中添加了自定义日志和打印语句,其输出如下所示

召唤 我是一根木头 拆卸 我是一个印刷品 我是一根木头


Tags: topathselfreportinfologgetif