python日志记录未按预期显示%(name)s格式属性



我对发生的事情有一些想法,但不一定想知道如何解决。

我有一个属性为logger = logging.getLogger(__name__)的抽象基类(ABC)。这种情况发生在__init__

然后我有一个具体的类,它用相同的代码覆盖属性。具体类还有一个导入语句from ABC import *

我的问题是。。。为什么我所有的日志记录语句都以ABC的名称出现,尽管其中一半出现在我的具体类中。我使用的是一个包含%(name)s的格式字符串,它是从上面使用__name__属性的记录器实例中提取的。

不幸的是,我在一个独立的系统上,所以我不一定能复制所有的代码,但我认为我已经达到了关键元素。我要添加的唯一一件事是,具体类确实调用了super(concreteClass, self).__init__(),但它在运行应该覆盖logger属性的代码之前进行了此调用。

import logging
class ABC(object)
    def __init__():
        self.logger = logging.getlogger(__name__)
        self.logger.info("hey I'm in the ABC")
class Concrete(ABC)
    def __init__():
        super(Concrete,self).__init__()
        self.logger = logging.getlogger(__name__)    
        self.logger.info("hey I'm in the concrete")
output
 conc = Concrete()
 (DATE) ABC INFO Hey I'm in the ABC
 (DATE) ABC INFO Hey I'm in the concrete

编写示例代码的方式,看起来这两个类是在同一个文件中定义的。是这样吗?因为__name__将为您提供模块名称,它本质上就是文件名。因此,在这种情况下,两者应该是相同的

验证它们在不同文件中后的附加答案:

我无法复制你的结果。你发布的代码实际上是不可运行的,所以很难找到你的bug。我对你的代码进行了修补,直到它可以运行,并且运行良好。请看一看我最后写了什么,看看你是否看到了你可能做了什么不同的事情。

文件:my_abc.py

import logging
class ABC(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.DEBUG)
        # create console handler and set level to debug
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        # create formatter
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        # add formatter to ch
        ch.setFormatter(formatter)
        # add ch to logger
        self.logger.addHandler(ch)
        self.logger.info("hey I'm in the ABC")

文件:conc.py

import logging
from my_abc import ABC
class Concrete(ABC):
    def __init__(self):
        super(Concrete,self).__init__()
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.DEBUG)
        # create console handler and set level to debug
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        # create formatter
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        # add formatter to ch
        ch.setFormatter(formatter)
        # add ch to logger
        self.logger.addHandler(ch)
        self.logger.info("hey I'm in the concrete")

文件:run.py

from conc import Concrete
conc = Concrete()
print __name__

当运行以上内容时,我得到的是:

$ python run.py 
2016-08-03 14:15:56,681 - my_abc - INFO - hey I'm in the ABC
2016-08-03 14:15:56,681 - conc - INFO - hey I'm in the concrete
__main__

最新更新