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を含める
- 個人情報は書かない


