Pino + pino-pretty ログ設定と使用例

2024/12/23に公開

はじめに

Node.js でアプリケーションのログを効果的に管理するためには、適切なロギングライブラリの選択が重要です。本記事では、Pinopino-pretty を組み合わせて、開発環境における簡単で効率的なロギングを実現する方法をご紹介します。また、logFactory 関数を用いた柔軟なロギングの設定と使用例も示します。


実行環境

  • M2 Mac Mini
  • Node.js
  • Next.js 14
  • Docker 25.0.2
  • VSCode エディタ

手順

1. 必要なパッケージのインストール

まず、Pino とその拡張機能である pino-pretty をインストールします。

npm i pino pino-pretty

2. Logger の設定ファイル作成

logger.ts ファイルを作成し、以下のように設定します。この設定では、ロガーをモジュールごとに作成でき、child メソッドを使ってさらにコンテキストを追加できます。

import pino from "pino";
import pretty from "pino-pretty";

let _logger: pino.Logger | undefined;

// デフォルトのpretty-print設定
const DEFAULT_PRETTY_OPTIONS = {
  sync: true,
  messageFormat: "{method}: {msg}",
  hideObject: false,
  ignore: "hostname,method",
} as const;

export const logFactory = (name: string) => {
  if (_logger) {
    return _logger;
  }

  const prettyStream = pretty(DEFAULT_PRETTY_OPTIONS);

  _logger = pino(
    {
      name,
      formatters: {
        level: (label: string) => ({ level: label }),
      },
      timestamp: pino.stdTimeFunctions.isoTime,
    },
    prettyStream
  );
  return _logger;
};

このコードでは以下の点が特徴です:

  • logFactory: 初期化済みのロガーを返し、再作成を防ぎます。
  • DEFAULT_PRETTY_OPTIONS: 開発環境に適した見やすいログ出力を設定します。
  • コンテキストの追加: child メソッドで動的な情報をログに追加可能。

3. ログの使用例

以下は、モジュールでログを使用する方法を示しています。

const moduleLogger = logFactory("〇〇.service.ts");

const createMethod = async () => {
  const logger = moduleLogger.child({ method: "createMethod" });
  try {
    // 作成処理
    const response = await fetch("http://localhost:3000/create", { method: "POST" });
    if (!response.ok)
      throw new Error("コンテンツ リストの取得に失敗しました。");
    const data = await response.json();
    // ログ出力
    logger.info({ msg: "response data", data });
  } catch (error) {
    // エラーのログ出力
    logger.error({ msg: "create error", error });
  }
};

重要なポイント:

  • logFactory を使用してモジュール専用のロガーを作成。
  • child メソッドで、メソッドやトランザクションに応じたコンテキスト情報を追加。
  • ログレベル (info, error など) を使用して重要度を分けた記録が可能。

実行結果

  1. 正常時のログ:
    createMethod: response data {
      "data": { "id": 1, "status": "created" }
    }
    
  2. エラー発生時のログ:
    createMethod: create error {
      "error": "Error: コンテンツ リストの取得に失敗しました。"
    }
    

まとめ

Pino と pino-pretty を使うことで、シンプルかつ高速なロギングが可能です。このアプローチは特に以下のケースで役立ちます:

  • モジュールごとのログ管理: logFactory を利用することでロガーを柔軟に構成。
  • 開発環境に適した出力: pino-pretty の利用で、見やすいフォーマットを実現。

これにより、開発中のデバッグ効率が向上し、本番環境向けに最適化された構成への移行も容易になります。

Discussion