この記事では、Pythonの標準ライブラリであるlogging
モジュールについて解説します。print
文によるデバッグと異なり、logging
モジュールはイベントの重要度に応じたメッセージのフィルタリングや、出力をファイルに保存する機能などを提供し、より体系的で管理しやすいプログラムの記録を残すことができます。
loggingモジュールの基本設定と使い方
logging
モジュールを使い始めるには、まずlogging.basicConfig()
で基本的な設定を行います。level
引数で記録するログの最低レベルを、format
引数でログメッセージの書式を定義します。
以下の例では、階乗を計算する関数の実行過程をlogging.debug()
で記録しています。
import logging
# ログの基本設定
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.debug('プログラム開始')
def calculate_factorial(n):
logging.debug(f'factorial({n})開始')
total = 1
# 0を掛けると結果が0になるため、1から始める
for i in range(1, n + 1):
total *= i
logging.debug(f'i = {i}, total = {total}')
logging.debug(f'factorial({n})終了')
return total
print(calculate_factorial(5))
logging.debug('プログラム終了')
このスクリプトを実行すると、関数の各ステップでの変数の状態が、タイムスタンプやログレベルと共に出力されます。
ログレベル
logging
モジュールには5つの主要なログレベルがあり、重要度の低い順に並んでいます。
DEBUG
: 問題の診断時に役立つ詳細な情報。INFO
: 想定通りに物事が動作していることの確認。WARNING
: 想定外のことが発生した、または将来の問題を示す兆候(例: ディスク容量の低下)。ERROR
: より深刻な問題により、プログラムが一部の機能を実行できなかった。CRITICAL
: プログラム自体の実行継続が不可能な、深刻なエラー。
basicConfig
で設定したレベル以上の重要度を持つメッセージのみが出力されます。例えば、level=logging.INFO
と設定した場合、DEBUG
メッセージは表示されず、INFO
, WARNING
, ERROR
, CRITICAL
メッセージが表示されます。
ログメッセージの無効化
logging.disable()
を呼び出すと、それ以降のログメッセージを抑制できます。引数には無効化したいログレベルを指定し、そのレベル以下
のすべてのログメッセージが非表示になります。
import logging
logging.basicConfig(level=logging.INFO, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.critical('これは表示される致命的エラー')
# CRITICALレベル以下のすべてのログを無効化
logging.disable(logging.CRITICAL)
logging.critical('これは表示されない致命的エラー')
logging.error('これも表示されないエラー')
ファイルへのログ出力
ログメッセージをコンソールではなくファイルに保存したい場合は、basicConfig
のfilename
引数を指定します。
import logging
# ログの出力先を'program_log.txt'ファイルに設定
logging.basicConfig(filename='program_log.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info('このメッセージはコンソールではなく、ファイルに書き込まれます。')
このスクリプトを実行すると、コンソールには何も表示されませんが、カレントディレクトリにprogram_log.txt
が作成され、その中にログメッセージが記録されます。
まとめ
logging
モジュールは、プログラムの動作を追跡するための柔軟なフレームワークです。ログレベルによるメッセージのフィルタリング、出力フォーマットのカスタマイズ、そして出力先をコンソールからファイルへ切り替える機能などを提供します。デバッグやアプリケーションの監視において、print
文よりもはるかに強力で体系的な方法です。