правый.Я использую достаточно сложную (для меня) объектно-ориентированную модель и хочу привести свои результаты в порядок.Ранее я просто использовал 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
, и просто не реплицировал его, если он есть, но документы на этом довольно сложны для понимания, и этополучил меня в тупик.
Есть предложения?Спасибо!