Разница в механизме регистрации: API и приложение (python) - PullRequest
2 голосов
/ 13 апреля 2010

В настоящее время я пишу API и приложение, которое использует API. Я получил предложения от людей, заявляющих, что я должен выполнить ведение журнала с помощью обработчиков в приложении и использовать объект «logger» для входа в систему из API.

В свете совета, который я получил выше, правильна ли следующая реализация?

class test:
    def __init__(self, verbose):
        self.logger = logging.getLogger("test")
        self.logger.setLevel(verbose)

    def do_something(self):
        # do something
        self.logger.log("something")
        # by doing this i get the error message "No handlers could be found for logger "test"

Реализация, которую я имел в виду, была следующей:

 #!/usr/bin/python

 """ 
 ....
 ....
 create a logger with a handler 
 ....
 ....

 """

 myobject = test()
 try:
     myobject.do_something()
 except SomeError:
     logger.log("cant do something")

Я d like to get my basics strong, i буду благодарен за любую помощь и предложения по коду, который вы могли бы порекомендовать. Я ищу.

Thnkx!

Ответы [ 3 ]

8 голосов
/ 13 апреля 2010

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

Что касается механики каротажа, я бы сделал следующие наблюдения:

  1. Вам не нужно иметь регистратор в качестве члена экземпляра. Более естественно объявлять регистраторы на уровне модуля, используя logger = logging.getLogger(__name__), и это также будет работать должным образом в подпакетах.
  2. Ваш вызов logger.log ("message"), скорее всего, все равно не удастся, потому что метод log имеет уровень в качестве первого аргумента, а не сообщение.

Вы должны объявить обработчики, и если ваш сценарий использования довольно прост, вы можете сделать это в вашем методе main или if __name__ == '__main__':, добавив, например,

logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')

, а затем в другом месте вашего кода, просто сделайте, например,

import logging
logger = logging.getLogger(__name__)

один раз в верхней части каждого модуля, где вы хотите использовать ведение журнала, а затем

logger.debug('message with %s', 'arguments') # or .info, .warning, .error etc.

в вашем коде, где это необходимо.

2 голосов
/ 13 апреля 2010

Опасность паттерна, о котором вы думаете, заключается в том, что в конечном итоге вы можете эффективно скрывать исключения, помещая их в журнал. Многие исключения действительно должны вызывать сбой вашей программы, потому что они представляют проблему, которую необходимо исправить. Как правило, более полезно иметь возможность войти в код с помощью отладчика, чтобы выяснить, что вызвало исключение.

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

1 голос
/ 13 апреля 2010

Я обычно делаю следующее:

import logging
import logging.config
logging.config.fileConfig('log.congig')

# for one line log records 
G_LOG = logging.getLogger(__name__)
# for records with stacktraces
ST_LOG = logging.getLogger('stacktrace.' + __name__)


try:
    # some code
    G_LOG.info('some message %s %s', param1, param2)
except (StandardError,):
    message = 'some message'
    G_LOG.error(message)
    # exc_info appends stacktrace to the log message
    ST_LOG.error(message, exc_info=True)

Формат файла конфигурации можно увидеть в руководстве по Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...