Дополнительно
Динамически изменяя уровень журнала без перезапуска приложения
Можно ли изменить уровень ведения журнала, используя fileConfig в Python без перезапуска приложения. Если он не может быть достигнуто через fileConfig есть другой способ получить тот же результат?
Обновление: это было за приложение, запущенное на сервере, я хотел, чтобы системные администраторы могли изменить конфигурационный файл, который будет принят во время выполнения приложения и динамически изменять уровень лог. Я работал с gevent в то время, следовательно, я'ве добавил мой код как один из ответов, который использует inotify для выбрать изменения в файл config.
54
7
fileConfig
- это механизм, чтобы настроить уровень журнала для вас на основе файла; вы можете изменить его в любое время в вашей программе.Звоните
.setLevel()
на объекте ведение журнала, для которого вы хотите изменить уровень журнала. Как правило, вы'd сделать это на корню:В дополнение к принятым ответ: в зависимости от того, как вы инициализировали регистратор, вам может также потребоваться обновить регистратор'обработчики с:
Можно конечно использовать fileConfig ()
, чтобы изменить конфигурацию ведения журнала на лету, хотя для простого изменения программного подхода, как полагают в Мартин Питерс' ответ может быть соответствующий. Лесозаготовки еще предоставляет сервер сокет для прослушивания для настройки с помощью
слушать ()stopListening /
Апис ()`, как описано здесь. Чтобы сделать ведение журнала, чтобы слушать определенный порт, вы используетеи чтобы остановить прослушивание, звоните
Чтобы отправить данные на сервер, можно использовать, например,
Обновление: из-за обратной совместимости ограничения, внутренние реализации fileConfig()
вызов означает, что вы можете'т указать disable_existing_loggers=false
в вызов, который делает эту функцию менее полезны в определенных ситуациях. Вы можете использовать тот же API для отправки JSON-файл с помощью dictConfig схемы, что позволит лучше контролировать реконфигурации. Это требуется Python 2.7/3.2 или выше (где dictConfig () был добавлен). Или, вы можете использовать stdlib код, чтобы реализовать свой собственный слушатель, который работает таким же образом, но с учетом ваших конкретных потребностей.Расширение на sfinken'ы ответ, и Стармена'с последующим комментарием, вы также можете проверить тип обработчика для конкретного outputter - например:
ведение журнала импорта регистратор = лесозаготовок.getLogger() для обработчика в регистратор.обработчики: если isinstance(обработчик, тип(лесозаготовки.StreamHandler())): обработчик.setLevel(лесозаготовки.Отладки) логгер.отладка('ведение журнала отладки включен')
Это может быть то, что вы ищете:
Обратите внимание, что
getLogger()
вызывается без аргументов возвращает корневой регистратор.Я, наконец, поселился с использованием inotify и gevent, чтобы проверить наличие файла операция записи, и еще я знаю, что файл был изменен, то я пойду и установить уровень для каждого регистратора у меня на основе конфигурации.
Приведенный выше код используется как ниже,
Когда у меня появится новый лог-файл конфигурации, я могу перевести в нужный уровень детализации для каждого регистратор из конфига. Я просто хотел поделиться ответом, и это может помочь кому-то, если они пытаются использовать его с gevent.
В зависимости от вашего приложения, вы должны сначала найти способ для перезагрузки это файл или сброс уровня журнала, основываясь на собственный конфигурационный файл во время выполнения.
Проще всего будет использовать таймер. Как с помощью нитки делать, или сделать асинхронных основы для этого (если вы используете любой; как правило, они реализуют ее).
Использование потоков.Таймер:
Выход:
Обновление: Пожалуйста, проверьте решение, предложенное Мартейн Питерс.