Обработчики журналов пустые - почему не работает регистрация TimeRoatingFileHandler
Поэтому я делаю logging.config.fileConfig, чтобы настроить логирование из конфига файла с консолью и обработчиком файла. Затем я делаю logging.getLogger (имя), чтобы получить мой логгер и лог. В определенные моменты времени я хочу, чтобы имя файла обработчика файлов менялось, т. Е. Log rotate (я не могу использовать ротатор времени из-за некоторых проблем с платформой Windows), поэтому для этого я вызываю logger.handlers - он показывает пустой список, поэтому я не могу закрыть их!! Однако, когда я перехожу через отладчик, он явно не пустой (ну, конечно, без него я не смогу войти правильно)
Не уверен, что здесь происходит, какие-то ошибки, которые я скучаю?
Ценю любую помощь. Благодарю.
3 ответа
Кажется, вам нужно правильно получить root logger:
logger = logging.getLogger(__name__)
handlers = logger.handlers[:]
print('module {}'.format(handlers))
print('module {}'.format(logger.hasHandlers()))
logger = logging.getLogger('root')
handlers = logger.handlers[:]
print('root {}'.format(handlers))
print('root {}'.format(logger.hasHandlers()))
logger = logging.getLogger()
handlers = logger.handlers[:]
print('blank {}'.format(handlers))
print('blank {}'.format(logger.hasHandlers()))
выход:
модуль []
модуль True
root []
Корень Правда
пустой
[<logging.handlers.RotatingFileHandler object at 0x108d82898>, <logging.StreamHandler object at 0x108d826d8>]
пусто Правда
Во-первых, проблема в том, что если вы используете файл конфигурации для инициализации ведения журнала с помощью обработчиков файлов и консоли, то он не заполняет список logging.handlers, поэтому вы не можете перебирать его и закрывать + очищать потоки до открытия нового с помощью новое имя файла журнала.
Если вы хотите использовать TimeRotatingFileHandler или RotatingFileHandler, он находится в файле logging/handler.py, и когда он пытается выполнить переворачивание, он закрывает только свой собственный поток, так как он не имеет представления о том, что может делать родительский класс ведения журнала (в основном одноэлементный). есть открыть. И поэтому, когда вы выполняете опрокидывание, происходит блокировка файла (обработчик файлов), и все это не работает.
Таким образом, решение (для меня) состоит в том, чтобы инициализировать ведение журнала программно и использовать addHandlers при ведении журнала, который также заполняет logging.handlers [], который я затем использую, чтобы перебрать мой обработчик консоли / файла и закрыть их перед тем, как вручную повернуть файл.
Для меня это выглядит как очевидная ошибка с классом журналирования, и если он работает на Unix - это действительно не должно.
Спасибо всем, особенно @falsetru за вашу помощь.
Возможно, нет такого имени, как "TimeRoatingFileHandler", потому что вы пропустили "d" в слове "Timed". Так и должно быть: 'TimedRoatingFileHandler'
Ты можешь использовать RotatingFileHandler
(не TimedRotatingFileHandler
).
призвание doRollover
обработчик будет вращать файлы журнала.