JavaScript Tips | ログ・デバッグ・エラー処理:ERRORログを出力する

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

ERRORログは「異常が発生した瞬間を正確に記録するための最重要ログ」

ERRORログは、業務システムにおいて 最も重要なログレベルです。 INFO や WARN が「正常系」「注意喚起」であるのに対し、 ERROR は 「処理が失敗した」「異常が発生した」ことを示します。

障害調査、監査、デバッグ、ユーザー問い合わせ対応など、 ERRORログが正しく記録されているかどうかで、 システムの信頼性が大きく変わります。

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

ERRORログの基本構造は「レベル+時刻+メッセージ+(詳細情報)」

ERRORログは次の 4 要素で構成されます。

  • ログレベル:ERROR
  • 時刻(タイムスタンプ):いつ発生したか
  • メッセージ:何が起きたか
  • 詳細情報(例外オブジェクトなど):原因を特定するための追加情報

ERRORログは「異常の証拠」になるため、 INFO や WARN よりも 詳細情報を丁寧に残すことが重要です。

ステップ1:タイムスタンプを作る

ERRORログには必ず時刻が必要です。 障害調査では「いつ起きたか」が最重要だからです。

function getTimestamp() {
  const d = new Date();
  const pad2 = (n) => String(n).padStart(2, "0");
  return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} `
       + `${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;
}
JavaScript

ステップ2:オブジェクトを安全に文字列化する

ERRORログでは例外オブジェクトを記録することが多いです。

try {
  throw new Error("DB接続に失敗");
} catch (e) {
  // e をログに出したい
}
JavaScript

しかし、オブジェクトをそのままログに出すと 循環参照などで失敗することがあります。

そのため、安全に JSON 化する関数を用意します。

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

ステップ3:ERRORログ関数を作る(最小構成)

function errorLog(message) {
  console.error(`[ERROR] [${getTimestamp()}] ${safeStringify(message)}`);
}
JavaScript

使用例

errorLog("データベース接続に失敗しました");
errorLog({ code: "DB001", detail: "接続タイムアウト" });
JavaScript

出力例:

[ERROR] [2026-08-10 11:40:00] データベース接続に失敗しました
[ERROR] [2026-08-10 11:40:01] {"code":"DB001","detail":"接続タイムアウト"}

ステップ4:例外(Errorオブジェクト)をログに出す

ERRORログで最も重要なのは 例外の内容(stack trace) です。

function logErrorWithStack(error) {
  console.error(`[ERROR] [${getTimestamp()}] ${error.message}`);
  console.error(error.stack);
}
JavaScript

使用例

try {
  throw new Error("API呼び出しに失敗しました");
} catch (e) {
  logErrorWithStack(e);
}
JavaScript

ステップ5:コンテキスト(文脈)を付ける

業務では「どの処理でエラーが起きたか」が重要です。

function createErrorLogger(context) {
  return function(message) {
    console.error(`[ERROR] [${getTimestamp()}] [${context}] ${safeStringify(message)}`);
  };
}
JavaScript

使用例

const apiErrorLogger = createErrorLogger("UserAPI");
apiErrorLogger("レスポンス解析に失敗しました");
JavaScript

出力例:

[ERROR] [2026-08-10 11:40:00] [UserAPI] レスポンス解析に失敗しました

ERRORログの業務テンプレート(完成版)

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]";
    }
  },

  error(msg, context = "") {
    const ctx = context ? `[${context}] ` : "";
    console.error(`[ERROR] [${this.timestamp()}] ${ctx}${this.stringify(msg)}`);
  },

  errorWithStack(error, context = "") {
    const ctx = context ? `[${context}] ` : "";
    console.error(`[ERROR] [${this.timestamp()}] ${ctx}${error.message}`);
    console.error(error.stack);
  },
};
JavaScript

ERRORログを使った実務テンプレート

API 呼び出しの失敗

js

try {
  await fetch("/api/user");
} catch (e) {
  Logger.errorWithStack(e, "UserAPI");
}
JavaScript

DB処理の失敗

Logger.error("DB接続に失敗しました", "Database");
JavaScript

バッチ処理の異常終了

Logger.error("売上集計バッチが異常終了しました", "SalesBatch");
JavaScript

外部サービスの障害

Logger.error({ service: "PaymentGateway", status: "DOWN" }, "ExternalService");
JavaScript

ERRORログを深掘り:なぜ「詳細情報」が重要なのか

1. 障害調査のスピードが劇的に変わる

ERRORログに stack trace があるだけで、 原因特定が数分で終わることがあります。

2. 再現が難しい障害でもログが証拠になる

本番環境では再現できない障害が多いため、 ERRORログが唯一の手がかりになることがあります。

3. チーム開発で「どこが壊れたか」を共有できる

ERRORログが整備されていると、 誰が見ても原因を追いやすくなります。

まとめ:ERRORログは「システムの異常を正確に記録する最重要ログ」

ERRORログを正しく扱うことで、次のメリットが得られます。

  • 障害調査が圧倒的に楽になる
  • stack trace により原因特定が高速化する
  • コンテキスト付きで「どこで壊れたか」が分かる
  • オブジェクトログで詳細情報を残せる
  • チーム全体でログ形式が統一される

ERRORログは、システムの安全性と信頼性を守るための 最も重要な診断データ です。

共通 Logger と組み合わせて ERRORログを整備しておくことで、 どの場面でも安定したログ管理ができるようになります。

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