Pythonのlogging:ログ出力フォーマットのカスタマイズと変数一覧

ログ出力において、単にエラーメッセージを表示するだけでは不十分な場合があります。「いつ」「どのファイルの」「どの行で」発生したかというメタ情報があって初めて、ログはデバッグや監視に役立つ情報となります。

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 を含めると、デバッグ時にエラー箇所を特定しやすくなります。
  • システムの規模や要件に合わせて、適切なフォーマットを設計することが重要です。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次