1. ホーム
  2. パイソン

[解決済み】複数のモジュールでロギングを使用する

2022-03-25 07:13:58

質問

私は以下の構造を持つ小さなPythonのプロジェクトを持っています。

Project 
 -- pkg01
   -- test01.py
 -- pkg02
   -- test02.py
 -- logging.conf

私は、stdoutとログファイルにメッセージを出力するために、デフォルトのloggingモジュールを使用する予定です。 logging モジュールを使用するために、いくつかの初期化が必要です。

import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('pyApp')

logger.info('testing')

現在、私はメッセージのロギングを開始する前に、すべてのモジュールでこの初期化を実行します。この初期化を一箇所で一度だけ行い、プロジェクト全体のロギングで同じ設定を再利用することは可能でしょうか?

解決方法を教えてください。

ベストプラクティスは、各モジュールで、以下のようにロガーを定義することです。

import logging
logger = logging.getLogger(__name__)

をモジュールの先頭付近で、そしてモジュール内の他のコードで、例えば次のようにします。

logger.debug('My message with %s', 'variable data')

モジュール内でロギングアクティビティを細分化する必要がある場合は、以下のように使用します。

loggerA = logging.getLogger(__name__ + '.A')
loggerB = logging.getLogger(__name__ + '.B')

にログを記録します。 loggerAloggerB を適宜選択してください。

メインプログラムの中で、例えば、次のようにします。

def main():
    "your program code"

if __name__ == '__main__':
    import logging.config
    logging.config.fileConfig('/path/to/logging.conf')
    main()

または

def main():
    import logging.config
    logging.config.fileConfig('/path/to/logging.conf')
    # your program code

if __name__ == '__main__':
    main()

参照 こちら は複数のモジュールからログを取得するためのものであり ここで 他のコードからライブラリモジュールとして使用されるコードのためのログ設定用。

更新しました。 呼び出し時 fileConfig() を指定したい場合があります。 disable_existing_loggers=False Python 2.6 以降を使用している場合 ( ドキュメント をご覧ください)。デフォルト値は True 後方互換性のため、既存のロガーはすべて fileConfig() ただし、それらとその祖先の名前が設定に明示されている場合を除きます。この値を False の場合、既存のロガーはそのままになります。Python 2.7/Python 3.2 以降を使用している場合は dictConfig() よりも優れたAPIです。 fileConfig() を使用すると、設定をより細かく制御できるようになります。