2016-08-03 11 views
0

何が起こっているかについてのアイデアはありますが、それを修正する方法を必ずしも見つけ出すことはできません。Pythonログに%(name)のフォーマットプロパティが期待どおりに表示されない

私は抽象基本クラス(ABC)の属性がlogger = logging.getLogger(__name__)です。 __init__

次に、同じコードで属性を上書きする具象クラスがあります。具象クラスには、from ABC import *のインポートステートメントもあります。

私の質問は... なぜ私の具体的なクラスの半分が発生するにもかかわらず、私のすべての声明文は、ABCの名前で出てくるのですか?私は%(name)sを含むフォーマット文字列を使用していますが、これは上記のloggerインスタンスから取り出して、__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

あなたのサンプルコードを書き出す方法は、2つのクラスが同じファイルに定義されているようです。それは事実ですか? __name__はあなたにモジュール名を与えます。これは本質的にファイル名です。それは彼らが別のファイルであったことが確認された後、その場合には、2つが同じ

追加答えをする必要がありますので:

私はあなたの結果を再現することはできません。あなたが投稿したコードは実際には実行可能ではないので、あなたのバグを見つけるのは非常に難しいです。それが実行可能になるまで私はあなたのコードを修正し、うまく動作します。私が書いたものを見て、あなたが何か異なったやり方をしたのか見てみてください。

ファイル: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

関連する問題