Регистрация через подмодули - как получить доступ к имени родительского регистратора из подмодулей? - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь добавить ведение журнала в мое приложение на 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__)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...