Pythonのロギング (loggingモジュール) とは?
ロギングは、アプリケーションが動作している間の情報を記録し、エラーや警告、デバッグ情報を追跡するために不可欠な機能です。Python
には標準ライブラリとしてlogging
モジュールが用意されており、ログの記録を簡単に行うことができます。
logging
モジュールを使うことで、デバッグ時に問題を見つけやすくしたり、運用中のエラーを記録してシステムの安定性を向上させたりできます。本記事では、logging
モジュールの基本的な使い方から、ログのレベル管理、ファイル出力の方法、さらに実用的なロギングの設定方法までを解説します。
logging
モジュールの基本的な使い方
Python
でログを出力するためには、まずlogging
モジュールをインポートし、ログの設定を行います。logging
モジュールには、さまざまなログレベルやフォーマットの設定機能が備わっており、ログをコンソールやファイルに記録することが可能です。
基本的なログ出力
最も簡単なログの出力方法は、logging.basicConfig()
を使って設定し、logging
のメソッドを使ってメッセージを出力する方法です。
import logging
# ログの基本設定
logging.basicConfig(level=logging.INFO)
# ログの出力
logging.debug("デバッグメッセージ") # DEBUG: デバッグ用のメッセージ
logging.info("情報メッセージ") # INFO: 一般的な情報
logging.warning("警告メッセージ") # WARNING: 警告の意味を持つメッセージ
logging.error("エラーメッセージ") # ERROR: エラーが発生したときのメッセージ
logging.critical("致命的なエラーメッセージ") # CRITICAL: 致命的なエラー
この例では、logging.basicConfig()
でログの基本設定を行い、さまざまなレベルのログを出力しています。logging.info()
やlogging.error()
などのメソッドを使ってログを記録します。各ログには、重要度を表すログレベルが付いています。
ログレベルとは?
logging
モジュールには、次のようなログレベルがあり、ログメッセージの重要度に応じて適切なレベルで記録できます。
DEBUG
: デバッグ用の詳細な情報INFO
: 一般的な情報メッセージWARNING
: 警告メッセージ(問題が発生する可能性がある)ERROR
: エラーメッセージ(プログラムが正常に動作しない)CRITICAL
: 致命的なエラーメッセージ(プログラムが強制終了するような重大な問題)logging.basicConfig(level=logging.INFO)
のように設定すると、INFO以上のレベル(INFO、WARNING、ERROR、CRITICAL)のログが表示されます。DEBUG
レベルのログを出力したい場合は、level=logging.DEBUG
と設定します。
ログをファイルに保存する
ログをコンソールだけでなく、ファイルに保存することで、後からエラーや実行の履歴を確認することができます。logging.basicConfig()
でfilename
パラメータを指定することで、ログをファイルに出力できます。
例:ログをファイルに出力
import logging
# ログをファイルに書き込み、フォーマットを設定
logging.basicConfig(filename='app.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
logging.info("アプリケーションが起動しました")
logging.warning("警告:ディスク容量が少なくなっています")
logging.error("エラー:ファイルが見つかりません")
この設定では、ログがapp.log
というファイルに出力されます。また、format
パラメータでログのフォーマットを指定しています。
フォーマットの指定
logging
モジュールでは、ログのメッセージ形式をカスタマイズできます。以下のフォーマット指定子を使って、ログの出力形式を制御できます。
%(asctime)s
: ログのタイムスタンプ%(levelname)s
: ログレベル(DEBUG, INFO, etc.)%(message)s
: ログメッセージ%(filename)s
: ファイル名%(lineno)d
: 行番号
logging.basicConfig(filename='app.log', level=logging.INFO,
format='%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s')
このフォーマットを使うと、タイムスタンプ、ファイル名、行番号、ログレベル、メッセージが出力され、より詳細な情報が得られます。
ログの回転(ローテーション)
長期間運用するアプリケーションでは、ログファイルが大きくなりすぎないように、ログのローテーション(ファイルを一定サイズや期間で切り替える機能)を使うことが推奨されます。logging
モジュールでは、RotatingFileHandler
やTimedRotatingFileHandler
を使うことで、ログファイルを自動的に切り替えることができます。
例:RotatingFileHandler
を使ったログのローテーション
import logging
from logging.handlers import RotatingFileHandler
# ログを最大1MBまで書き込み、5個のバックアップファイルを保持
handler = RotatingFileHandler('app.log', maxBytes=1024*1024, backupCount=5)
logging.basicConfig(level=logging.INFO, handlers=[handler])
logging.info("ログのローテーションテスト")
この設定では、ログファイルが1MBを超えると、新しいログファイルが作成され、古いログファイルは最大5個まで保存されます。これにより、ログファイルのサイズを一定に保つことができます。
例:TimedRotatingFileHandler
を使った時間ベースのローテーション
import logging
from logging.handlers import TimedRotatingFileHandler
# 1日ごとに新しいログファイルを作成し、7日分のログを保持
handler = TimedRotatingFileHandler
('app.log', when='D', interval=1, backupCount=7)
logging.basicConfig(level=logging.INFO, handlers=[handler])
logging.info("時間ベースのローテーションテスト")
この例では、1日ごとにログファイルをローテーションし、7日分のバックアップを保存します。when='D'
は日単位、interval=1
は1日ごとのローテーションを意味します。
実用的なロギングの設定
現実のアプリケーションでは、異なるモジュールごとにログを設定したり、コンソールとファイルの両方にログを出力したりすることがあります。このような場合、logging.getLogger()
を使ってロガーを分離して設定することができます。
例:異なるモジュールでのロギング
import logging
# ロガーを取得
logger = logging.getLogger('my_app')
# ログの設定
logger.setLevel(logging.DEBUG)
# ハンドラーを設定してコンソールに出力
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# ハンドラーを設定してファイルに出力
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)
# フォーマッタを設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# ロガーにハンドラーを追加
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# ログメッセージを出力
logger.debug("デバッグ情報")
logger.info("通常の情報")
logger.warning("警告メッセージ")
この例では、ロガーを作成して、コンソールとファイルの両方にログを出力しています。logging.getLogger('my_app')
でカスタムロガーを取得し、異なるハンドラー(コンソール用、ファイル用)に異なるログレベルやフォーマットを適用しています。
ロギングのベストプラクティス
- 適切なログレベルの設定
すべてのログをDEBUG
レベルで出力すると、ログが肥大化し、重要な情報が埋もれる可能性があります。開発中はDEBUG
レベル、運用時はINFO
やWARNING
レベルを使うのが一般的です。 - ログのローテーションを活用
ログファイルが大きくなりすぎないように、RotatingFileHandler
やTimedRotatingFileHandler
を使ってログのローテーションを設定しましょう。これにより、ディスクスペースの無駄遣いを防