Эффективный способ настройки ведения журнала в модуле пакета - PullRequest
11 голосов
/ 28 июля 2010

У меня есть пакет, в котором есть несколько компонентов, которые очень выиграют от использования регистрации и вывода полезной информации.

То, что я не хочу делать, это «настроить» правильное ведение журнала для каждого отдельного файла, где-то вроде этого:

import logging
logging.basicConfig(level=DEBUG)
my_function = logging.getLogger("my_function")
my_class = logging.getLogger("my_class")

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

from util import setlogging
set_logging()

Но даже вышеупомянутое решение не выглядит чистым для меня и может вызвать проблемы, потому что setLogger не имеет __call__ метода. Что мне действительно понравилось, так это то, что мой класс "set_logging" читал из файла конфигурации и имел некоторые значения по умолчанию, так что не было бы никакого значения, какой уровень или какой формат журналирования я хотел, он установил бы его правильно.

Есть ли способ инициализировать правильную регистрацию через доску в моем пакете? Может быть, в файле __init__.py?

И чтобы быть настолько многословным, насколько это возможно, вот как выглядит setlogging (теперь функция, а не класс):

def setlogging(config=None):
    if config == None:
        config = config_options() # sets default values
    levels = {
        'debug': DEBUG,
       'info': INFO
        }

    level = levels.get(config['log_level'])
    log_format = config['log_format']
    datefmt = config['log_datefmt']

    basicConfig(
        level   = level,
        format  = log_format,
        datefmt = datefmt)

Ответы [ 2 ]

12 голосов
/ 28 июля 2010

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

mylogger.warning("Attenzione!")

или тому подобное, а не logging.warning & c. Таким образом, проблема сводится к созданию одного mylogger объекта для всего пакета и его доступности для всех модулей в пакете. (В качестве альтернативы вы можете использовать именованные регистраторы с именами, начинающимися с имени пакета, за которым следует точка, но хотя это очень большая часть функциональности пакета logging, лично я никогда не находил это естественным способом работы).

Итак, за вашей util.setlogging функцией может просто последовать, скажем,

mylogger = logging.getLogger(package_name)

и каждый импортирующий модуль util может просто использовать

util.mylogger.warning('Watch out!')

и тому подобное. Мне кажется, это самый простой подход, если применима концепция, согласно которой весь код в пакете должен регистрироваться одинаково.

1 голос
/ 28 июля 2010

Правильный способ для модуля использовать протоколирование

import logging
logger = logging.getLogger('my_module_name')

и

logger.debug('help!')

становится неактивным, пока кто-то не позвонит logging.basicConfig() (или вариант).

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