Python 3でのログ記録(Logging)の完全ガイド
Python 3でのログ記録(Logging)は、アプリケーションのデバッグやモニタリングに非常に役立つツールです。ログは、エラーの追跡、情報の出力、警告の表示、そしてシステムのステータスを記録するために使用されます。Pythonの標準ライブラリには、非常に強力で柔軟なログ記録モジュールが含まれており、これを使って効果的にアプリケーションの動作を監視することができます。
本記事では、Python 3でのログ記録の基本から応用まで、完全かつ包括的に解説します。

1. ロギングモジュールの基本
Pythonにはlogging
という標準モジュールがあります。このモジュールを使用することで、プログラムの動作を詳細に記録したり、重要な情報やエラーメッセージをファイルに保存したりすることができます。
ログ記録の基本的な使い方
最も基本的な使い方は、ログメッセージをコンソールに表示する方法です。以下のコードは、logging
モジュールを使用して情報メッセージを表示する方法です。
pythonimport logging
# ログの基本設定
logging.basicConfig(level=logging.DEBUG)
# メッセージの出力
logging.debug("これはデバッグメッセージです")
logging.info("これは情報メッセージです")
logging.warning("これは警告メッセージです")
logging.error("これはエラーメッセージです")
logging.critical("これは重大なエラーメッセージです")
上記のコードでは、basicConfig
を使用してログの出力レベルを設定しています。これにより、DEBUG
レベル以上のメッセージが表示されるようになります。出力されるメッセージは以下のようになります。
lessDEBUG:root:これはデバッグメッセージです
INFO:root:これは情報メッセージです
WARNING:root:これは警告メッセージです
ERROR:root:これはエラーメッセージです
CRITICAL:root:これは重大なエラーメッセージです
level=logging.DEBUG
に設定することで、すべてのログレベル(DEBUG、INFO、WARNING、ERROR、CRITICAL)が出力されます。
2. ログレベル
ログメッセージにはさまざまな重要度(レベル)があります。logging
モジュールでは、これらのレベルに基づいてメッセージを出力します。以下は、ログレベルとその意味です。
-
DEBUG: デバッグ用の詳細な情報。通常は開発中のみ使用されます。
-
INFO: 実行中の一般的な情報。ユーザーには重要ではないが、システムの動作を理解するために有用です。
-
WARNING: 予期しない動作があったが、プログラムは続行できる場合に使用します。
-
ERROR: プログラムにエラーが発生し、処理が完了できない場合に使用します。
-
CRITICAL: システム全体に重大な影響を与えるエラーの場合に使用します。
ログレベルは、basicConfig
のlevel
引数を使って設定できます。例えば、level=logging.WARNING
に設定すれば、WARNING
以上のメッセージのみが表示されます。
3. ログの出力先
ログはコンソールだけでなく、ファイルにも保存することができます。これにより、後でログを確認したり、長期間にわたるシステムの動作を分析したりすることができます。
ファイルへのログ出力
ログメッセージをファイルに出力するためには、filename
引数を使用します。以下のコードは、ログをapp.log
というファイルに保存する例です。
pythonimport logging
# ログファイルに出力
logging.basicConfig(filename='app.log', level=logging.DEBUG)
# メッセージの出力
logging.debug("デバッグメッセージ")
logging.info("情報メッセージ")
logging.warning("警告メッセージ")
logging.error("エラーメッセージ")
logging.critical("重大なエラーメッセージ")
このコードを実行すると、app.log
というファイルが作成され、ログメッセージがそのファイルに書き込まれます。
ログファイルのローテーション
ログファイルが大きくなりすぎないように、定期的に新しいファイルに切り替えることができます。これを実現するために、logging.handlers.RotatingFileHandler
を使用します。
pythonimport logging
from logging.handlers import RotatingFileHandler
# ログファイルのローテーション設定
handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)
logging.basicConfig(level=logging.DEBUG, handlers=[handler])
# メッセージの出力
logging.debug("デバッグメッセージ")
この設定では、app.log
ファイルのサイズが2000バイトを超えると、新しいファイルに切り替え、最大5個のバックアップファイルを保持します。
4. ログのフォーマット
ログメッセージにタイムスタンプやログレベル、メッセージ内容などの情報を追加したい場合、format
を設定することができます。以下は、ログのフォーマットをカスタマイズする方法です。
pythonimport logging
# ログフォーマットの設定
logging.basicConfig(
format='%(asctime)s - %(levelname)s - %(message)s',
level=logging.DEBUG
)
# メッセージの出力
logging.debug("デバッグメッセージ")
上記の設定では、ログメッセージにタイムスタンプとログレベルが含まれます。出力例は以下のようになります。
yaml2025-03-28 12:34:56,789 - DEBUG - デバッグメッセージ
format
にはさまざまなプレースホルダーが使用できます。主なプレースホルダーは以下の通りです。
-
%(asctime)s
: ログが記録された日時 -
%(levelname)s
: ログレベル(DEBUG, INFO, WARNINGなど) -
%(message)s
: ログメッセージの内容 -
%(name)s
: ロガーの名前 -
%(filename)s
: 呼び出し元のファイル名 -
%(lineno)d
: 呼び出し元の行番号
5. ロギングのハンドラー
Pythonのlogging
モジュールでは、ログメッセージをさまざまな場所に送信するための「ハンドラー」を使用できます。主なハンドラーには以下のものがあります。
-
StreamHandler: コンソールにログを出力する
-
FileHandler: ファイルにログを出力する
-
RotatingFileHandler: ログファイルをローテーションして出力する
-
SMTPHandler: メールでログを送信する
-
SysLogHandler: syslogサーバにログを送信する
例えば、メールでエラーを通知したい場合、SMTPHandler
を使用してエラーメッセージをメールで送信することができます。
pythonimport logging
from logging.handlers import SMTPHandler
# メールによる通知設定
mail_handler = SMTPHandler(
mailhost='smtp.example.com',
fromaddr='[email protected]',
toaddrs=['[email protected]'],
subject='アプリケーションエラー'
)
logging.basicConfig(level=logging.ERROR, handlers=[mail_handler])
# エラーメッセージの出力
logging.error("重大なエラーが発生しました")
6. カスタムロガーの作成
複数のモジュールでログを記録する場合、それぞれのモジュールに個別のロガーを作成することができます。これにより、ログの出力先やレベルをモジュールごとに調整することが可能になります。
pythonimport logging
# カスタムロガーの作成
logger = logging.getLogger('my_module')
# ログ設定
logger.setLevel(logging.DEBUG)
# メッセージの出力
logger.debug("モジュールのデバッグメッセージ")
このように、getLogger
を使用してカスタムロガーを作成することができます。
結論
Python 3でのlogging
モジュールは非常に柔軟で、さまざまなシーンで活用できます。基本的なログ出力から、ログファイルへの記録、さらにログのローテーションやカスタムロガーの作成まで、多くの機能が提供されています。これらの機能を適切に活用することで、アプリケーションのデバッグや監視が容易になり、開発者はより効率的に問題を特定して解決できるようになります。