Python logging模块中‘TypeError: RootLogger object is not callable’的根因是什么?
单元测试日志配置报错:'RootLogger' object is not callable
除了一篇随机论坛帖子外,我未找到该问题的任何解决方案,因此在此发布,希望后续遇到该问题的开发者能直接获取相关信息。
我的单元测试日志配置代码如下:
import unittest import logging logging.basicConfig(filename="Testing.log", format="%(asctime)s:%(levelname)s: %(message)s", level=logging.DEBUG, filemode='w+') def utility_method(): # do some stuff logging.getLogger().debug("This is a debug message") class TestingStuff(unittest.TestCase): loggerInstance = None @classmethod def setUpClass(cls): # do setup stuff global logging TestingStuff.loggerInstance = logging.getLogger() @classmethod def tearDownClass(cls): # do cleanup stuff pass def test_T_01(self): self.loggerInstance("Testing T_01") def test_T_02(self): self.loggerInstance("Testing T_02") if __name__=="__main__": unittest.main()
运行后抛出如下错误:
EE ====================================================================== ERROR: test_T_01 (__main__.TestingStuff) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Users\User\Testing\test.py", line 25, in test_T_01 self.loggerInstance("Testing T_01") TypeError: 'RootLogger' object is not callable ====================================================================== ERROR: test_T_02 (__main__.TestingStuff) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Users\User\Testing\test.py", line 28, in test_T_02 self.loggerInstance("Testing T_02") TypeError: 'RootLogger' object is not callable ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (errors=2)
错误根本原因
你将logging.getLogger()返回的RootLogger实例当成可调用函数直接执行了,这是核心错误。RootLogger对象本身不具备可调用特性,无法直接通过loggerInstance("消息")这种方式输出日志。
正确的做法是调用Logger实例对应的日志级别方法,比如debug()、info()、warning()、error()等,根据你需要的日志等级选择对应的方法。
修正后的代码示例
import unittest import logging logging.basicConfig(filename="Testing.log", format="%(asctime)s:%(levelname)s: %(message)s", level=logging.DEBUG, filemode='w+') def utility_method(): # do some stuff logging.getLogger().debug("This is a debug message") class TestingStuff(unittest.TestCase): loggerInstance = None @classmethod def setUpClass(cls): # do setup stuff TestingStuff.loggerInstance = logging.getLogger() @classmethod def tearDownClass(cls): # do cleanup stuff pass def test_T_01(self): self.loggerInstance.debug("Testing T_01") # 调用debug方法输出日志 def test_T_02(self): self.loggerInstance.info("Testing T_02") # 调用info方法输出日志 if __name__=="__main__": unittest.main()
内容的提问来源于stack exchange,提问作者doa4321
相关产品推荐
相关产品推荐

