JavaScript Tips | ログ・デバッグ・エラー処理:本番環境でログを抑制する

JavaScript JavaScript
スポンサーリンク
スポンサーリンク

本番環境でログを抑制することは「安定運用のための必須テクニック」

本番環境では、ログを大量に出すと次のような問題が発生します。

  • ログファイルが肥大化してストレージを圧迫する
  • パフォーマンスが低下する(ログ出力は重い処理です)
  • 監視ツールがノイズで埋まり、重要なログを見逃す
  • セキュリティリスク(内部情報が漏れる可能性)

そのため、業務システムでは 「本番ではログを抑制し、必要なログだけ出す」 という設計が必須です。

ここでは、初心者でも理解しやすいように、 ログ抑制の考え方 → 実装 → 強化 → 業務テンプレート という流れでステップバイステップで解説します。

ログ抑制の基本は「環境ごとにログレベルを切り替える」こと

ログは次のようなレベルに分類されます。

  • DEBUG:開発者向け(本番では出さない)
  • INFO:正常動作の記録
  • WARN:注意喚起
  • ERROR:異常の記録(本番でも必須)

本番環境では、 DEBUG を完全にオフにし、INFO も必要最低限に抑える というのが一般的です。

ステップ1:環境を判定するフラグを作る

まずは「本番かどうか」を判定するフラグを作ります。

Node.js の例

const IS_PROD = process.env.NODE_ENV === "production";
JavaScript

ブラウザ(Vite など)

const IS_PROD = import.meta.env.PROD;
JavaScript

ステップ2:ログレベルを制御する設定を作る

ログレベルを環境ごとに切り替えるための設定を作ります。

const LOG_LEVEL = IS_PROD ? "WARN" : "DEBUG";
JavaScript

ログレベルの優先順位

DEBUG < INFO < WARN < ERROR

本番では WARN 以上だけ出す、という設計が一般的です。

ステップ3:ログレベルを判定する関数を作る

function shouldLog(level) {
  const levels = ["DEBUG", "INFO", "WARN", "ERROR"];
  return levels.indexOf(level) >= levels.indexOf(LOG_LEVEL);
}
JavaScript

動作例

  • 本番(LOG_LEVEL = “WARN”)
    • DEBUG → 出ない
    • INFO → 出ない
    • WARN → 出る
    • ERROR → 出る

ステップ4:共通 Logger にログ抑制機能を組み込む

export const Logger = {
  pad2(n) {
    return String(n).padStart(2, "0");
  },

  timestamp() {
    const d = new Date();
    return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())} `
         + `${this.pad2(d.getHours())}:${this.pad2(d.getMinutes())}:${this.pad2(d.getSeconds())}`;
  },

  stringify(value) {
    try {
      return typeof value === "string" ? value : JSON.stringify(value);
    } catch {
      return "[Unserializable Object]";
    }
  },

  log(level, msg, context = "") {
    if (!shouldLog(level)) return;

    const ctx = context ? `[${context}] ` : "";
    const formatted = `[${level}] [${this.timestamp()}] ${ctx}${this.stringify(msg)}`;

    switch (level) {
      case "DEBUG": console.debug(formatted); break;
      case "INFO": console.log(formatted); break;
      case "WARN": console.warn(formatted); break;
      case "ERROR": console.error(formatted); break;
    }
  },

  debug(msg, ctx) { this.log("DEBUG", msg, ctx); },
  info(msg, ctx) { this.log("INFO", msg, ctx); },
  warn(msg, ctx) { this.log("WARN", msg, ctx); },
  error(msg, ctx) { this.log("ERROR", msg, ctx); },
};
JavaScript

ステップ5:本番環境でログが抑制されることを確認する

開発環境(LOG_LEVEL = “DEBUG”)

Logger.debug("デバッグ情報");  // 出る
Logger.info("通常ログ");       // 出る
Logger.warn("注意ログ");       // 出る
Logger.error("エラーログ");    // 出る
JavaScript

本番環境(LOG_LEVEL = “WARN”)

Logger.debug("デバッグ情報");  // 出ない
Logger.info("通常ログ");       // 出ない
Logger.warn("注意ログ");       // 出る
Logger.error("エラーログ");    // 出る
JavaScript

ステップ6:本番環境でログを抑制する理由を深掘りする

1. パフォーマンス向上

ログ出力は I/O 処理なので重いです。 大量の DEBUG があると処理速度が落ちます。

2. ログストレージの節約

本番ではログが膨大になるため、 不要なログは出さないことが重要です。

3. セキュリティリスクの回避

DEBUGログには内部情報が含まれることがあります。 本番で出すと情報漏洩につながります。

4. 監視のノイズを減らす

本番では WARN と ERROR を中心に監視します。 DEBUG が混ざると重要ログを見逃す可能性があります。

ステップ7:業務で使えるログ抑制テンプレート

API 呼び出し

Logger.debug("APIレスポンスを受信しました", "UserAPI"); // 本番では出ない
Logger.warn("APIレスポンスが遅延しています", "UserAPI"); // 本番でも出る
Logger.error("API呼び出しに失敗しました", "UserAPI");   // 本番でも出る
JavaScript

バッチ処理

Logger.info("売上集計バッチ開始", "SalesBatch"); // 本番では出ない
Logger.warn("集計に時間がかかっています", "SalesBatch"); // 出る
Logger.error("集計処理が異常終了しました", "SalesBatch"); // 出る
JavaScript

まとめ:本番環境でログを抑制することは「安定運用のための必須技術」

本番環境でログを抑制することで、次のメリットが得られます。

  • パフォーマンスが向上する
  • ログストレージを節約できる
  • セキュリティリスクを減らせる
  • 監視がノイズに邪魔されない
  • 障害調査が効率的になる

ログはただの文字列ではなく、 システムの健康状態を記録する重要な診断データ です。

だからこそ、 本番では必要なログだけ出す=ログ抑制が必須 なのです。

タイトルとURLをコピーしました