概要
Pythonの標準ライブラリである logging モジュールは、プログラムの実行中に詳細な情報を記録するための強力なツールです。特に、デバッグや運用中のエラー検出、情報のトレースに役立ちます。この記事では、現場で使用しているlogging の基本的な使い方をメモします。
目次
- logging とは?
- 基本的な使い方
- ログをファイルに保存する方法
- ログフォーマットのカスタマイズする方法
- 複数ファイルにログを分ける方法
logging とは?
logging モジュールは、Pythonでログメッセージを生成し、コンソールやファイルに出力するための方法です。print() を使ったデバッグよりもはるかに使い勝手が良く、レベルごとにメッセージを整理したり、ログのフォーマットや出力先をカスタマイズできる点が特徴です。
基本的な使い方
logging モジュールを使ってログを出力する基本的な方法です。
import logging
# ログの基本設定
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# ログの出力例
logging.debug('デバッグ情報')
logging.info('情報メッセージ')
logging.warning('警告メッセージ')
logging.error('エラーメッセージ')
logging.critical('致命的なエラーメッセージ')
- logging.basicConfig(): ログの設定を行うメインの関数です。ここでログのレベルやフォーマットを指定します。
- ログレベル: DEBUG, INFO, WARNING, ERROR, CRITICAL の5つのログレベルがあり、これに応じてメッセージの重要度が変わります。
- DEBUG: 開発やデバッグ時に役立つ詳細な情報
- INFO: 通常の動作に関する情報
- WARNING: 注意すべき動作や状況に関する警告
- ERROR: エラー発生時のメッセージ
- CRITICAL: プログラムの継続が危ぶまれる重大なエラー
ログをファイルに保存する
コンソールに表示されるだけでなく、ログをファイルに記録することができます。ファイルへの出力は、basicConfig() の filename パラメータを使って設定します。
import logging
# ログをファイルに保存する設定
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# ログの出力例
logging.info('ファイルに保存されるログメッセージ')
logging.warning('警告メッセージもファイルに保存されます')
結果
このコードを実行すると、app.log というファイルにログメッセージが保存されます。ファイルは以下のような形式で出力されます。
2024-10-05 10:00:00,000 - INFO - ファイルに保存されるログメッセージ
2024-10-05 10:00:01,000 - WARNING - 警告メッセージもファイルに保存されます
ログフォーマットのカスタマイズ
logging では、出力されるログメッセージのフォーマットも自由にカスタマイズ可能です。basicConfig() で format パラメータを指定して、ログのフォーマットを設定します。
import logging
# フォーマットをカスタマイズ
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s - [%(asctime)s]')
# ログの出力例
logging.info('フォーマットがカスタマイズされたログ')
結果
上記の例では、ログレベルとメッセージの後にタイムスタンプを表示するフォーマットを指定しています。
INFO: フォーマットがカスタマイズされたログ - [2024-10-05 10:05:00,000]
- %(levelname)s: ログレベル(INFO, WARNING など)
- %(message)s: 実際のログメッセージ
- %(asctime)s: 日時
複数ファイルにログを分ける
大規模なシステムでは、エラー用のログファイルと、さらに詳細なエラー情報などとログファイルを分けて管理することが推奨されます。これを実現するには、複数のハンドラーを使ってログの振り分けを行います。
import logging
# ロガーの作成
logger = logging.getLogger('my_app')
# エラーログ用のハンドラー
error_handler = logging.FileHandler('error.log')
error_handler.setLevel(logging.ERROR)
# 通常のログ用ハンドラー
info_handler = logging.FileHandler('info.log')
info_handler.setLevel(logging.INFO)
# フォーマットの設定
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
error_handler.setFormatter(formatter)
info_handler.setFormatter(formatter)
# ロガーにハンドラーを追加
logger.addHandler(error_handler)
logger.addHandler(info_handler)
# ログの出力
logger.info('これはINFOレベルのメッセージです')
logger.error('これはERRORレベルのメッセージです')
- info.log には INFO 以上のメッセージが記録されます。
- error.log には ERROR 以上のメッセージが記録されます。
loggerの使用法は現場により異なり、さらに複雑な記述で使用されていると思いますが、基本的なloggerの使用法は上記となるはずです。