Next.js 本番環境モニタリング:エラー追跡、ログ、アラートの「守りの要」
「本番環境でエラーが出ているらしいですが、再現できません」
開発者として、これほど胃が痛くなる言葉はありません。
Next.js は「ブラウザ(Client)」「サーバー(Server)」「エッジ(Edge)」の3箇所でコードが動くため、従来よりもエラーの特定が困難です。サーバーサイドレンダリング(SSR)中に起きたエラーは、ユーザーには単なる「500 Internal Server Error」として表示され、ブラウザのコンソールには何も残りません。
私たちは盲目状態で戦うべきではありません。適切なモニタリングツールを導入すれば、「ユーザーがどのボタンを押した直後に、どんな変数の状態で、どの行でエラーが起きたか」が全て手に取るように分かります。
この記事では、私が本番環境で実際に採用している「Sentry + Pino + Slack」による鉄壁のモニタリング構成を紹介します。
なぜ Next.js の監視は特殊なのか?
従来の SPA(シングルページアプリケーション)なら、ブラウザのエラーさえ監視していれば9割はカバーできました。しかし Next.js は違います。
- サーバーサイドエラーの不可視性:
getServerSidePropsや Server Components、API Routes で起きたエラーはサーバー内で完結し、ブラウザには届きません。 - ハイドレーションエラー: サーバーとクライアントの HTML 不一致によるエラーは、Next.js 特有かつ頻発する問題です。
- Edge Runtime: Middleware などは Node.js ではなく Edge Runtime で動くため、一部のライブラリが動かず、特有のエラーを引き起こします。
これら全てを一元管理できるツールが必要です。そこでデファクトスタンダードとなっているのが Sentry です。
ステップ 1: Sentry の導入と設定
Sentry は Next.js 向けに専用の SDK を提供しており、導入は驚くほど簡単です。
npx @sentry/wizard@latest -i nextjs
このウィザードを実行すると、自動的に必要なファイル(sentry.client.config.ts, sentry.server.config.ts, sentry.edge.config.ts)を作成し、next.config.js を書き換えてソースマップのアップロード設定まで行ってくれます。
設定のポイント
ウィザード任せでも動きますが、本番運用のために以下の調整をお勧めします。
サンプリングレートの調整(コスト削減)
デフォルトでは全トランザクションを送信しますが、アクセス数が多いとすぐに無料枠を使い切ります。
// sentry.client.config.ts / server / edge 共通
Sentry.init({
dsn: "YOUR_DSN",
// 本番環境では 10% 程度に絞るのが一般的
tracesSampleRate: process.env.NODE_ENV === 'production' ? 0.1 : 1.0,
// エラーは全件送信(重要!)
sampleRate: 1.0,
});
機密情報の除外
ユーザーのパスワードや個人情報が誤って送信されないよう、サニタイズ設定を確認します。Sentry はデフォルトで優秀なフィルタリングを行いますが、念のため確認しましょう。
ステップ 2: 構造化ログ(Structured Logging)の導入
console.log("Error happened:", err) は卒業しましょう。テキスト形式のログは、集計も検索も困難です。
代わりに Pino を使って、JSON 形式でログを出力します。
npm install pino
// lib/logger.ts
import pino from 'pino';
export const logger = pino({
level: process.env.LOG_LEVEL || 'info',
// 開発時は読みやすい形式、本番はJSON
transport: process.env.NODE_ENV !== 'production'
? { target: 'pino-pretty' }
: undefined,
base: {
env: process.env.NODE_ENV,
},
});
使い方:
import { logger } from '@/lib/logger';
export async function POST(req: Request) {
try {
// ...処理
logger.info({ userId: user.id, action: 'create_post' }, '記事が作成されました');
} catch (error) {
logger.error({ err: error, userId: user.id }, '記事作成に失敗しました');
}
}
これで、後から「userId: 123 のログだけ見たい」「エラーログだけ集計したい」といった操作が容易になります。Datadog や CloudWatch Logs と連携すれば完璧です。
Correlation ID(相関ID)でリクエストを追跡
マイクロサービスやサーバーレス環境では、1つのリクエストが複数の処理をまたぐため、ログを紐付ける魔法の鍵が必要です。それが Correlation ID です。
Middleware で生成し、ヘッダーに付与して引き回します。
// middleware.ts
import { NextResponse } from 'next/server';
import { v4 as uuidv4 } from 'uuid';
export function middleware(request: Request) {
const requestHeaders = new Headers(request.headers);
const correlationId = uuidv4();
requestHeaders.set('x-correlation-id', correlationId);
const response = NextResponse.next({
request: { headers: requestHeaders },
});
response.headers.set('x-correlation-id', correlationId);
return response;
}
ログ出力時にこの ID を含めれば、特定のリクエストの一連の流れ(Middleware → API → DB)を完全に追跡できます。
ステップ 3: アラート戦略(Slack 通知)
エラーを収集しても、気づかなければ意味がありません。しかし、全部通知すると「通知疲れ(Alert Fatigue)」で誰も見なくなります。
以下のような 区分け(Triage) を推奨します。
| レベル | 内容 | 通知先 | 対応期限 |
|---|---|---|---|
| P0 (Critical) | サイトダウン、決済失敗、主要機能の停止 | Slack #incident + 電話 | 即時 |
| P1 (High) | 特定ユーザーで発生するエラー、重要でない機能の停止 | Slack #dev-alerts | 4時間以内 |
| P2 (Medium) | 軽微な表示崩れ、稀なエッジケース | メールレポート | 今週中 |
| P3 (Low) | 警告、非推奨APIの使用 | 通知なし(ダッシュボード確認) | 余裕があれば |
Sentry の “Alert Rules” でこれらのルールを設定し、Slack の対応チャンネルに振り分けましょう。
まとめ:守りの要
モニタリングは、エンジニアにとっての「保険」であり「目」です。
これらを設定しておけば、ユーザーからの問い合わせが来たとき、「少々お待ちください」と言ってログを確認し、「ああ、決済サーバーがタイムアウトしていますね」と即座に回答できます。この信頼感は何物にも代えがたいものです。
- Sentry で全方位のエラーを捕捉する。
- Pino で検索可能なログを残す。
- Correlation ID で処理の流れを追う。
- Slack に適切な粒度で通知する。
この4ステップで、あなたの Next.js アプリケーションは「眠れる」システムになります。
Next.js 本番環境モニタリング構築フロー
Sentry の導入からログ設計、アラート設定までのステップバイステップガイド
⏱️ 目安時間: 30 分
- 1
ステップ1: Sentry のセットアップ
`npx @sentry/wizard@latest -i nextjs` を実行し、ウィザードに従ってプロジェクトを設定します。これによりクライアント、サーバー、エッジすべての環境監視が有効になります。 - 2
ステップ2: ソースマップのアップロード確認
ビルドプロセス(`next build`)で Sentry へのソースマップアップロードが成功しているか確認します。これがないと本番環境のエラーログが解読できません。 - 3
ステップ3: 構造化ログライブラリの導入
Pino 等のロガーを導入し、開発環境では読みやすく(pretty print)、本番環境では JSON 形式で出力するように `lib/logger.ts` を構成します。 - 4
ステップ4: Correlation ID の実装
Middleware でリクエスト毎に UUID を生成し、ヘッダーに付与します。ロガーにもこの ID を渡すことで、ログの追跡性を確保します。 - 5
ステップ5: アラート通知ルールの設定
Sentry の管理画面で、クリティカルなエラーのみを Slack 等に通知するルールを作成します。ノイズを減らすことが持続可能な運用の鍵です。
FAQ
Sentry のパフォーマンスへの影響はありますか?
console.log をそのまま使ってはいけませんか?
個人情報の扱いはどうすればいいですか?
エラー通知が多すぎて困っています。
4 min read · 公開日: 2025年12月20日 · 更新日: 2026年4月20日
Next.js 完全ガイド
検索からこのページに来た場合は、前後の記事もあわせて読むと同じテーマの理解がかなり早く深まります。
前の記事
Next.js + Prisma 完全ガイド:DB接続の落とし穴から本番運用まで
Next.js と Prisma を組み合わせる際の「正解」を網羅した完全ガイド。開発環境でのDB接続数枯渇問題の解決(シングルトンパターン)、効率的なスキーマ設計、型安全なCRUD操作、そしてトランザクション管理まで徹底解説します。
第 39 / 46 記事
次の記事
Next.js Docker 自前ホスティング完全ガイド:Vercel からの卒業
Next.js アプリケーションを Docker 化し、VPS にデプロイする完全ガイド。standalone モードによる軽量化、Nginx リバースプロキシの設定、ストリーミングレンダリング(SSR)の問題解決、CI/CD 連携までを網羅し、コストを大幅に削減します。
第 41 / 46 記事
関連記事
Next.js App Router 入門ガイド:コアコンセプトと基本的な使い方を完全解説
Next.js App Router 入門ガイド:コアコンセプトと基本的な使い方を完全解説
Next.js 15実践:週末だけで生産性レベルのブログシステムを構築した話
Next.js 15実践:週末だけで生産性レベルのブログシステムを構築した話
Next.js Middleware 実践ガイド:パス一致、Edge Runtime 制限とよくある落とし穴
コメント
GitHubアカウントでログインしてコメントできます