我有一个具有以下层次结构的项目:
ModuleA:
- __main__.py
- ModuleB:
- __init__.py
- auxiliary.py
使用logger应该非常简单。正如官方文件和本网站其他一些答案所示。但并没有如预期的那样发挥作用。
在__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得到任何消息。我也尝试过只从auxiliary而不是__init__
得到记录器,结果相同。唯一的方法是,如果我让getLogger((为空,以获得两者上的根记录器,但这并不理想,因为模块的名称总是";根";而不管从哪里记录事件。
我无法理解我在这里错过了什么。
作为一种变通方法,可以使用显式记录器名称声明,正确的配置应如下所示:
关于__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')
在CCD_ 8中不需要任何东西。
在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")
通过这种方式,日志将显示正确的模块层次结构,但程序员必须控制正确的命名约定。