JavaScript Tips | ログ・デバッグ・エラー処理:年末取得

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

共通 Logger は「全てのログを一つの入口で管理するための業務必須ユーティリティ」

業務システムでは、ログはただの「console.log の出力」ではありません。 障害調査、デバッグ、監査、ユーザー行動の追跡、API の失敗原因の特定など、 ログは システムの健康状態を把握するための“生命線” になります。

そのため、ログをバラバラに書くのではなく、 共通 Logger(ログ出力を一元管理する仕組み) を作ることが非常に重要です。

ここでは、初心者でも理解しやすいように、 共通 Logger の考え方、実装方法、業務で使えるテンプレートを 例題とコードを交えて丁寧に解説します。

共通 Logger を作る目的は「ログの統一・検索性・保守性の向上」

ログがバラバラだと起きる問題

  • 開発者ごとにログ形式が違う
  • どこで何が起きたか検索しづらい
  • 重要ログが埋もれる
  • エラーの原因が追いづらい
  • 本番環境では console.log が使えない場合もある

これらを防ぐために、 ログ出力の入口を一つにまとめる=共通 Logger を作る という発想が生まれます。

共通 Logger の基本構造は「レベル・時刻・メッセージ」

共通 Logger の基本は次の 3 要素です。

1. ログレベル

  • info
  • warn
  • error
  • debug

2. 時刻(タイムスタンプ)

ログは「いつ起きたか」が最重要です。

3. メッセージ

ログの内容そのもの。

これらを統一した形式で出力することで、 ログが読みやすく、検索しやすく、分析しやすくなります。

共通 Logger の最小構成(まずはこれだけで十分)

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())}`;
}

const Logger = {
  info(message) {
    console.log(`[INFO] [${getTimestamp()}] ${message}`);
  },
  warn(message) {
    console.warn(`[WARN] [${getTimestamp()}] ${message}`);
  },
  error(message) {
    console.error(`[ERROR] [${getTimestamp()}] ${message}`);
  },
  debug(message) {
    console.debug(`[DEBUG] [${getTimestamp()}] ${message}`);
  },
};
JavaScript

使用例

Logger.info("バッチ処理を開始しました");
Logger.warn("API のレスポンスが遅延しています");
Logger.error("データベース接続に失敗しました");
Logger.debug("ユーザーID=123 の処理を開始");
JavaScript

深掘り:共通 Logger が業務で強力な理由

1. ログ形式が統一される

どのログも同じフォーマットになるため、 検索・分析が圧倒的に楽になります。

2. 時刻が必ず付く

障害調査では「いつ起きたか」が最重要です。 タイムスタンプがあるだけで調査効率が大幅に上がります。

3. ログレベルで重要度を分類できる

  • info → 通常動作
  • warn → 注意
  • error → 障害
  • debug → 開発者向け

ログの意味が明確になります。

4. 出力先を後から変更できる

最初は console.log でも、 後からファイル出力や外部サービス送信に変更できます。

共通 Logger を拡張して「コンテキスト」を付ける

業務では「どの処理で起きたログか」を知りたい場面が多いです。

そのため、Logger に「context(文脈)」を付けると便利です。

function createLogger(context) {
  return {
    info(message) {
      console.log(`[INFO] [${context}] ${message}`);
    },
    warn(message) {
      console.warn(`[WARN] [${context}] ${message}`);
    },
    error(message) {
      console.error(`[ERROR] [${context}] ${message}`);
    },
    debug(message) {
      console.debug(`[DEBUG] [${context}] ${message}`);
    },
  };
}
JavaScript

使用例

const userLogger = createLogger("UserModule");
userLogger.info("ユーザー情報を取得しました");
userLogger.error("ユーザー情報の更新に失敗しました");
JavaScript

ログが次のように出力されます。

[INFO] [UserModule] ユーザー情報を取得しました
[ERROR] [UserModule] ユーザー情報の更新に失敗しました

深掘りポイント

  • モジュールごとに Logger を作れる
  • 障害調査で「どの処理が原因か」がすぐ分かる
  • 大規模システムで必須のテクニック

共通 Logger をさらに強化する:オブジェクトログ対応

業務では「オブジェクトをログに出したい」場面が多いです。

Logger.info({ userId: 123, status: "OK" });
JavaScript

これを安全に扱うために、 オブジェクトを JSON に変換する処理を追加します。

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

Logger に組み込むと次のようになります。

info(message) {
  console.log(`[INFO] [${getTimestamp()}] ${safeStringify(message)}`);
}
JavaScript

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

  info(msg) {
    console.log(`[INFO] [${this.timestamp()}] ${this.stringify(msg)}`);
  },

  warn(msg) {
    console.warn(`[WARN] [${this.timestamp()}] ${this.stringify(msg)}`);
  },

  error(msg) {
    console.error(`[ERROR] [${this.timestamp()}] ${this.stringify(msg)}`);
  },

  debug(msg) {
    console.debug(`[DEBUG] [${this.timestamp()}] ${this.stringify(msg)}`);
  },
};
JavaScript

共通 Logger を使った実務テンプレート

API 呼び出しのログ

function fetchUser(id) {
  Logger.info(`ユーザー ${id} の情報取得を開始`);
  // ...
  Logger.info(`ユーザー ${id} の情報取得が完了`);
}
JavaScript

エラー処理

try {
  doSomething();
} catch (e) {
  Logger.error({ message: "処理に失敗しました", error: e });
}
JavaScript

バッチ処理の開始・終了ログ

Logger.info("売上集計バッチを開始しました");
// 処理…
Logger.info("売上集計バッチが正常終了しました");
JavaScript

まとめ:共通 Logger は「システムの健康を守るための必須装備」

共通 Logger を正しく作ることで、次のメリットが得られます。

  • ログ形式が統一される
  • 障害調査が圧倒的に楽になる
  • ログの重要度が明確になる
  • 出力先を後から変更できる
  • 大規模システムでもログが迷子にならない

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

共通 Logger をユーティリティとして整備しておくことで、 どの場面でも安定したログ管理ができるようになります。

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