Я пытаюсь добавить ведение журнала в мое приложение на python, которое имеет несколько модулей и подмодулей.Несколько сайтов говорят о создании дочерних регистраторов в модулях.Преимущество, которое я вижу, состоит в том, что дочерний регистратор наследует родительский конфигурационный файл регистрации, он обеспечивает согласованность для выходных данных журнала (обработчики, форматеры, ...).
Пока я определяю регистратор класса __main__
имя в каждом классе и объедините его с именем текущего класса (parentName.childName
), чтобы получить регистраторы класса модуля.Это не чувствует себя ни правильным, ни масштабируемым.Как я могу улучшить это, чтобы мне не приходилось жестко кодировать имя регистратора классов __main__
в каждом классе?Вот как выглядит мой код:
Py-файл, который я запускаю:
###app.py
import logging
from SubModule1 import *
class myApplication():
loggerName='myAPI'
def __init__(self, config_item_1=None,config_item_2=None,...config_item_N=None):
self.logger=self.logConfig()
self.logger.info("Starting my Application")
self.object1=mySubClass1(arg1, arg2, ... argM)
def logConfig(self):
fileLogFormat='%(asctime)s - %(levelname)s - %(message)s'
consoleLogFormat='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
# create logger
#logger = logging.getLogger(__name__)
logger = logging.getLogger(self.loggerName)
logger.setLevel(logging.DEBUG)
####CONSOLE HANDLER####
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# create formatter
consoleFormatter = logging.Formatter(consoleLogFormat)
# add formatter to ch
ch.setFormatter(consoleFormatter)
# add ch to logger
logger.addHandler(ch)
####FILE HANDLER####
# create file handler and set level to debug
fh = logging.FileHandler('API_Log.txt')
fh.setLevel(logging.DEBUG)
# create formatter
fileFormatter = logging.Formatter(fileLogFormat)
# add formatter to ch
fh.setFormatter(fileFormatter)
# add ch to logger
logger.addHandler(fh)
logger.info('Logging is started!!')
return logger
def connect(self):
self.logger.info("Connecting to API")
self.object1.connect()
if __name__=="__main__":
config={"config_item_1": x,
"config_item_2": y,
...
"config_item_N": z
}
myApp=myApplication(config['config_item_1'],config['config_item_2'],...config['config_item_N'])
myApp.connect()
Модуль:
###SubModule1.py
import logging
import app
class mySubClass1():
appRootLoggerName='myAPI'
def __init__(self,item1):
self.logger=logging.getLogger(self.appRootLoggerName + '.'+mySubClass1.__name__)
self.logger.debug("mySubClass1 object created - mySubClass1")
self.classObject1=item1
Строка ниже - та, которая беспокоит меня,Какая альтернатива self.appRootLoggerName + '.'+mySubClass1.__name__)
будет поддерживать одинаковую конфигурацию ведения журнала для всех модулей / классов моего приложения?
logging.getLogger(self.appRootLoggerName + '.'+mySubClass1.__name__)