🩺

Dockerにした途端、FastAPIのログが消えたとき ── logging が出力されなくなる構成上の原因

に公開

はじめに:何が起きたか

ローカルでは uvicorn で普通に logging が出ていたのに、
Docker + gunicorn にした瞬間、ログだけが一切出なくなることがある。

エラーは出ない。

アプリは起動している。

エンドポイントも普通に叩ける。

それでも、

ログだけが何も表示されない

この事故が厄介な理由

この手のトラブルは、

落ちるわけでもなく、例外が出るわけでもない。

ただ、

「何も起きなくなる」。

いわば、静かに死ぬ事故だ。

気づくのが遅れやすく、

気づいた時には

「どこから見ればいいのか分からない」状態になりがちになる。

なぜ Docker にすると logging が消えるのか

logging が出なくなる理由はひとつではないが、

Docker 化によって見えづらくなるポイントは、だいたい決まっている。

例えば:

  • stdout / stderr の行き先が変わる
    (PYTHONUNBUFFERED やログレベルの継承が影響するケースもある)
  • gunicorn / uvicorn の起動方法が変わる
    (worker 設定や loglevel の扱い)
  • logging 設定の読み込みタイミングが変わる

特に厄介なのは、

logging は設定が多少ズレていてもアプリが動いてしまう点だ。

そのため、

問題が表に出にくい。

この手の事故は、実は珍しくない。

切り分けは「順番」がすべて

この事故で一番やってはいけないのは、

いきなり logging 設定を書き直すことだ。

初動では、次の順で切り分ける。

  1. logging が本当に呼ばれているか
    • logger.info() 自体が実行されているか
  2. Docker コンテナ内で stdout / stderr がどこに流れているか
  3. gunicorn / uvicorn をどう起動しているか
  4. logging 設定ファイルをどこで読み込んでいるか

この順で確認すれば、

原因はかなり絞れる。

ここまで来て問題が見えない場合、

FastAPI 自体に原因がある可能性は低い。

ありがちな勘違い

  • ローカルで出ていたから、本番でも出ると思っていた
  • logging の設定は一度書けば終わりだと思っていた
  • Docker は「包むだけ」だと思っていた

logging 周りは、

作り直しても再発しやすいポイントでもある。

まとめ

logging が出ないのは、

バグではないことが多い。

仕様どおりに出ていないだけ。

帰り際の一言

何も出ていないからといって、

何も起きていないとは限らない。


🛠️ FastAPI インシデント分析シリーズ
「401 / JWT / Dockerでだけ壊れる」など、原因切り分けが難しいケースをパターン別に公開しています。

🔐 認証・JWTトラブル
/tokenは通るのに /me が401になる理由
[https://zenn.dev/fastapier/articles/0022f125547300]
(※一番人気。検証フローの盲点を解説)

環境変数は設定したのに SECRET_KEY が None になる理由
[https://zenn.dev/fastapier/articles/e93b522cc0acb3]

401 / 403 を取り違えると、原因が見えなくなる
[https://zenn.dev/fastapier/articles/41f9e2e10e7c19]

Depends が静かに壊れて 401 / 403 になる理由
[https://zenn.dev/fastapier/articles/efba40f5bcbbda]

🐳 Docker・本番環境トラブル
ローカルでは動くのに本番だけ落ちる理由
[https://zenn.dev/fastapier/articles/c90e5199e0bafc]

🏗️ 設計・運用トラブル
main.pyが1000行を超えたときに起きる崩壊の理由
[https://zenn.dev/fastapier/articles/a2a9a5209dedac]


💡 インシデント分析・個別相談のご案内
上記のようなトラブルの分析・評価を専門に承っております。GitHubプロフィール欄の連絡先よりご相談ください。
[https://github.com/hiro-kuroe]

Discussion