美好的一天。我正在尝试用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
因此,来自类的两个记录器调用没有效果。任何想法,为什么它不起作用?提前谢谢。
答案 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