У меня есть пакет, который имеет несколько компонентов в нем, которые извлекли бы выгоду значительно из использования входа и вывода полезной информации.
То, что я не хочу делать, должно 'установить' надлежащий вход для каждого файла с где-нибудь вдоль этих строк:
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)
Если вы хотите, чтобы весь код в различных модулях вашего пакета использовался тот же объект регистратора, вам просто нужно (сделать этот регистратор доступным - см. ниже - и) вызвать
mylogger.warning("Attenzione!")
или что-то подобное, а не logging.warning
и c. Таким образом, проблема сводится к созданию одного объекта mylogger
для всего пакета и обеспечению его доступности во всех модулях пакета. (В качестве альтернативы вы можете использовать именованные регистраторы с именами, начинающимися с имени пакета, за которым следует точка, но, хотя это очень важная часть функциональности пакета logging
, я лично никогда не считал это естественным способом работать).
Итак, ваша функция util.setlogging
может сопровождаться, скажем,
mylogger = logging.getLogger(package_name)
, и каждый модуль, который импортирует util
, может просто использовать
util.mylogger.warning('Watch out!')
и т.п. Мне кажется, что это самый простой подход, если применяется концепция, согласно которой весь код в пакете должен регистрироваться одинаково.
Правильный способ для модуля использовать ведение журнала -
import logging
logger = logging.getLogger('my_module_name')
, а
logger.debug('help!')
становится бездействующим, пока кто-то не вызовет logging.basicConfig ()
(или вариант).