2

この方法でカスタムロガーを作成しようとしています:

ファイル: logger.py

import logging

class Logger(logging.getLoggerClass()):
    def warning(self, msg, *args, **kwargs):
        super(Logger, self).warning(msg, *args, **kwargs)

logging.setLoggerClass(Logger)
log = logging.getLogger('test')
handler = logging.StreamHandler()
formatter = logging.Formatter('%(pathname)s')
handler.setFormatter(formatter)
log.addHandler(handler)

ファイル: test.py

from logger import log

log.warning('')

出力:

$ python test.py
/home/dario/Desktop/logging_test/logger.py

予想される出力は次のようになります。

/home/dario/Desktop/logging_test/test.py

さらに奇妙なことに、 setLoggerClassget の行にコメントを付けるとtest.py、完全なパスはありません。

私は何を間違っていますか?ありがとうございました!

Arch Linux x86_64 上の Python 2.7.4 および 3.3.1 でテスト済み。

4

1 に答える 1

0

Python Documentation - Logging - LogRecord attributesから:

%(pathname)s - ロギング呼び出しが発行されたソース ファイルのフル パス名 (利用可能な場合)。

つまり、loggingオブジェクト (または のようなサブクラスLogger) が初期化された場所です。
この場合logging、そのインスタンス はlog、同じファイル内で定義および初期化されますtest.py

ファイルを分割すると、少し明確になるかもしれません。

logger.py: (クラス)

import logging                                           

# This is the path `logging` gets                        
class Logger(logging.getLoggerClass()):                  
    def warning(self, msg, *args, **kwargs):             
        super(Logger, self).warning(msg, *args, **kwargs)

log.py: (タイプのオブジェクトlogを持つモジュール)logLogger

import logging
from logger import Logger

logging.setLoggerClass(Logger)
log = logging.getLogger('test')
handler = logging.StreamHandler()

# Not this file's path, but where class Logger
# creates a logging object with super()
formatter = logging.Formatter('%(pathname)s')
handler.setFormatter(formatter)
log.addHandler(handler)

test.py: (メイン)

from log import log

log.warning('')    
于 2013-04-20T16:52:16.010 に答える