Как передать пользовательский регистратор из файла в несколько модулей и при этом сохранить гранулярность субмодуля? - PullRequest
0 голосов
/ 26 марта 2020

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

class logger:
    def __init__(self):
        self.filelocation = 'log/util.log'
        self.loggers = {}
    def init_logger(self,name="util",):
        if self.loggers.get(name):
            return self.loggers.get(name)
        else:
            module_logger = logging.getLogger(name)
            module_logger.setLevel(logging.DEBUG)
            module_logger.propagate = False
            # create file handler which logs even debug messages
            fh = logging.FileHandler(self.filelocation)
            fh.setLevel(logging.DEBUG)

            # create console handler with a higher log level
            ch = logging.StreamHandler(sys.stdout)
            ch.setLevel(logging.WARNING)

        # create formatter and add it to the handlers
        formatter = logging.Formatter('%(module)s : %(levelname)s : %(asctime)s : %(name)s : %(message)s')

        fh.setFormatter(formatter)
        ch.setFormatter(formatter)
        # add the handlers to the logger
        module_logger.addHandler(fh)
        module_logger.addHandler(ch)
        self.loggers[name] = module_logger
        return module_logger

Теперь у меня есть несколько модулей, ссылающихся на вышеуказанный регистратор. Для ex

# mod1.py
logsession = logger().init_logger(name = "athena_s3")
dictsession = logger().init_logger(name = "dictinfo")
class mod1_class(): 
    def __init__(self):
        self.var1 = etc
    def build_session(self):
        """

        Build a session using the athena client

        Input: None

        Return: Active session

        """
        if not self._session:
            try:
                self._session = Session(aws_access_key_id = self._aws_access_key_id,aws_secret_access_key = self._aws_secret_access_key)
                logsession.info("Built new athena session")

Аналогично у меня есть другой модуль, который может ссылаться на код из вышеупомянутого mod1.py. Теперь рассмотрим файл test.py, который импортирует этот mod1.py.

from mod1 import mod1_class
session = mod1_class().build_session()

### Do STUFF

Как передать регистратор из нескольких test.py в mod1.py, чтобы он поддерживал один и тот же регистратор? Так, например:

журналы могут быть

test : INFO : time : athena_s3 : message
test : INFO : time : athena_s3 : athena_util : message
test2: INFO : time : athena_s2 : message
...