蟒蛇。为从分离的模块

时间:2016-01-08 17:55:57

标签: python python-3.x logging python-3.5

美好的一天。我正在尝试用Python登录来解决问题。我正在使用Python 3.5.1。我有应用程序,它使用从其他模块导入的类。我无法为其启用日志记录。这是一个简单的表示:

# test.py
import logging

from test_class import TestClass


logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.FileHandler('test_log.log', mode='w'))


if __name__ == '__main__':
    logger.info('Importing class')
    t = TestClass()
    t.make_call()
    t.make_another_call()
    logger.info('End')

# test_class.py
import logging


class TestClass(object):

    def __init__(self):
        self.logger = logging.getLogger('test_class.TestClass')

    def make_call(self):
        self.logger.info('Make a call')

    def make_another_call(self):
        self.logger.info('Make another call')

如你所见,logger必须写入文件行(两个来自主模块,两个来自类。但是当我打开日志文件时,我看到:

# test_log.log
Importing class
End

因此,来自类的两个记录器调用没有效果。任何想法,为什么它不起作用?提前谢谢。

1 个答案:

答案 0 :(得分:2)

来自the docs

  

对具有相同名称的getLogger()的多次调用将始终返回对同一Logger对象的引用。

     

该名称可能是一个以句点分隔的层次结构值,例如foo.bar.baz(例如,它也可能只是普通的foo)。在分层列表中较低的记录器是列表中较高的记录器的子项。例如,给定一个名为foo的记录器,名称为foo.bar,foo.bar.baz和foo.bam的记录器都是foo的后代。记录器名称层次结构类似于Python包层次结构,如果您使用建议的构造logging.getLogger(__name__)按模块组织记录器,则与其相同。那是因为在模块中,__name__是Python包命名空间中的模块名称。

您在代码中拨打getLogger的方式,test.py中的来电是__main__,而test_class.py中的来电是test_class,所以后者不是前者的后代。

相反,如果在设置处理程序时,在调用getLogger()时没有参数的对象上执行此操作,则将在根日志记录对象上设置处理程序以及对{的所有其他调用{1}}将位于层次结构的下方,并将使用您指定的处理程序。

如果要继续在主模块中为日志记录语句设置名称,则可以在设置处理程序后再次调用getLogger()

例如:

getLogger