2015-06-02 2 views
0

Запись в Python очень помогает мне создавать транскрипты сценариев фоновой обработки.python logging basic Как использовать

Я до сих пор использовали базовую конфигурацию:

import logging 
LOG_FILENAME = 'example.log' 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG) 

logging.debug('This message should go to the log file') 

, как объяснено в документации Python: 15.6. logging. Хорошая вещь сделать это таким образом, что вы можете использовать строку:

logging.debug('This message should go to the log file') 

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

Существует еще один способ сделать то же самое, что идет что-то вдоль этих линий:

my_logger = logging.getLogger('MyLogger') 
my_logger.setLevel(logging.DEBUG) 
my_logger.debug('Test string') 

Что то же самое, кроме того, что теперь у вас есть экземпляр, чтобы следить за: my_logger. Мои модули и классы не знают, как назван регистратор дня, и необходимость передавать другую переменную вокруг будет громоздкой. Я подозреваю, что мне не хватает чего-то очень элементарного, либо мое использование модуля протоколирования является неисправным, а работает только благодаря некоторому сбою или второму методу тоже должно быть очень просто.

Я хочу переключиться на второй метод, потому что это единственный способ использовать дополнительные функции, такие как RotatingFileHandler.

ответ

0

Из документации (https://docs.python.org/2/library/logging.html):

несколько вызовов getLogger() с тем же именем всегда будет возвращать ссылку на тот же объект Logger.

Таким образом, вы могли бы уйти, не пройдя мимо другой переменной.

Кроме того, регистраторы образуют иерархию:

"регистраторы с именами foo.bar, foo.bar.baz и foo.bam все потомки Foo"

Таким образом, документация рекомендует использовать:

logging.getLogger(__name__) 

И таким образом организуйте регистраторы так же, как вы организуете свои модули.

+0

Oooooh! Это волшебство, как известно, что я был там раньше? – Bastiaan

+0

Ну, я не уверен, как это реализовано, но, возможно, используя какую-то статическую переменную, содержащую словарь с созданными журналами. – eugenioy

+0

И что я должен назвать своим регистратором, чтобы продолжать использовать модули, как они есть, с линией -logging.debug («test») - в них? – Bastiaan

0

В своих проектах я обычно определяют один Logger экземпляр каждого модуля, LOGGER = logging.getLogger(__name__), а затем просто найти и заменить все виды использования logging.XXX с LOGGER.XXX.

На самом деле вам не нужно использовать именованные регистраторы, чтобы воспользоваться RotatingFileHandler и другими функциями. когда вы делаете простой вызов logging.info, он использует регистратор по умолчанию с именем "" (пустая строка). Вы можете прикреплять обработчики к этому регистратору, как и к любому другому.

+0

Спасибо! это работает. logging.getLogger (""). – Bastiaan

Смежные вопросы