在多个 class 实例中使用相同的记录器和日志文件? Problems/Conflicts?

Using same logger and log files across multiple class instances? Problems/Conflicts?

我有 3 个 class 如下:

Class1 --> 使用 SameClassA --> 使用 SameClassB

Class2 --> 使用 SameClassA --> 使用 SameClassB

inherited/implement classes 表示为 "Class1" 和 "Class2" 使用相同的 classes "SameClassA" 和 "SameClassB",这不是 inherited/implemented。

在每个 class 中,我都使用相同的 initLogger() 函数。 "Class1" 和 "Class2" 的 initLogger() 函数(记录器名称、记录器文件等)的实现不同;但是,"SameClassA" 和 "SameClassB" 相同(相同的记录器名称、相同的记录器文件等)。

我注意到在实例化 "SameClassA" 时我的 initLogger() 函数中发生了错误,而此时已经实例化了多个 "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() 实现对于各自的 class 是相同的,具有相同的 files/directories 和相同的记录器例如姓名 "UThread"。

谢谢

您只需初始化一次日志记录。在程序开始时将 initLogger() 作为独立方法调用一次,然后在每个 class 中获取对记录器的引用。

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