logging.getLogger(__name__) 默认继承不起作用

logging.getLogger(__name__) default inheritance not working

我有一个具有以下层次结构的项目:

ModuleA:
- __main__.py
- ModuleB:
  - __init__.py
  - auxiliary.py

使用记录器应该非常简单。如官方文档以及本网站的其他一些答案所示。但是没有按预期工作。

__main__.py我有

import logging
import logging.config

if __name__ == '__main__':
    #Initialize logging
    logging.config.fileConfig(fname='FILE.ini')
    logger = logging.getLogger(__name__)  
    logger.info('The APP has started')
    logger.debug('This goes to the logfile')

__init__.py我有

#Imports from all the modules
#[...]
import logging
logger = logging.getLogger(__name__)
logger.info("Package loaded")

auxiliary.py我有

import logging

class Auxiliar:
    logger = logging.getLogger(__name__) 
    def __init__(self):
        pass

    def work(self):
        self.logger.info("From inside AUTH")

但这没有按预期工作,我从 __main__.py 收到所有消息,但从 __init__.py 或 auxiliary.py 收到 none。我也试过只从辅助而不是 __init__ 获取记录器,结果相同。如果我将 getLogger() 留空以获取两者的根记录器,这是唯一的方法,但这并不理想,因为无论从何处记录事件,模块的名称始终是“root”。

我不明白我在这里错过了什么。

作为一种解决方法,可以使用显式记录器名称声明,正确的配置应如下所示:

__main__.py:

import logging
import logging.config

if __name__ == '__main__':
    #Initialize logging
    logging.config.fileConfig(fname='FILE.ini')
    logger = logging.getLogger('application')  
    logger.info('The APP has started')
    logger.debug('This goes to the logfile')

__init__.py 中不需要任何内容​​。

auxiliary.py 中:

import logging
module_logger = logging.getLogger('application.auxiliary')
class Auxiliar:
    self.logger = logging.getLogger('application.auxiliary.Auxiliar') 
    def __init__(self):
        pass

    def work(self):
        self.logger.info("From inside Auxiliar clase")

这样日志将显示正确的模块层次结构,但程序员必须控制正确的命名约定。