#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 пожалуйста, укажите ссылку в тексте вопроса. Кроме того, несколько строк журналов, где они дублируются.