Tips

今日の開発Tips(2025-07-21)

本Tipsでは、Pythonにおける`logging`モジュールの効果的な活用方法を紹介します。`print()`デバッグに頼らず、ログレベルを使い分けることで、開発・運用時のデバッグや監視を効率化できます。適切なログ出力は、問題発生時の原因究明やシステムの健全性維持に大きく貢献します。

Pythonのloggingモジュールによる効果的なログ出力

loggingモジュールは、プログラムの実行状況やエラー情報を記録するのに役立ちます。print()関数と異なり、ログレベルを設定することで、出力するメッセージを制御できます。これにより、デバッグ時には詳細なログを出力し、運用時にはエラー情報のみを出力するなど、状況に応じた柔軟なログ管理が可能です。

import logging

# ロガーの設定
logging.basicConfig(level=logging.DEBUG,  # ログレベルの設定 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
                    format='%(asctime)s - %(levelname)s - %(message)s',  # ログ出力フォーマット
                    filename='my_app.log',  # ログファイル名 (省略すると標準出力)
                    filemode='w')  # ファイルモード ('w'で上書き, 'a'で追記)

# ログ出力
logging.debug('Debug message')
logging.info('Info message')
logging.warning('Warning message')
logging.error('Error message')
logging.critical('Critical message')

# 特定の関数でのログ出力例
def my_function(x, y):
    logging.info(f"Function called with x={x}, y={y}")
    try:
        result = x / y
        logging.debug(f"Calculation result: {result}")
        return result
    except ZeroDivisionError:
        logging.exception("ZeroDivisionError occurred")  # 例外発生時のトレースバックも含めてログ出力
        return None

注意点:

  • ログレベルは、DEBUG < INFO < WARNING < ERROR < CRITICAL の順で重要度が高くなります。level引数で設定したレベル以上のログのみが出力されます。
  • ログ出力フォーマットは、format引数で変更できます。%(asctime)s, %(levelname)s, %(message)s などのフォーマット指定子を使用できます。
  • 大量のログが出力される場合は、ログローテーションを設定するなどの対策が必要です。

おすすめポイント:

  • logging.exception()を使うことで、エラー発生時のトレースバックを自動的にログ出力できます。
  • ログレベルを使い分けることで、開発・運用環境に応じてログの出力内容を柔軟に調整できます。
  • ログファイルに出力することで、実行後のログを確認できます。