mcpField
U
using-logging

using-logging

github.com/andrelandgraf開発2399 回インストール20 週間前に更新
リポジトリ

using-logging について

Fullstack Recipesの、Pinoによる構造化ログの実装スキルです。ログレベル、コンテキスト情報、環境変数による設定、ワークフローコード向けのログ手法を扱います。

主な機能

  1. 01Pinoによる構造化ログ
  2. 02ログレベルと用途
  3. 03LOG_LEVELの設定
  4. 04リクエストのコンテキスト情報
  5. 05ワークフロー向けのログ手法

活用シーン

  1. 01APIルートへのコンテキストログ追加
  2. 02運用イベントに応じたレベル選択
  3. 03環境ごとのログ詳細度の調整
  4. 04ワークフロー関数でのログ記録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/andrelandgraf/fullstackrecipes --skill using-logging

インストール後、Claude Code で/using-loggingを入力して読み込まれたか確認します。

詳細

ロギングの使用

アプリケーション全体で Pino による構造化ロギングを使用します。ログレベル、コンテキスト、ワークフローで安全に使えるロギングパターンについて説明します。

ロギングの使用方法

アプリケーション全体で Pino による構造化ロギングを使用します。ログレベル、コンテキスト、ワークフローで安全に使えるロギングパターンについて説明します。

参照:


基本的なロギング

ロガーをインポートし、アプリケーション全体で使用します。

import { logger } from "@/lib/logging/logger";

// Info level for normal operations
logger.info("Server started", { port: 3000 });

// Warn level for recoverable issues
logger.warn("Rate limit reached", { endpoint: "/api/chat" });

// Error level with Error objects
logger.error(err, "Failed to process request");

// Debug level for development troubleshooting
logger.debug("Cache miss", { key: "user:123" });
構造化ロギング

構造化ログでは、必ず最初の引数にコンテキストを含めます。

// Context object first, message second
logger.info({ userId: "123", action: "login" }, "User logged in");

// For errors, pass the error first
logger.error({ err, userId: "123", endpoint: "/api/chat" }, "Request failed");
ログレベル

状況に応じて適切なレベルを使用します。

| レベル | 使用する場面 | | trace | 詳細なデバッグ(ほとんど使用しません) | | debug | 開発時のトラブルシューティング | | info | 通常の操作、ビジネスイベント | | warn | 回復可能な問題、非推奨の警告 | | error | 対応が必要な障害 | | fatal | 致命的な障害、アプリを続行できない場合 |

ログレベルの設定

LOG_LEVEL 環境変数を設定します。

# Show all logs including debug
LOG_LEVEL="debug"

# Production: only warnings and errors
LOG_LEVEL="warn"

設定されていない場合のデフォルトは info です。有効な値:trace、debug、info、warn、error、fatal。

API ルートでのロギング
import { logger } from "@/lib/logging/logger";

export async function POST(request: Request) {
  const start = Date.now();

  try {
    const result = await processRequest(request);

    logger.info(
      { duration: Date.now() - start, status: 200 },
      "Request completed",
    );

    return Response.json(result);
  } catch (err) {
    logger.error({ err, duration: Date.now() - start }, "Request failed");

    return Response.json({ error: "Internal error" }, { status: 500 });
  }
}
ワークフローでのロギング

ワークフロー関数は制限された環境で実行されます。ロガーのステップラッパーを使用します。

// src/workflows/chat/steps/logger.ts
import { logger } from "@/lib/logging/logger";

export async function log(
  level: "info" | "warn" | "error" | "debug",
  message: string,
  data?: Record<string, unknown>,
): Promise<void> {
  "use step";

  if (data) {
    logger[level](data, message);
  } else {
    logger[level](message);
  }
}

次に、ワークフロー内で使用します。

import { log } from "./steps/logger";

export async function chatWorkflow({ chatId }) {
  "use workflow";

  await log("info", "Workflow started", { chatId });
}

参考資料

コメント