ログ出力において、単にエラーメッセージを表示するだけでは不十分な場合があります。「いつ」「どのファイルの」「どの行で」発生したかというメタ情報があって初めて、ログはデバッグや監視に役立つ情報となります。
Pythonの logging モジュールでは、フォーマット文字列を指定することで、これらの情報を自動的にログに埋め込むことができます。
この記事では、ログフォーマットの指定方法と、使用可能な主要な変数一覧について解説します。
目次
ログフォーマットで使用できる変数一覧
logging モジュールでは、%(変数名)s や %(変数名)d といった形式で、ログレコードの属性を参照できます。以下は主要な変数の一覧です。
| 変数名 | 意味 | データ型 |
%(asctime)s | ログ出力日時(デフォルト形式: YYYY-MM-DD HH:MM:SS,mmm) | 文字列 |
%(name)s | ロガーの名前(getLoggerで指定した名前) | 文字列 |
%(levelname)s | ログレベル名(DEBUG, INFO, WARNING, ERROR, CRITICAL) | 文字列 |
%(levelno)s | ログレベルの数値(10, 20, 30, 40, 50) | 数値 |
%(message)s | ログメッセージ本文 | 文字列 |
%(filename)s | ログを出力したファイル名 | 文字列 |
%(pathname)s | ログを出力したファイルのフルパス | 文字列 |
%(module)s | モジュール名(ファイル名の拡張子なし部分) | 文字列 |
%(lineno)d | ログを出力したソースコードの行番号 | 数値 |
%(funcName)s | ログを出力した関数名 | 文字列 |
%(process)d | プロセスID | 数値 |
%(thread)d | スレッドID | 数値 |
%(threadName)s | スレッド名 | 文字列 |
これらを組み合わせることで、目的に応じたログ形式を作成できます。
フォーマットの設定方法
フォーマットを設定するには、logging.basicConfig 関数の format 引数に文字列として渡します。
実践的なコード例
マルチプロセスやマルチスレッド環境でも追跡しやすいように、日時、プロセスID、スレッドIDを含めたフォーマットを設定する例です。
import logging
import os
import threading
# ログフォーマットの定義
# 日時 - プロセスID - スレッドID - ロガー名 - レベル - メッセージ
format_str = "%(asctime)s - %(process)d - %(thread)d - %(name)s - %(levelname)s - %(message)s"
# 基本設定にフォーマットを適用
logging.basicConfig(
format=format_str,
level=logging.INFO
)
# ロガーの取得
logger = logging.getLogger(__name__)
def worker_task():
"""ログ出力をテストするための関数"""
logger.info("ワーカースレッドでの処理を開始します。")
try:
# 擬似的なエラー発生
x = 1 / 0
except ZeroDivisionError:
logger.error("計算エラーが発生しました。", exc_info=True)
logger.info("ワーカースレッドでの処理を終了します。")
# --- メイン処理 ---
logger.info(f"メイン処理を開始します。(PID: {os.getpid()})")
# スレッドを作成して実行
thread = threading.Thread(target=worker_task, name="WorkerThread")
thread.start()
thread.join()
logger.info("全ての処理が完了しました。")
実行結果:
2025-11-29 12:00:00,123 - 15640 - 140028987451200 - __main__ - INFO - メイン処理を開始します。(PID: 15640)
2025-11-29 12:00:00,124 - 15640 - 123145324654592 - __main__ - INFO - ワーカースレッドでの処理を開始します。
2025-11-29 12:00:00,125 - 15640 - 123145324654592 - __main__ - ERROR - 計算エラーが発生しました。
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
2025-11-29 12:00:00,126 - 15640 - 123145324654592 - __main__ - INFO - ワーカースレッドでの処理を終了します。
2025-11-29 12:00:00,127 - 15640 - 140028987451200 - __main__ - INFO - 全ての処理が完了しました。
フォーマットを指定したことで、どのプロセス(15640)のどのスレッドで実行されたログであるかが一目瞭然になります。
まとめ
logging.basicConfig(format="...")でログの出力形式をカスタマイズできます。%(asctime)sや%(levelname)sなどの変数を使うことで、日時や重要度を自動的に埋め込めます。%(filename)sや%(lineno)dを含めると、デバッグ時にエラー箇所を特定しやすくなります。- システムの規模や要件に合わせて、適切なフォーマットを設計することが重要です。
