Python, logging, отключение корневого логера

Модератор: Модераторы разделов

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Python, logging, отключение корневого логера

Сообщение serzh-z »

Есть код:

Код: Выделить всё

import logging
logger = logging.getLogger('foo')
logger.addHandler(logging.StreamHandler())

verbose = logging.NOTSET
logger.setLevel(verbose) # ключевой момент

logger.critical('Must be silent')
Как кошерно сделать так, чтобы при установке уровня логирования для logging.NOTSET для логгера "foo" вообще пропадало логирование?

Сейчас оно, как понимаю, отправляется на корневой логгер, а тот, в свою очередь, всё валит в консоль. Делать приседания в виде "if verbose == logging.NOTSET # DO SOME MAGIC" не хотелось бы.

P.S.: чтобы было понятнее - у приложения есть аргумент "-v{0-5}" который напрямую управляет уровнем логирования объекта logger.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python, logging, отключение корневого логера

Сообщение watashiwa_daredeska »

Код: Выделить всё

logger.setLevel(sys.maxint)
Или назначить ему NullHandler, как описано тут: http://docs.python.org/release/2.6/library...g-for-a-library
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Python, logging, отключение корневого логера

Сообщение serzh-z »

Если "logger.setLevel(sys.maxint)" правильный вариант, то сойдёт. Спасиб.

Что касается NullHandler, то не хотелось бы, чтобы код, коорый управляет уровнем логирования изменял обхект logger как либло ещё, кроме использования метода setLevel.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Python, logging, отключение корневого логера

Сообщение watashiwa_daredeska »

serzh-z писал(а):
20.10.2010 01:01
е хотелось бы, чтобы код, коорый управляет уровнем логирования изменял обхект logger как либло ещё, кроме использования метода setLevel.
Вообще-то, установка handler'ов и formatter'ов относится к нормальной процедуре настройки логгера. Есть даже прибамбас, который позволяет всё это развесистое хозяйство внешним конфигом настраивать: http://docs.python.org/release/2.6/library...l#configuration

Но если предполагается, что отключение — лишь одно из «уровней журналирования», то через setLevel, конечно, правильнее.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Python, logging, отключение корневого логера

Сообщение serzh-z »

watashiwa_darede... писал(а):
20.10.2010 01:20
Вообще-то, установка handler'ов и formatter'ов относится к нормальной процедуре настройки логгера.
Да, нормально. Но мне хотелось в некоторых случаях отключать логирование для одного, "главного", модуля. И чтобы этот код ничего не делал с рутовым логером и как бы не знал про него.

В общем, помогла это:

Код: Выделить всё

logging.getLogger().setLevel(sys.maxint) # задираем уровень логирования для рутового логера
...
logger = logging.getLogger("main")
...
logger.setLevel(logging.NOTSET)
logger.debug("test") # отправится на рутовый логгер, который, в текущей реализации, просто всё заглушит


P.S.: но, кстати говоря, нигде не увидел аналогичного решения с "setLevel(sys.maxint)"...
Спасибо сказали: