Python logging.info()とは?正常時の記録を残す方法

Pythonのlogging.info()は、処理が正常に進んだことを記録する関数です。

「いつ・何が起きたか」を残す、運用ログの主役になるレベルです。


info()が出ないときは設定を確認する

import logging

logging.info("情報")
logging.warning("警告")

実行結果:

WARNING:root:警告

INFOが消えました。既定のレベルがWARNING(30)で、INFOは20だからです。

「logging.info()を書いたのに何も出ない」という相談のほとんどが、この仕様によるものです。

import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")

logging.info("処理を開始しました")

実行結果:

2026-09-16 14:13:43,787 [INFO] 処理を開始しました

何をINFOに書くか

INFOは「後から読んで、何が起きたか分かる」ための記録です。開発者以外——運用担当や未来の自分——が読みます。

INFOに向くもの 例
処理の開始と終了 「日次バッチを開始」「完了(120件)」
節目の出来事 「設定ファイルを読み込んだ」
外部との通信結果 「APIから200件取得」
状態の変化 「ユーザーがログインした」
import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")

def run_batch(items):
    logging.info("バッチ開始: 対象 %d件", len(items))
    for i in items:
        pass
    logging.info("バッチ完了: %d件を処理", len(items))

run_batch([1, 2, 3])

実行結果:

2026-09-16 14:20:01,123 [INFO] バッチ開始: 対象 3件
2026-09-16 14:20:01,124 [INFO] バッチ完了: 3件を処理

開始と終了をセットで残すのが基本形です。終了ログがなければ「途中で止まった」と分かります。


DEBUGとの境界

迷ったときの判断基準は「本番でも出したいか」です。

問い 答えがYesなら
運用中も残したい記録か INFO
障害調査のとき読みたいか INFO
変数の中身を追うためか DEBUG
開発が終われば不要か DEBUG
logging.info("注文を受け付けました: 注文ID=%s", order_id)   # 運用でも見たい
logging.debug("計算途中の小計: %s", subtotal)               # 開発中だけ

出しすぎないこと

INFOで最も多い失敗が出しすぎです。

for item in items:
    logging.info("処理中: %s", item)   # 10万件なら10万行

ログが大量になると、次のような問題が起きます。

  • 重要な情報が埋もれる——エラーを探せない
  • ディスクを圧迫する
  • 処理が遅くなる——ログ出力もI/O

ループの中身はDEBUGに落とし、INFOはまとめて出すのが定石です。

import logging

logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")

items = list(range(100))
ok = 0
for item in items:
    logging.debug("処理中: %s", item)
    ok += 1

logging.info("完了: %d件中 %d件成功", len(items), ok)

実行結果:

INFO: 完了: 100件中 100件成功

件数が多いときは一定間隔でだけ出す方法もあります。

for i, item in enumerate(items, 1):
    if i % 1000 == 0:
        logging.info("進捗: %d / %d", i, len(items))

後から読める書き方にする

ログは数か月後に、文脈を忘れた状態で読むものです。

悪い例 良い例
logging.info("OK") logging.info("設定ファイルを読み込みました: %s", path)
logging.info(count) logging.info("取得件数: %d", count)
logging.info("done") logging.info("同期完了: 追加%d件 更新%d件", a, u)

数値だけ、記号だけのログは何の値か分からず役に立ちません。「何が」「どうなったか」を文にしてください。

また、検索できる形にしておくと後で助かります。注文IDやユーザーIDなど、後から追跡する鍵になる値を必ず含めてください。


個人情報を書かない

logging.info("ログイン: %s", user_id)       # OK(識別子)
logging.info("ログイン: %s", email)          # 避ける(個人情報)

ログファイルは長期保存され、バックアップや解析基盤にも複製されます。氏名・メールアドレス・電話番号・カード番号は記録しないのが原則です。

追跡にはIDを使い、必要なときだけデータベース側で突き合わせてください。


5つのログレベル

レベル 数値 使う場面
DEBUG 10 開発中の詳細な記録
INFO 20 正常に進んだことの記録
WARNING 30 問題の予兆(既定はここから)
ERROR 40 処理が失敗した
CRITICAL 50 システムが続行できない

logging.info()のまとめ

  • info()は正常に進んだことの記録
  • 既定では出ない。basicConfig(level=logging.INFO)が必要
  • 処理の開始と終了をセットで残す
  • 判断基準は「本番でも出したいか」
  • ループの中で出さない——まとめて1行にする
  • 後から読んで分かる文にし、追跡用のIDを含める
  • 個人情報は書かない

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら