2012-02-16 5 views
8

ロギング用のカスタム属性(呼び出し元のクラス名、モジュール名など)を作成しようとしていたが、プロセスで作成されたLogRecordインスタンスに必要な属性。コード利回りのPythonロギングモジュール:カスタムロガー

import logging 

class MyLogger(logging.getLoggerClass()): 
    value = None 

logging.setLoggerClass(MyLogger) 

loggers = [ 
    logging.getLogger(), 
    logging.getLogger(""), 
    logging.getLogger("Name") 
] 

for logger in loggers: 
    print(isinstance(logger, MyLogger), hasattr(logger, "value")) 

この一見正しい作品:

False False 
False False 
True True 

バグや機能テストのビットの後、私はこれで終わりましたか?

答えて

5

我々は以下を参照してくださいすることができ、ソースコードを見てみると:

モジュールがインポートされたときに、ルートロガーがデフォルトで作成され
root = RootLogger(WARNING) 
def getLogger(name=None): 
    if name: 
     return Logger.manager.getLogger(name) 
    else: 
     return root 

。したがって、ルートロジャー(空の文字列などの偽の値を渡す)を探すたびに、logging.setLoggerClassの呼び出しにかかわらずlogging.RootLoggerオブジェクトを取得します。私たちが見ることができます使用されているロガークラスについて

_loggerClass = None 
def setLoggerClass(klass): 
    ... 
    _loggerClass = klass 

これは、グローバル変数は、将来的に使用されるロガークラスを保持していることを意味します。 (logging.getLoggerで使用される)logging.Managerを見てこれに加えて

、我々はこれを見ることができます:あなたが明示的にしていない限りself.loggerClassが設定されていない場合、ある

def getLogger(self, name): 
    ... 
      rv = (self.loggerClass or _loggerClass)(name) 

が(これはされませんそれを設定する)、グローバル変数からのクラスが使用されます。

したがって、それは機能です。ルートロガーは常にlogging.RootLoggerオブジェクトであり、他のロガーオブジェクトはその時の構成に基づいて作成されます。

2

logging.getLogger()logging.getLogger("")logging documentationで説明したように、彼らは、ログの階層のルートロガーを返すためMyLoggerを返さない:

logging.getLogger([名前])

リターンA指定された名前のロガー、または名前が指定されていない場合は、階層のルートロガーであるロガーを返します。あなたが持っているよう

したがって、ロガーを設定:私はこれがあなたとあなたの投稿を始めKeyError例外に関連しているとは思わない

>>> logging.getLogger() 
<logging.RootLogger object at 0x7d9450> 
>>> logging.getLogger("foo") 
<test3.MyLogger object at 0x76d9f0> 

。例外がスローされる原因となったコードを投稿する必要があります(test.py)。

+0

あなたのコメントをありがとう、私は質問を編集しました。 しかし、私はこの行動が起こると予想されるものではないと思います。 – Pastafarianist

+0

なぜあなたは何が起こると思いますか? *正確に*名前が指定されていないときにドキュメントが何を言うのか。 –

+4

これはドキュメントに記載されているものですが、直感的ではありません。ロガーのクラスを設定すると、私は_all_ロガーがそのクラスを持つことを期待します。ルートを含むものと、既にインスタンス化されているものは除きます。 – Pastafarianist

関連する問題