在多个 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
我有 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