Вход в Python - есть ли что-то ниже DEBUG? - PullRequest
17 голосов
/ 28 января 2012

В некоторых других технологиях мы иногда использовали уровень журнала ниже DEBUG, который, как я считаю, назывался «многословным».Я понимаю, что потребность в таком уровне очень субъективна.Но, на мой взгляд, «просто» иметь INFO и DEBUG недостаточно.У нас были случаи, когда нужно было регистрировать что-то очень спам (больше спама, чем отладки).На практике мы производили сборки без этого, но в некоторых случаях мы включали этот уровень ведения журнала после того, как весь продукт был установлен в какой-то настройке QA, отслеживая ошибку и т. Д.

IsЕсть ли способ (простой или нет) для регистрации чего-либо ниже уровня DEBUG, используя стандартную библиотеку журналов python?

В файле temp.py я могу сделать следующее:

logging.addLevelName(5,"verbose")
VERBOSE = 5

logger = logging.getLogger("foo")
logger.setLevel(VERBOSE)
logger.log(VERBOSE,"blah!")

Этоработает, когда я запускаю temp.py в своей IDE (и записывает в stdout), но наши реальные демоны используют стандартный синтаксис конфигурации файла / словаря для настройки ведения журнала, и я не вижу способа указать, что уровень 5 должен использоваться для демона.

Я гоняюсь за чем-то, что на самом деле неосуществимо?

Для тех, кто может задаться вопросом, зачем мне что-то ниже, чем DEBUG, это случайный тип регистрации, который может происходить очень часто (может быть, внутренний цикл), который я обычно не хотел бы видеть даже в DEBUG, но в некоторых производственных системах было бы полезно включить его один раз вбез необходимости добавлять дополнительные записи в исходный код и повторного развертывания, и т. д.

EDIT1 - Очевидно, библиотека ведения журнала допускает настраиваемые уровни.Так как DEBUG - это уровень 10, где-то есть место в диапазоне 1..9Если я определяю пользовательский уровень (например, в приведенном выше примере кода), я думаю, что мой реальный вопрос заключается в том, как включить этот уровень ведения журнала из файла конфигурации журнала json?

EDIT2 - следующее будет работать, еслиэто было не из-за того, что нам нужны / используются файлы конфигурации json (требование, которое я не могу изменить):

import logging

logging.basicConfig(filename='example.log',level=5)
VERBOSE = 5
logging.addLevelName(5,"verbose")
logger = logging.getLogger("bar")
logger.log(VERBOSE,"blah!")

EDIT3 - понял это ... Вызов

logging.addLevelName(5,"VERBOSE")

имеет решающее значение.У меня просто не было этого в нужном месте.В моем случае мне просто нужно было, чтобы вышеуказанный вызов происходил за до вызова из библиотеки журналов dictConfig (...).После того, как я это сделал, я смог зайти в наш файл конфигурации журнала и обработать его (как на обработчике файла, так и на корне) до VERBOSE, и это сработало.

Конечно, сам оператор log неочень элегантно, потому что вы звоните:

self.logger.log(VERBOSE,"Something very spammy")

, а не

self.logger.verbose("Something very spammy")

Но я действительно не хотел изменять какой-либо код библиотеки логгера (был там, сделал это,рубашка).

Спасибо всем!

А тем, кто думает, что ничего более низкого, чем DEBUG, не нужно, больше сил для вас:)

Ответы [ 4 ]

16 голосов
/ 28 января 2012

DEBUG является самым низким уровнем из тех, которые предоставляются модулем регистрации: ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').Их числовые значения здесь: http://docs.python.org/howto/logging.html#logging-levels

Вы можете создать пользовательских уровней (хотя в документах говорится, что это редко бывает необходимо и даже может быть нежелательно).Если вы хотите добавить уровень, метод прост:

>>> logging.addLevelName(5, "VERBOSE")

Несмотря на то, что вы можете добавить пользовательский уровень, может быть лучше добавить некоторые фильтры, которые обеспечивают более тонкийуровень контроля.

11 голосов
/ 04 апреля 2012

Вы можете даже пойти дальше и добавить метод logger.verbose, хотя я настоятельно рекомендую вам этого не делать по разным причинам (в значительной степени описан способ ведения журнала ).Во всяком случае, если вы решите, что вы действительно хотите иметь его, вот код:

logging.VERBOSE = 5
logging.addLevelName(logging.VERBOSE, "VERBOSE")
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs)
10 голосов
/ 16 декабря 2013

Ответ от @voitek прекрасно работает, но он забыл обезьяньему патчу logging.verbose.

logging.VERBOSE = 5
logging.addLevelName(logging.VERBOSE, "VERBOSE")
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs)
logging.verbose = lambda msg, *args, **kwargs: logging.log(logging.VERBOSE, msg, *args, **kwargs)

Теперь он также будет работать;

logging.verbose(*args, **kwargs)
1 голос
/ 09 октября 2018

Добавляя к ответу @ sleepycal, вы также можете добавить подробный метод к LoggerAdapter:

logging.VERBOSE = 5
logging.addLevelName(logging.VERBOSE, "VERBOSE")
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs)
logging.LoggerAdapter.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs)
logging.verbose = lambda msg, *args, **kwargs: logging.log(logging.VERBOSE, msg, *args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...