我对发生的事情有一些想法,但不一定想知道如何解决。
我有一个属性为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__