Журналы печатаются дважды при использовании logger в pytest. [Я проверяю все ссылки stackoverflow и не из предложений, исправивших мою проблему]

#python #logging #pytest

#питон #ведение журнала #пытест

Вопрос:

Журналы печатаются дважды при использовании logger в pytest. Я использую пользовательское подключение для сбора всех журналов из каждого теста и регистрации их в 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("nn")


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")
  

Если я добавлю оператор печати, он будет выведен на консоль только один раз при демонтаже. Но если используется use logger, он печатается дважды

выходной сигнал:

[Отредактировал вывод, чтобы удалить детали отчета]. Но я добавил пользовательские журналы и операторы печати в приведенный выше код, для которого вывод выглядит так

Я являюсь разрывом журнала, я являюсь печатью, я являюсь журналом

Комментарии:

1. В вашем get_logger , у вас есть logging.propagate=False , что должно быть logger.propagate = False

2. @greesjma пожалуйста, укажите ссылку в тексте вопроса. Кроме того, несколько строк журналов, где они дублируются.