「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Node.js アプリケーションでのエラー処理とログ記録

Node.js アプリケーションでのエラー処理とログ記録

2024 年 11 月 9 日に公開
ブラウズ:391

Error Handling and Logging in Node.js Applications

導入

バックエンド開発の世界では、回復力と保守性の高いアプリケーションを構築するために、信頼性の高いエラー処理と構造化されたロギングが不可欠です。 Node.js での効果的なエラー処理により、ユーザー エクスペリエンスが向上するだけでなく、デバッグが簡素化され、アプリケーションの監視が強化されます。適切なロギングと組み合わせることで、開発者は問題をより迅速に追跡し、システムの状態をリアルタイムで監視できます。この記事では、アプリケーションをより堅牢にして本番環境に対応できるようにする Node.js のエラー処理とログ戦略について詳しく説明します。

1. Node.js のエラー処理を理解する

Node.js でのエラー処理には、主に非同期のイベント駆動型アーキテクチャが原因で、独特の課題があります。 Node.js で効果的なエラー処理を行うための重要な違いと原則をいくつか見てみましょう:

  • 同期エラーと非同期エラー: 同期エラーはすぐに発生し、従来の try-catch ブロックを使用してキャプチャできますが、非同期エラーは後で発生し、コールバック、Promise、または async/await パターンなどの異なる処理が必要です。
  • 統合エラー処理戦略: 多数の非同期操作において、統合アプローチを維持することで、アプリケーション全体でエラーをより効果的に管理できます。一貫したエラー処理によりデバッグが簡素化され、エラーが均一に伝播されログに記録されるようになります。

2.基本的なエラー処理テクニック

Node.js は、特に非同期ワークフローでのエラーを管理するためのいくつかのメカニズムを提供します。

  • Try-Catch ブロック: これらは同期コードのエラーを処理するのに役立ちますが、非同期コードのエラーはキャッチしません。例えば:
  try {
    const data = JSON.parse(jsonString);
  } catch (error) {
    console.error("JSON parsing error:", error);
  }
  • エラー オブジェクト: Node.js のエラー オブジェクトには、開発者が問題をデバッグするのに役立つスタック トレースなどの重要な情報が含まれています。カスタム エラー メッセージは明確で実用的なものである必要があります。

  • Promise および Async/Await でのエラー処理:

    • Promises: Promise の拒否を処理するには .catch() を使用します。
    fetchData()
      .then(data => console.log(data))
      .catch(error => console.error("Error fetching data:", error));
    
    • Async/Await: 非同期エラー処理のために await 呼び出しを try-catch ブロック内にラップします。
    async function fetchData() {
      try {
        const data = await someAsyncFunction();
        console.log(data);
      } catch (error) {
        console.error("Error:", error);
      }
    }
    
  • グローバル エラー処理:

    • キャッチされない例外: キャッチされない例外をキャプチャするには process.on('uncaughtException', callback) を使用します。
    • 未処理の拒否: 未処理の Promise 拒否には process.on('unhandledRejection', callback) を使用します。これは運用環境における最後の防御線となりますが、一般的にはエラーが発生した場所の近くでエラーを処理することが推奨されます。

3.高度なエラー処理パターン

よりスケーラブルで保守可能なエラー処理には、次の高度なテクニックが不可欠です。

  • Express でのミドルウェア エラー処理: Express は、エラーをキャプチャしてカスタム ミドルウェアに渡す組み込みのエラー処理メカニズムを提供します。
  app.use((err, req, res, next) => {
    console.error("Error:", err);
    res.status(500).send("Something went wrong!");
  });
  • 集中エラー管理: 集中エラー処理モジュールを作成してカスタム エラー応答とメッセージを定義し、エラーを処理する標準化された方法を提供できます。
  class AppError extends Error {
    constructor(message, statusCode) {
      super(message);
      this.statusCode = statusCode;
      Error.captureStackTrace(this, this.constructor);
    }
  }
  • エラー コードと分類: HTTP ステータス コードを使用してエラーを分類し (クライアント エラーの場合は 4xx、サーバー エラーの場合は 5xx)、より詳細なログ記録とエラー追跡のためのカスタム コードを追加します。

4. Node.js でのロギングの実装

ロギングは、アプリケーション内で何が起こっているかについての洞察を提供し、バグを追跡するのに非常に貴重です。 Node.js で効果的なロギングを実装する方法は次のとおりです:

  • 基本的なコンソールログ:
    コンソール オブジェクト (console.log、console.error など) は便利ですが、運用環境では制限されます。構造化されたレベルベースのロギングには、専用のロギング ライブラリを使用することをお勧めします。

  • ロギングに Winston を使用する:
    Winston は、情報、警告、エラー、デバッグなどのレベルで構造化されたログを提供する強力なログ ライブラリです。

  const winston = require("winston");

  const logger = winston.createLogger({
    level: "info",
    format: winston.format.json(),
    transports: [
      new winston.transports.File({ filename: "error.log", level: "error" }),
      new winston.transports.Console({ format: winston.format.simple() })
    ]
  });
  • ログレベル:

    • info: アプリケーションの動作に関する一般情報。
    • warn: 警告。通常は問題はありませんが、注目すべきイベントです。
    • エラー: 緊急の対応が必要な重大な問題。
    • debug: デバッグに役立つ詳細情報。
  • ログのローテーション:

    ログのローテーションにより、ログ ファイルのサイズが制限され、効率的なストレージが確保されます。 Winston の winston-daily-rotate-file トランスポートは、日ごとのログ管理に役立ちます。

5.本番環境でのエラーとログの管理

本番環境でエラーとログを管理するには、パフォーマンスとデータ セキュリティを維持するために追加の考慮事項が必要です。

  • ログ サービスの使用:
    LogglyPapertrailELK Stack (Elasticsearch、Logstash、Kibana) などのサービスを統合して、一元的なログ管理を実現します。これらのツールは、本番環境の問題を迅速にトラブルシューティングするための強力な検索およびフィルタリング オプションを提供します。

  • パフォーマンスに関する考慮事項:
    ロギングはパフォーマンスに影響を与える可能性があるため、特にトラフィックの多いアプリケーションでは過剰なロギングを避けてください。開発 (デバッグ) と運用 (情報またはエラー) で異なるログ レベルを設定することを検討してください。

  • ログの保護:
    機密情報の漏洩を防ぐには、機密データのログ記録を避けるか、マスキング技術を使用してユーザー情報を匿名化します。

6.実際の例

  • E コマース アプリケーション: E コマース アプリケーションの場合、チェックアウト プロセスでのユーザーのアクションを記録し、エラーを監視することで、ユーザーの行動やコンバージョンを妨げている問題についての洞察を得ることができます。
  • 構造化ログを使用した REST API: 構造化ログを使用する REST API は、リクエストの詳細、エラー、ユーザー アクセスを追跡し、システムの信頼性の維持に役立ちます。

結論

要約すると、Node.js で適切に設計されたエラー処理とログ戦略は、回復力と保守性の高いアプリケーションを構築するために重要です。効果的なエラー処理と構造化されたログにより、開発者はアプリケーションの監視、トラブルシューティング、最適化を行うことができ、エラーを適切に処理し、アプリケーションの健全性を追跡する準備が整っていることを確認できます。これらのテクニックと継続的なモニタリングを組み合わせることで、より信頼性の高いシステムを実稼働環境に備えることができます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/divine_nnanna2/error-handling-and-logging-in-nodejs-applications-1k2a?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3