【发布时间】:2018-11-15 18:43:39
【问题描述】:
来自logging howto for Python 2.7(我的重点):
命名记录器时使用的一个很好的约定是使用模块级 logger,在每个使用日志的模块中,命名如下:
logger = logging.getLogger(__name__)这意味着记录器名称跟踪包/模块层次结构,并且直观地很明显,仅从记录器名称记录事件的位置。
听起来不错。
现在,logging cookbook 为多个模块提供了一个示例,它使用硬编码的记录器名称而不是 __name__ 常量。在示例中的“主模块”中我们发现
logger = logging.getLogger('spam_application')
在“辅助模块”中我们发现
module_logger = logging.getLogger('spam_application.auxiliary')
我将这个示例逐字复制到具有以下结构的包文件夹中:
cookbook-example
|- __init__.py
|- main_module.py
|- auxiliary_module.py
这运行没有问题,从主模块和辅助模块产生预期的日志输出,但事情是这样的:
如果我现在按照logging howto 的建议将硬编码的记录器名称替换为__name__ 常量,那么食谱示例就会崩溃:我只从主模块获取日志消息,但从辅助模块没有任何内容.
我一定遗漏了一些明显的东西。任何想法我做错了什么?
注意:
有很多非常相似的问题和相关答案,例如:1、2、3、4、5、6 等等。 然而,这些似乎都没有解决这个具体问题。
--编辑--
这是一个基于食谱示例的最小示例,其中显式名称字符串替换为__name__。
main_module.py
import logging
import auxiliary_module
# create and configure main logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create console handler with a higher log level
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# create formatter and add it to the handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# add the handler to the logger
logger.addHandler(handler)
logger.info('message from main module')
auxiliary_module.some_function()
auxiliary_module.py
import logging
# create logger
module_logger = logging.getLogger(__name__)
def some_function():
module_logger.info('message from auxiliary module')
【问题讨论】: