Python: Предупреждения и регистрация подробного ограничения
Вопрос
Я хочу объединить все средства ведения журнала моего приложения. Любое предупреждение вызывает исключение, затем я ловлю его и передаю регистратору. Но вопрос: есть ли в журнале какой-нибудь немой объект? Иногда регистратор становится слишком многословным. Иногда из-за слишком шумных предупреждений, есть ли какой-нибудь подробный предел в предупреждениях?
Решение
Мало того, что есть уровни журнала , но есть действительно гибкий способ их настройки . Если вы используете именованные объекты logger
(например, logger = logging.getLogger (...)
), вы можете настроить их соответствующим образом. Это позволит вам настраивать многословность для каждой подсистемы, где подсистема определяется иерархией ведения журналов.
Другой вариант - использовать logging.Filter
и фильтры предупреждений для ограничения вывода , Я не использовал этот метод раньше, но, похоже, он лучше подходит для ваших нужд.
Прочитайте PEP-282 хорошее описание в прозе пакет Python logging
. Я думаю, что он описывает функциональность гораздо лучше, чем документация к модулю.
Изменить после уточнения
Возможно, вам удастся обработать часть ведения журнала, используя пользовательский класс, основанный на logging.Logger
и зарегистрированный в logging.setLoggerClass ()
. Похоже, вы хотите что-то похожее на " последнее сообщение syslog, повторенное 9 раз " . К сожалению, я нигде не знаю о реализации этого. Возможно, вы захотите узнать, поддерживает ли twisted.python.log эта функциональность.
Другие советы
из самого источника, который вы упомянули. есть лог-уровни, используйте с умом; -)
LEVELS = {'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL}
Это будет проблемой, если вы планируете выполнять все журналы вызовов от какого-либо слепого обработчика ошибок, который ничего не знает о коде, вызвавшем ошибку, как звучит ваш вопрос. Как вы решите, какие звонки регистрируются, а какие нет?
Более стандартная практика - использовать такие блоки для восстановления, если это возможно, и регистрировать ошибку (на самом деле, если это ошибка, к которой вы не были специально подготовлены, вы хотите знать о ней; используйте высокий уровень) , Но не полагайтесь на эти блоки для всей вашей информации о состоянии / отладке. Лучше посыпать ваш код журналом вызовов, прежде чем он попадет в обработчик ошибок. Таким образом, вы можете наблюдать полезную информацию о системе во время выполнения, когда она НЕ дает сбоя, и вы можете делать журналы вызовов разной степени серьезности. Например:
import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger. Change this for better organization
# Add your appenders or what have you
def handle_error(e):
logger.error("Unexpected error found")
logger.warn(format_exc()) #put the traceback in the log at lower level
... #Your recovery code
def do_stuff():
logger.info("Program started")
... #Your main code
logger.info("Stuff done")
if __name__ == "__main__":
try:
do_stuff()
except Exception,e:
handle_error(e)