mcpField
U
using-logging

using-logging

github.com/andrelandgrafDevelopment2399 installsUpdated 20w ago
Repository

About using-logging

A Fullstack Recipes skill for implementing structured logging with Pino. It covers log levels, contextual fields, environment-based configuration, and logging patterns suitable for workflow code.

Key features

  1. 01Pino structured logging
  2. 02Log levels and their uses
  3. 03LOG_LEVEL configuration
  4. 04Context fields for requests
  5. 05Workflow-safe logging patterns

Use cases

  1. 01Adding contextual logs to API routes
  2. 02Choosing levels for operational events
  3. 03Changing log verbosity by environment
  4. 04Logging from workflow functions

Install

Copy the command and run it in a terminal.

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

After installing, type/using-loggingin Claude Code to confirm it loaded.

Details

From the project README

Working with Logging

Use structured logging with Pino throughout your application. Covers log levels, context, and workflow-safe logging patterns.

Implement Working with Logging

Use structured logging with Pino throughout your application. Covers log levels, context, and workflow-safe logging patterns.

See:


Basic Logging

Import the logger and use it throughout your application:

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" });
Structured Logging

Always include context as the first argument for structured logs:

// 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");
Log Levels

Use appropriate levels for different scenarios:

| Level | When to Use | | trace | Detailed debugging (rarely used) | | debug | Development troubleshooting | | info | Normal operations, business events | | warn | Recoverable issues, deprecation warnings | | error | Failures that need attention | | fatal | Critical failures, app cannot continue |

Configuring Log Level

Set the LOG_LEVEL environment variable:

# Show all logs including debug
LOG_LEVEL="debug"

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

Default is info if not set. Valid values: trace, debug, info, warn, error, fatal.

Logging in API Routes
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 });
  }
}
Logging in Workflows

Workflow functions run in a restricted environment. Use the logger step wrapper:

// 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);
  }
}

Then use it in workflows:

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

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

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

References

Comments

Markdown supported