Запретить двойной вывод из библиотеки журналов Python - PullRequest
0 голосов
/ 18 мая 2018

правый.Я использую достаточно сложную (для меня) объектно-ориентированную модель и хочу привести свои результаты в порядок.Ранее я просто использовал print() для вывода выходных данных в консоль и подключал к ним функции if, если я хочу включать и выключать разные.Хотя в базовом коде это работает нормально, я немного не приклеен к этому проекту (что на порядок больше, чем то, что я пробовал раньше).Я понимаю, что библиотека журналов python позволяет мне делать это намного аккуратнее и выводить в лог-файл и т. Д.

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

def set_logger(file_name):
    '''sets up output via loggers and a output file.'''
    output = ('%(asctime)-20s %(filename)-15s %(funcName)-15s %(levelname)-8s %(message)s')
    logging.basicConfig(level=logging.DEBUG,
                        format=output,
                        filename=file_name,
                        filemode='w')
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    formatter = logging.Formatter('%(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    return

Этот код выводит все изуровень DEBUG и до файла журнала, при отображении INFO и до консоли.

Моя проблема заключается в том, что регистратор остается активным после завершения выполнения, поэтому я получаю двойные строкивывода на консоль (хотя и не в лог-файле) в первый раз, когда я запускаю его, и в три раза в следующий раз и так далее ... Я предполагаю, что это как-то связано с этой строкой: logging.getLogger('').addHandler(console), потому что я добавляюновый обработчик каждый раз, когда я запускаю код.

Существует ли установленный способ избежать этого?Я хотел бы иметь возможность запускать код в обычном режиме, чтобы он определял, существует ли существующий экземпляр console, и просто не реплицировал его, если он есть, но документы на этом довольно сложны для понимания, и этополучил меня в тупик.

Есть предложения?Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

ОК, как только я опубликовал вопрос, наткнулся на этот ответ , который, хоть и быстрый и грязный, делает свое дело.Добавляя этот код в начале, стираем список обработчиков, и мы просто добавляем новый каждый раз.Менее элегантный, чем экверрес , но он делает свою работу ...

root_logger.handlers = []
0 голосов
/ 18 мая 2018

Просто проверьте, есть ли у вашего RootLogger (logging.getLogger('')) обработчик:

def set_logger(file_name):
    '''sets up output via loggers and a output file.'''
    output = ('%(asctime)-20s %(filename)-15s %(funcName)-15s %(levelname)-8s %(message)s')
    logging.basicConfig(level=logging.DEBUG,
                        format=output,
                        filename=file_name,
                        filemode='w')
    root_logger = logging.getLogger('')
    if len(root_logger.handlers) > 0: # verifies if it has already a handler
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        formatter = logging.Formatter('%(message)s')
        console.setFormatter(formatter)
        root_logger.addHandler(console)

Однако, если в будущем у вас будет более одного обработчика, и вы хотите проверить, используется ли один конкретный обработчикваш регистратор, вы можете назвать ваши обработчики, чтобы быть более точным:

def set_logger(file_name):
    '''sets up output via loggers and a output file.'''
    output = ('%(asctime)-20s %(filename)-15s %(funcName)-15s %(levelname)-8s %(message)s')
    logging.basicConfig(level=logging.DEBUG,
                        format=output,
                        filename=file_name,
                        filemode='w')
    root_logger = logging.getLogger('')
    # Verify if there is already a handler named "console"
    if any((handler.name == "console" for handler in root_logger.handlers)):
        console = logging.StreamHandler()
        console.name = "console"
        console.setLevel(logging.INFO)
        formatter = logging.Formatter('%(message)s')
        console.setFormatter(formatter)
    root_logger.addHandler(console)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...