JavaScript Tips | ログ・デバッグ・エラー処理:ErrorをJSON化する

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

Error を JSON 化することは「エラー情報を安全・確実に構造化して扱うための基盤技術」

Error オブジェクトは JavaScript の中でも特殊な存在です。 messagestack を持ち、さらに API エラーなどでは独自のプロパティが追加されることもあります。

しかし、初心者が必ずつまずくポイントがあります。

  • JSON.stringify(new Error("失敗"))期待通りに動かない
  • Error の stack が JSON に含まれない
  • Error に追加されたプロパティが JSON 化されない
  • 循環参照があると JSON 化に失敗する

業務では、ログ送信・監視ツール連携・API レスポンス整形などで Error を JSON 化するユーティリティが必須です。

ここでは、ステップバイステップで Error の JSON 化の考え方 → 実装 → 強化 → 業務テンプレート までを丁寧に解説します。

Error を JSON 化するための基本理解(最重要ポイント)

Error はそのまま JSON 化できない

次のコードを見てください。

JSON.stringify(new Error("失敗"));
JavaScript

結果はなんと…

{}

空オブジェクトになります。

理由は、Error の messagestackenumerable(列挙可能)ではないためです。

つまり、通常の JSON 化では拾われません。

ステップ1:Error の主要プロパティを手動で抽出する

まずは Error の基本情報を手動で取り出します。

function extractErrorBase(error) {
  return {
    name: error.name,
    message: error.message,
    stack: error.stack,
  };
}
JavaScript

使用例

try {
  throw new Error("DB接続に失敗");
} catch (e) {
  console.log(extractErrorBase(e));
}
JavaScript

ステップ2:Error に追加されたプロパティも取り込む

業務では API エラーなどで Error に追加情報が付くことがあります。

const err = new Error("API失敗");
err.code = "API001";
err.status = 500;
JavaScript

これらも JSON 化したいので、 Error の 自前プロパティを取り込みます。

function extractErrorProps(error) {
  const extra = {};

  for (const key of Object.keys(error)) {
    extra[key] = error[key];
  }

  return extra;
}
JavaScript

ステップ3:Error を「安全に」JSON 化する

循環参照があると JSON.stringify が失敗するため、 安全な stringify を用意します。

function safeStringify(value) {
  try {
    return JSON.stringify(value);
  } catch {
    return "[Unserializable Object]";
  }
}
JavaScript

ステップ4:Error を完全に JSON 化するユーティリティを作る(基本版)

function errorToJson(error) {
  if (!(error instanceof Error)) {
    return { message: String(error) };
  }

  return {
    ...extractErrorBase(error),
    ...extractErrorProps(error),
  };
}
JavaScript

使用例

try {
  throw new Error("ファイル読み込み失敗");
} catch (e) {
  console.log(errorToJson(e));
}
JavaScript

ステップ5:JSON 文字列として出力するユーティリティを作る

function errorToJsonString(error) {
  return safeStringify(errorToJson(error));
}
JavaScript

使用例

try {
  throw new Error("API失敗");
} catch (e) {
  console.error(errorToJsonString(e));
}
JavaScript

ステップ6:整形済み JSON をログに出す(業務で最も使われる形)

function logErrorAsJson(error, context = "") {
  const ctx = context ? `[${context}] ` : "";
  console.error(`${ctx}${errorToJsonString(error)}`);
}
JavaScript

ステップ7:業務で使える Error JSON 化ユーティリティ(完成版)

export const ErrorJsonUtil = {
  extractBase(error) {
    return {
      name: error.name,
      message: error.message,
      stack: error.stack,
    };
  },

  extractProps(error) {
    const extra = {};
    for (const key of Object.keys(error)) {
      extra[key] = error[key];
    }
    return extra;
  },

  toJson(error) {
    if (!(error instanceof Error)) {
      return { message: String(error) };
    }

    return {
      ...this.extractBase(error),
      ...this.extractProps(error),
    };
  },

  stringify(error) {
    try {
      return JSON.stringify(this.toJson(error));
    } catch {
      return "[Unserializable Error]";
    }
  },
};
JavaScript

ステップ8:業務での活用例

API エラーを監視ツールに送信する

try {
  await fetch("/api/user");
} catch (e) {
  sendToMonitoringService(ErrorJsonUtil.stringify(e));
}
JavaScript

バッチ処理の異常終了ログ

try {
  runBatch();
} catch (e) {
  Logger.error(ErrorJsonUtil.stringify(e), "SalesBatch");
}
JavaScript

外部サービスの障害を JSON 化して保存

Logger.error(ErrorJsonUtil.stringify(e), "ExternalService");
JavaScript

深掘り:なぜ Error を JSON 化する必要があるのか

1. 外部サービスに送信するため

監視ツール(Datadog、Sentry、CloudWatch など)は JSON 形式を前提にしていることが多いです。

2. ログを構造化して検索しやすくするため

JSON 形式なら、 「message が ‘DB接続’ を含むエラーだけ検索」 などが簡単になります。

3. エラーの追加情報も確実に残せる

API エラーの codestatus など、 独自プロパティも JSON 化できます。

4. チーム全体で統一されたエラーログ形式になる

誰が見ても理解できるログは、 調査の属人化を防ぎます。

まとめ:Error を JSON 化することは「障害調査の効率を最大化する技術」

Error を JSON 化できるようになると、次のメリットがあります。

  • エラー情報を構造化して扱える
  • 監視ツールに送信しやすくなる
  • 追加情報も確実にログに残せる
  • 読みやすいログ形式を統一できる
  • 障害調査のスピードが劇的に向上する

Error はそのままでは扱いづらい特殊なオブジェクトですが、 JSON 化ユーティリティを作れば、どんな環境でも安全に扱えるようになります。

業務システムの品質を支える重要な基盤として、 ぜひ Error JSON 化ユーティリティを活用してください。

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