2016-08-03 138 views
0

我對正在發生的事情有一些想法,但不一定能弄清楚如何解決它。Python日誌不按預期顯示%(name)s的格式屬性

我有一個抽象基類(ABC),其屬性爲logger = logging.getLogger(__name__)。這發生在__init__

然後我有一個具體的類,用相同的代碼覆蓋該屬性。具體課程還有一個導入聲明from ABC import *

我的問題是... 爲什麼我的所有日​​志語句都出現在ABC的名稱中,儘管其中一半發生在我的具體類中。我使用的格式字符串包括%(name)s,它從上面使用__name__屬性的記錄器實例中提取。

不幸的是,我是一個獨立的系統,所以我不一定複製所有的代碼,但我認爲我已經達到了關鍵要素。我唯一要補充的是,具體類確實調用了super(concreteClass, self).__init__(),但它在運行應覆蓋記錄器屬性的代碼之前進行調用。

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 

回答

1

您寫出示例代碼的方式,它看起來像兩個類在同一個文件中定義。是這樣嗎?因爲__name__會給你模塊名稱,這實際上是文件名。因此,在這種情況下,兩個應該是相同的

附加應答可以證實後,他們在不同的文件:

我不能複製您的結果。您發佈的代碼實際上並不運行,因此很難找到您的錯誤。我修補了你的代碼,直到它可以運行並且工作正常。請看看我最後寫了什麼,看看你是否看到了任何你可能做得不一樣的事情。

文件: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__ 
+0

所以我在一個獨立的系統上,我不能移植我的代碼。我不得不寫下這個例子,儘可能接近我的代碼,而不是永遠花費。 它們不在同一個文件中。他們在不同的文件中。 – bravosierra99

+0

好吧,從我所看到的代碼基本上與我所說的完全相同。這非常有趣。讓我進一步深入瞭解我的代碼的外觀。也許我錯過了一些東西,因爲你得到的結果正是我期望得到的結果,而且我似乎沒有得到。 – bravosierra99