次のような構造を持つ小さな Python プロジェクトがあります -
Project
-- pkg01
-- test01.py
-- pkg02
-- test02.py
-- logging.conf
デフォルトのロギングモジュールを使用して、メッセージを標準出力とログファイルに出力する予定です。ロギングモジュールを使用するには、いくつかの初期化が必要です。
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('pyApp')
logger.info('testing')
現在、メッセージのログ記録を開始する前に、すべてのモジュールでこの初期化を実行しています。プロジェクト全体でログ記録することで同じ設定が再利用されるように、この初期化を 1 か所で 1 回だけ実行することは可能ですか?
ベストアンサー1
ベストプラクティスとしては、各モジュールで次のようにロガーを定義することです。
import logging
logger = logging.getLogger(__name__)
モジュールの先頭近くで、モジュール内の他のコードで次のようにします。
logger.debug('My message with %s', 'variable data')
モジュール内でログ活動を細分化する必要がある場合は、例えば次のようにします。
loggerA = logging.getLogger(__name__ + '.A')
loggerB = logging.getLogger(__name__ + '.B')
loggerA
必要に応じて、およびにログインしますloggerB
。
メインプログラムでは、例えば次のようにします。
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()
見るここ複数のモジュールからのログ記録、およびここ他のコードによってライブラリ モジュールとして使用されるコードのログ設定用。
更新:を呼び出すときに、 Python 2.6以降を使用しているかどうかfileConfig()
を指定する必要があるかもしれません(disable_existing_loggers=False
ドキュメントを参照してください)。デフォルト値はTrue
下位互換性のためであり、既存のfileConfig()
ロガーまたはその祖先が構成で明示的に指定されていない限り、すべての既存のロガーが によって無効になります。値を に設定すると、既存のロガーはそのまま残ります。Python 2.7/Python 3.2 以降を使用している場合は、よりも優れた APIFalse
を検討してください。これにより、構成をより細かく制御できます。dictConfig()
fileConfig()