SPAとSSRでログ設計が変わる理由(アクセスログとAPIログ)

SPAとSSRは「ログの意味」がまったく違います

Webシステムを運用し始めてから、初めて気づくことがあります。
それは「ログが読めない」という問題です。

特にSPA(Single Page Application)へ移行した直後、多くのチームが同じ混乱を経験します。

  • アクセスは増えているはずなのにログが減る
  • ユーザがどのページを見たかわからない
  • 障害が再現できない

結論から言うと、これは異常ではありません。
SPAではアクセスログがアプリケーションログとして機能しなくなるためです。

SSRとSPAは描画方法の違いだけでなく、「観測できるイベント」が根本的に変わります。

従来のWeb(MPA/SSR)のログ構造

まずSSRや従来のMPA(Multi Page Application)のログを見てみます。
サーバのアクセスログには次の情報が記録されます。

  • URL
  • ステータスコード
  • レスポンス時間
  • ユーザエージェント
  • リファラ

例えば:

/products/1
/products/2
/cart
/checkout

これだけでユーザの行動がほぼ追跡できます。
なぜなら、ページ遷移=HTTPリクエストだからです。

つまりアクセスログは単なる通信ログではなく、ユーザ行動ログとして機能していました。

SPAで起きる変化

SPAではページ遷移が発生しません。
ブラウザ内でルーティングが行われます。

サーバに届くリクエストは次のようになります。

  • 初回:GET /
  • 以降:APIリクエストのみ

つまり、ユーザが10ページ移動してもアクセスログは1行です。

その代わり増えるのがAPIログです。

/api/products
/api/cart
/api/user

ここで問題が発生します。
APIログは「機能の呼び出し」であって「画面遷移」ではありません。

カートAPIが呼ばれても、それが

  • カート画面表示
  • 数量変更
  • 自動同期

のどれか判断できません。

なぜ障害調査が難しくなるのか

SSRでは、エラー発生時に次がわかりました。

  • どのURLで
  • 誰が
  • いつ
  • どの画面で

SPAではこれが消えます。
代わりに残るのは

  • どのAPIが失敗したか

だけです。

結果として「ユーザが何をしていたか」が追えません。

必要になる新しいログ:フロントエンドログ

SPAではサーバログだけでは足りません。
ブラウザ側のログ収集が必要になります。

例えば:

window.addEventListener('error', e => {
  sendLog({
    message: e.message,
    url: location.pathname,
    stack: e.error?.stack
  })
})

これにより

  • どの画面で
  • どの操作中に
  • 何が起きたか

を取得できます。

重要になる「画面遷移ログ」

SPAでは明示的に画面遷移を記録します。

router.afterEach((to) => {
  sendLog({ type: 'pageview', path: to.path })
})

これはアクセスログの代替です。
これを行わないと、分析も障害調査も困難になります。

SSRでもログ設計は変わる

SSRだから安心、というわけでもありません。
最近のSSRはAPI中心の構成です。

  • BFF(Backend for Frontend)
  • GraphQL
  • マイクロサービス

この構成では1ページ表示の裏で複数APIが動きます。
単一のアクセスログでは原因を追えません。

そのため必要になるのがリクエストIDです。

const requestId = crypto.randomUUID()
res.setHeader('x-request-id', requestId)

そしてすべてのログに含めます。

  • CDNログ
  • SSRログ
  • APIログ

これで初めて1回の表示を追跡できます。

よくある失敗

APIログだけで分析しようとする

SPAではほぼ必ず失敗します。
APIはユーザ操作と1対1対応しません。

エラー監視をサーバだけに置く

実際のエラーの多くはブラウザで発生します。

  • JavaScript例外
  • Hydrationエラー
  • ネットワーク失敗

これらはサーバログに残りません。

結局ログとは何か

SSR時代、ログは「サーバの記録」でした。
SPA時代、ログはユーザ体験の記録になります。

重要なのはリクエスト数ではなく、

  • どの画面で
  • 何をしようとして
  • どこで失敗したか

です。

ログ設計はインフラの話ではありません。
アプリケーション設計の一部です。

SPAへ移行するとき、レンダリングや状態管理は議論されますが、ログ設計は後回しにされがちです。
しかし運用が始まると、最初に困るのはログです。

画面が動いていても、観測できなければ運用できません。
SPAとSSRの違いを本当に理解するとは、「表示方法」ではなく観測方法の違いを理解することです。