Python: Предупреждения и регистрация подробного ограничения

StackOverflow https://stackoverflow.com/questions/1417665

  •  07-07-2019
  •  | 
  •  

Вопрос

Я хочу объединить все средства ведения журнала моего приложения. Любое предупреждение вызывает исключение, затем я ловлю его и передаю регистратору. Но вопрос: есть ли в журнале какой-нибудь немой объект? Иногда регистратор становится слишком многословным. Иногда из-за слишком шумных предупреждений, есть ли какой-нибудь подробный предел в предупреждениях?

http://docs.python.org/library/logging.html

http://docs.python.org/library/warnings.html

Это было полезно?

Решение

Мало того, что есть уровни журнала , но есть действительно гибкий способ их настройки . Если вы используете именованные объекты 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top