Эффективный способ установки Logging через Модуль Пакета

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

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

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 не имеет a __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)
11
задан alfredodeza 28 July 2010 в 00:08
поделиться

2 ответа

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

mylogger.warning("Attenzione!")

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

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

mylogger = logging.getLogger(package_name)

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

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

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

12
ответ дан 3 December 2019 в 08:53
поделиться

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

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

, а

logger.debug('help!')

становится бездействующим, пока кто-то не вызовет logging.basicConfig () (или вариант).

1
ответ дан 3 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: