跨子模块记录–如何从子模块访问父记录器名称?

时间:2019-03-07 18:46:35

标签: python logging module

我正在尝试将日志记录添加到具有多个模块和子模块的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__)

0 个答案:

没有答案