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.
Если "logger.setLevel(sys.maxint)" правильный вариант, то сойдёт. Спасиб.
Что касается NullHandler, то не хотелось бы, чтобы код, коорый управляет уровнем логирования изменял обхект logger как либло ещё, кроме использования метода setLevel.
е хотелось бы, чтобы код, коорый управляет уровнем логирования изменял обхект logger как либло ещё, кроме использования метода setLevel.
Вообще-то, установка handler'ов и formatter'ов относится к нормальной процедуре настройки логгера. Есть даже прибамбас, который позволяет всё это развесистое хозяйство внешним конфигом настраивать: http://docs.python.org/release/2.6/library...l#configuration
Но если предполагается, что отключение — лишь одно из «уровней журналирования», то через setLevel, конечно, правильнее.
Вообще-то, установка handler'ов и formatter'ов относится к нормальной процедуре настройки логгера.
Да, нормально. Но мне хотелось в некоторых случаях отключать логирование для одного, "главного", модуля. И чтобы этот код ничего не делал с рутовым логером и как бы не знал про него.
logging.getLogger().setLevel(sys.maxint) # задираем уровень логирования для рутового логера
...
logger = logging.getLogger("main")
...
logger.setLevel(logging.NOTSET)
logger.debug("test") # отправится на рутовый логгер, который, в текущей реализации, просто всё заглушит
P.S.: но, кстати говоря, нигде не увидел аналогичного решения с "setLevel(sys.maxint)"...