Модуль регистрации Python выводит дополнительную информацию на консоль - PullRequest
2 голосов
/ 17 апреля 2019

Я хотел бы использовать ведение журнала для регистрации информации (в настоящее время та же информация) как для консоли, так и для файла.

Однако я вижу, что на консоль выводится дополнительная нежелательная информация.

Я хотел бы получить следующие выходные данные как для консоли, так и для файла:

INFO - thisuser executed the pipeline at 2019-04-17 13:44:50,626
default log message
other default log message
INFO - pipeline execution completed at 2019-04-17 13:44:50,627
INFO - total time elapsed: 100.4 minutes

Я получаю ожидаемый вывод в файле, но консоль выводит следующее:

INFO:start_log:thisuser
INFO - thisuser executed the pipeline at 2019-04-17 13:44:50,626
INFO:root:default log message
default log message
INFO:root:other default log message
other default log message
INFO:end_log:-
INFO - pipeline execution completed at 2019-04-17 13:44:50,627
INFO:duration_log:100.4
INFO - total time elapsed: 100.4 minutes

Я хотел бы удалить дополнительную информацию (нечетные строки выше), напечатанную на консоли. Любая помощь будет принята с благодарностью!

Ниже приведен код, который я использую:

import logging
import getpass

class DispatchingFormatter:

    def __init__(self, formatters, default_formatter):
        self._formatters = formatters
        self._default_formatter = default_formatter

    def format(self, record):
        formatter = self._formatters.get(record.name, self._default_formatter)
        return formatter.format(record)

logging.basicConfig(level=logging.INFO)

formatter = DispatchingFormatter({
        'start_log': logging.Formatter('%(levelname)s - %(message)s executed the pipeline at %(asctime)s'),
        'end_log': logging.Formatter('%(levelname)s - pipeline execution completed at %(asctime)s'),
        'duration_log': logging.Formatter('%(levelname)s - total time elapsed: %(message)s minutes')
    },
    logging.Formatter('%(message)s'),
)


c_handler = logging.StreamHandler()
c_handler.setFormatter(formatter)
f_handler = logging.FileHandler('log.txt')
f_handler.setFormatter(formatter)

logging.getLogger().addHandler(c_handler)
logging.getLogger().addHandler(f_handler)

logging.getLogger('start_log').info(f'{getpass.getuser()}')

logging.info('default log message')
logging.info('other default log message')

logging.getLogger('end_log').info('-')
time_elapsed = 100.4
logging.getLogger('duration_log').info(f'{time_elapsed}')

Конвейер будет печатать ~ 100 строк информации (результаты анализа), которые мне не хотелось бы добавлять на каком-либо уровне ведения журнала, поэтому я попытался реализовать с использованием нескольких форматеров.

Я знаю, что это довольно хакерское решение ... если у кого-то есть общие предложения по улучшению, это также будет оценено!

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

В документации по logging.basicConfig указано:

Выполняет базовую настройку системы ведения журнала, создав StreamHandler с форматером по умолчанию и добавив его в корневой регистратор.

Итак, обработчик потока уже подключен. Вы можете удалить его, позвонив по номеру:

logging.getLogger().handlers.clear()

перед добавлением других обработчиков.

В качестве альтернативы вы можете использовать logging.getLogger().setLevel(logging.INFO) вместо basicConfig. В этом случае вам не нужно очищать обработчики, так как они не подключены по умолчанию.

0 голосов
/ 18 апреля 2019

После поиска ( Заменить стандартный обработчик Python logger ) и прочтения дополнительной информации по документации (https://docs.python.org/3.7/library/logging.html#), Я нашел рабочее решение.

Я добавил дваобработчики (один для печати на консоль, а другой для печати в файл с заданным форматированием) для обработчика по умолчанию для регистратора, и, очевидно, обработчик по умолчанию для регистратора выводит на консоль те строки, которые мне не нужны.

Решение(возможно, хакерский) - сначала очистить обработчики, выполнив следующее:

logging.basicConfig(level=logging.INFO, filemode='w')

# Added two lines below to first empty out (remove original handler) handlers
root_logger = logging.getLogger()
root_logger.handlers = []

Затем продолжите создавать нужные мне объекты форматирования и добавьте два нужных обработчика (тот же код, что и в вопросе).):

formatter = DispatchingFormatter({
    'start_log': logging.Formatter('%(levelname)s - %(message)s executed the pipeline at %(asctime)s', datefmt='%Y-%m-%d %H:%M:%S'),
    'end_log': logging.Formatter('%(levelname)s - pipeline execution completed at %(asctime)s', datefmt='%Y-%m-%d %H:%M:%S'),
    'duration_log': logging.Formatter('%(levelname)s - total time elapsed: %(message)s minutes')
},
logging.Formatter('%(message)s'),
)


c_handler = logging.StreamHandler()
c_handler.setFormatter(formatter)
f_handler = logging.FileHandler('log.txt', 'w+')
f_handler.setFormatter(formatter)

logging.getLogger().addHandler(c_handler)
logging.getLogger().addHandler(f_handler)
...