正如@shmee在此答案中指出的那样,必须在记录器名称中使用点符号显式定义记录器层次结构。也就是说,如果in中的记录器名称
main_module.py为
'a',则in的记录器名称
auxiliary_module.py必须为
'a.b'(而不仅仅是
'b'),以便它继承logger的配置
'a'。
getLogger()文档中也提到了这一点。
然而,这应该会自动使用时的照顾
__name__,如在提到
logging如何做:
这意味着记录器名称跟踪程序包/模块的层次结构,并且从记录器名称中记录事件的地方就很明显了。
问题是,要使其正常工作,您需要以
__name__正确的方式使用,而我没有这样做。
我的示例中的问题在于
cookbook-examplepackage文件夹中文件的组织:
主模块和辅助模块都处于同一级别(即,在同一文件夹中)。所以,作为解释这里的
__name__主模块将是
'__main__'(因为它是顶级脚本),以及
__name__用于辅助模块会
'auxiliary_module'(即文件名),NOT
'__main__.auxiliary_module'。
结果,辅助模块中的logger将是root logger的子级,而不是logger的子级
'__main__',因此它将继承root
logger配置(仍具有默认的日志记录级别
WARNING),而不是在中指定的配置。主模块。
因此,为使示例正常工作,我们有几种选择:
更换
getLogger(__name__)
中 主要 的模块getLogger()
。如@shmee所建议的那样,这会将配置应用于根记录器,从而也应用于辅助模块记录器。替换
getLogger(__name__)
中 辅助 由模块getLogger('__main__.' + __name__)。结果将与原始食谱示例相同(除了现在调用主记录器'__main__'
代替'spam_application'
)。



