Я использую модуль логов Python и хочу на некоторое время отключить ведение логов консоли, но это не работает.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
Приведенный выше код отображает bla bla
on-stdout, и я не знаю, как можно безопасно отключить обработчик консоли. Как я могу быть уверен, что я временно удаляю консоль StreamHandler, а не другую?
logger.handlers
оно должно быть пустым (как оно предшествуетlogger.debug()
вызову). Отображается только рассматриваемый код[]
(пустой список обработчиков). Проверено на Python 2.7.15 и Python 3.6.6.Ответы:
Я нашел решение для этого:
Это предотвратит отправку журналов на верхний регистратор, который включает журналирование консоли.
источник
INFO
сообщения), вы можете изменить вторую строку на что-то вродеlogger.setLevel(logging.WARNING)
logging.lastResort
обработчик по-прежнему будет регистрировать сообщения с серьезностьюlogging.WARNING
и вышеsys.stderr
в отсутствие других обработчиков. Смотри мой ответ .Я использую:
источник
logging
уровне модуля, чтобы полностью отключить ведение журнала , напримерimport logging; logging.disable(logging.CRITICAL);
:: docs.python.org/2/library/logging.html#logging.disabledisabled
Атрибут не является частью общественного API. См. Bugs.python.org/issue36318 .Ты можешь использовать:
где ваш_уровень является одним из таких:
Итак, если вы установите your_level в logging.CRITICAL , вы получите только критические сообщения , отправленные:
Установка your_level для ведения журнала. DEBUG покажет все уровни ведения журнала.
Для более подробной информации, пожалуйста, взгляните на примеры регистрации.
Таким же образом, чтобы изменить уровень для каждого обработчика, используйте функцию Handler.setLevel () .
источник
(давно мертвый вопрос, но для будущих искателей)
Ближе к исходному коду / намерению автора, это работает для меня в Python 2.6
Я должен был решить, что нужно убрать обработчик stdout после добавления нового; Код регистратора автоматически добавляет stdout, если нет обработчиков.
источник
logger = logging.getLogger(); lhStdout = logger.handlers[0]
неверна, поскольку у корневого регистратора изначально нет обработчиков -python -c "import logging; assert not logging.getLogger().handlers"
. Проверено на Python 2.7.15 и Python 3.6.6.Контекстный менеджер
Пример использования:
источник
Чтобы полностью отключить ведение журнала :
Чтобы включить ведение журнала :
Другие ответы обеспечивают обходные пути, которые не полностью решают проблему, такие как
и для некоторых
n
больше 50,Проблема с первым решением заключается в том, что он работает только для корневого регистратора. Другие регистраторы, созданные, скажем,
logging.getLogger(__name__)
не отключаются этим методом.Второе решение влияет на все журналы. Но это ограничивает вывод уровнями выше заданного, так что можно переопределить его, войдя в систему с уровнем выше 50.
Это может быть предотвращено
что, насколько я могу судить (после просмотра источника ), является единственным способом полностью отключить ведение журнала.
источник
Здесь есть несколько действительно хороших ответов, но, видимо, самый простой не принимается во внимание (только от Infinito).
Это отключает корневой регистратор и, следовательно, все остальные регистраторы. Я действительно не проверял, но это должно быть также самым быстрым.
Из кода входа в Python 2.7 я вижу это
Это означает, что когда он отключен, никакой обработчик не вызывается, и он должен быть более эффективным, чем фильтрация с очень высоким значением или установка, например, неоперативного обработчика.
источник
log = logging.getLogger(__name__)
disabled
Атрибут не является частью общественного API. См. Bugs.python.org/issue36318 .Не нужно отвлекать стандартный вывод. Вот лучший способ сделать это:
Еще более простой способ:
источник
logging.basicConfig()
функции (выделено мое): выполняет базовую настройку для системы ведения журнала, создав StreamHandler с Formatter по умолчанию и добавив его в корневой регистратор. Функции debug (), info (), warning (), error () и crit () будут автоматически вызывать basicConfig (), если для корневого регистратора не определены обработчики . - docs.python.org/3/library/logging.html#logging.basicConfigЯ не очень хорошо знаю модуль регистрации, но я использую его так, как обычно хочу отключить только сообщения отладки (или информацию). Вы можете использовать,
Handler.setLevel()
чтобы установить уровень регистрации на КРИТИЧЕСКИЙ или выше.Также вы можете заменить sys.stderr и sys.stdout файлом, открытым для записи. См. Http://docs.python.org/library/sys.html#sys. стандартный вывод . Но я бы не рекомендовал это.
источник
[]
.Вы также можете:
источник
app.logger
который вы даже не указываете вместо корневого логгера, явно упомянутого в вопросе (logging.getLogger()
) и большинстве ответов? Откуда вы знаете, что вы можете безопасно изменятьhandlers
свойство вместо вызоваLogger.addHandler
метода?Консольный вывод:
Содержимое файла test.log:
источник
Изменяя один уровень в «logging.config.dictConfig», вы сможете поднять весь уровень ведения журнала на новый уровень.
})
источник
Нашли элегантное решение с использованием декораторов , которое решает следующую проблему: что, если вы пишете модуль с несколькими функциями, каждая из которых имеет несколько сообщений отладки, и вы хотите отключить вход во все функции, кроме той, на которой вы сейчас сосредоточены?
Вы можете сделать это с помощью декораторов:
Затем вы можете сделать:
Даже если вы позвоните
function_already_debugged
изнутриfunction_being_focused
, отладочные сообщенияfunction_already_debugged
не будут показаны. Это гарантирует, что вы увидите только отладочные сообщения от функции, на которой вы сосредоточены.Надеюсь, поможет!
источник
Если вы хотите временно отключить определенный регистратор, вот что сделано.
Пример журнала
Код
источник
В библиотеке Logging Python можно полностью отключить ведение журналов (для всех уровней) для конкретного регистратора, выполнив одно из следующих действий:
Добавление в регистратор
logging.NullHandler()
обработчика (чтобыlogging.lastResort
обработчик не регистрировал события серьезностиlogging.WARNING
и вышеsys.stderr
) и установкиpropagate
атрибута этого регистратора вFalse
(чтобы регистратор не передавал события обработчикам своих регистраторов-предков).Используя основной API:
Используя API конфигурации:
Добавление в логгер
lambda record: False
фильтра.Используя основной API:
Используя API конфигурации:
Предупреждение. - В отличие от 1-го решения, 2-е решение не отключает ведение журнала от дочерних регистраторов (например
logging.getLogger("foo.bar")
), поэтому его следует использовать только для отключения ведения журнала для одного регистратора.Заметка. - Установка
disabled
атрибута логгераTrue
не является третьим решением, так как он не является частью общедоступного API. Смотрите https://bugs.python.org/issue36318 :источник
подкласс обработчик, который вы хотите временно отключить:
найти обработчик по имени довольно просто:
однажды найденный:
источник