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

У меня есть 3 класса:

Class1 -> Использует SameClassA -> Использует SameClassB

Class2 -> Использует SameClassA -> Использует SameClassB

Унаследованные / реализующие классы, обозначенные как «Class1» и «Class2», используют одни и те же классы «SameClassA» и «SameClassB», которые не наследуются / не реализуются.

В каждом из этих классов я использую одну и ту же функцию initLogger (). Реализация функции initLogger () (имя регистратора, файлы регистратора и т. Д. c.) Различна для «Class1» и «Class2»; однако это то же самое для «SameClassA» и «SameClassB» (одинаковое имя регистратора, одинаковые файлы регистратора и c.).

Я заметил, что в моей функции initLogger () произошла ошибка при создании экземпляра SameClassA в то время, когда несколько экземпляров SameClassA уже были созданы. К сожалению, поскольку регистратора не было, у меня нет трассировки стека.

Однако я хотел бы знать, вызывает ли эта конфигурация проблему и что я могу сделать для ее решения?

Вот моя функция initLogger :

    def initLogger(self, infoLog=True, debugLog=True, consoleLog=True):
    try: 
        parentLogDir = os.path.join(os.getcwd(), 'UniversalThreadLogs')
        if not os.path.exists(parentLogDir):
            os.mkdir(parentLogDir)
        infoLogDir = os.path.join(parentLogDir, 'INFOLog')
        if not os.path.exists(infoLogDir):
            os.mkdir(infoLogDir)
        errorLogDir = os.path.join(parentLogDir, "ERRORLog")
        if not os.path.exists(errorLogDir):
            os.mkdir(errorLogDir)

        infoLogFilepath = os.path.join(infoLogDir, "UTInfoLog.log")
        debugLogFilepath = os.path.join(errorLogDir, "UTErrorLog.log")

        LOG_FORMAT = ("%(asctime)s [%(levelname)s]: %(message)s in %(pathname)s:%(lineno)d")

        debugHandler = logging.handlers.RotatingFileHandler(filename=debugLogFilepath,maxBytes=5000000, backupCount=100)
        debugHandler.setLevel(logging.ERROR)
        debugHandler.setFormatter(Formatter(LOG_FORMAT))

        infoHandler = logging.handlers.RotatingFileHandler(filename=infoLogFilepath,maxBytes=5000000, backupCount=100)
        infoHandler.setLevel(logging.INFO)
        infoHandler.setFormatter(Formatter(LOG_FORMAT))

        stream_handler = logging.StreamHandler()
        stream_handler.setLevel(logging.INFO)
        stream_handler.setFormatter(Formatter(LOG_FORMAT))

        UTLogger = logging.getLogger("UThread")
        if infoLog is True: 
            UTLogger.addHandler(infoHandler)
        if debugLog is True: 
            UTLogger.addHandler(debugHandler)
        if consoleLog is True: 
            UTLogger.addHandler(stream_handler)
        return UTLogger
    except: 
        return False

Как уже упоминалось, для «SameClassA» и «SameClassB» указанная выше реализация initLogger () одинакова для соответствующего класса с теми же файлами / каталогами и тем же именем регистратора «UThread», например.

Спасибо

1 Ответ

1 голос
/ 07 мая 2020

Вам нужно только один раз инициализировать ведение журнала. Вызовите initLogger() как автономный метод один раз в начале вашей программы, затем в каждом классе получите ссылку на регистратор.

import logging


def init_logging(infoLog=True, debugLog=True, consoleLog=True):
    # what you currently have

    # this is just to create a working demo
    logging.basicConfig(
        format="%(asctime)s [%(levelname)s]: %(message)s in %(pathname)s:%(lineno)d",
        level=logging.DEBUG,
    )


class ClassA:
    log = logging.getLogger("UThread")

    def say_hello(self):
        self.log.info("hello from class A")
        class_b = ClassB()
        class_b.say_hello()


class ClassB:
    log = logging.getLogger("UThread")

    def say_hello(self):
        self.log.info("hello from class B")


init_logging()
class_a = ClassA()
class_a.say_hello()

Это будет выводить

2020-05-07 18:29:19,642 [INFO]: hello from class A in test.py:16
2020-05-07 18:29:19,642 [INFO]: hello from class B in test.py:25
...