は、あなたのログオブジェクトのインスタンスを取得するにはlogging.getLogger()を使用してみてください。
http://docs.python.org/3/library/logging.html#logging.getLogger
この関数のすべての呼び出しは、指定された名前と同じロガーインスタンスを返します。つまり、アプリケーションの異なる部分間でロガーインスタンスを渡す必要はありません。
UPDATE:
これを行うための推奨される方法は、(...など、ハンドラを設定し、フォーマッタ)のgetLogger()関数を使用し、それを設定することです:
# main.py
import logging
import lib
def main():
logger = logging.getLogger('custom_logger')
logger.setLevel(logging.INFO)
logger.addHandler(logging.FileHandler('test.log'))
logger.info('logged from main module')
lib.log()
if __name__ == '__main__':
main()
# lib.py
import logging
def log():
logger = logging.getLogger('custom_logger')
logger.info('logged from lib module')
本当にがロガークラスを拡張する必要がある場合logging.setLoggerClass(klass)
UPDATE 2:http://docs.python.org/2/howto/logging.html#custom-levels
は、カスタムの定義:カスタムレベルを追加することは推奨されません
# main.py
import logging
import lib
# Extend Logger class
CUSTOM_LEVEL_NUM = 9
logging.addLevelName(CUSTOM_LEVEL_NUM, 'CUSTOM')
def custom(self, msg, *args, **kwargs):
self._log(CUSTOM_LEVEL_NUM, msg, args, **kwargs)
logging.Logger.custom = custom
# Do global logger instance setup
logger = logging.getLogger('custom_logger')
logger.setLevel(logging.INFO)
logger.addHandler(logging.FileHandler('test.log'))
def main():
logger = logging.getLogger('custom_logger')
logger.custom('logged from main module')
lib.log()
if __name__ == '__main__':
main()
注:ロギングクラスを変更することなく、カスタムログレベルを追加する方法の
例1つ以上のロガーを使用することは、あなたの他の要件のためのトリックを行うかもしれません:オプションの出力を標準エラー出力に出力します。
ここではちょっと密集して申し訳ありません。だから、自分のLogクラス(ログクラスを含む)をインスタンス化するメインモジュールを持っていれば、単にLogオブジェクトを呼び出すだけで簡単にログを記録できます。しかし、私のメインが他のモジュールをインポートする場合、どのようにLogメソッドを呼び出して、すべてのメソッドにログハンドルを渡さずにログを記録するのですか?複数のモジュールを使用した例を提供できますか? – GregH
複数のモジュールとgetLogger()関数を使用した例を提供しました。 Logger(logging.getLoggerClass())クラスを拡張する必要はほとんどありません。実際にgetLoggerを使用してロガーを作成し、カスタムHandlerを設定するとすれば、必要なだけでは十分ではありませんが、カスタムLoggerクラスの背後にある根拠について説明してください。 – gonz
@GregH私の例は理にかなっていますか?それがあなたの問題を解決するか、それ以上の説明が必要かどうかを教えてください。 – gonz