Use structured logging with Pino throughout your application. Covers log levels, context, and workflow-safe logging patterns.
/plugin marketplace add andrelandgraf/fullstackrecipes/plugin install observability-monitoring@fullstackrecipesThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Use structured logging with Pino throughout your application. Covers log levels, context, and workflow-safe logging patterns.
See:
using-logging in Fullstack RecipesImport the logger and use it throughout your application:
import { logger } from "@/lib/common/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" });
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");
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 |
Set the PINO_LOG_LEVEL environment variable:
# Show all logs including debug
PINO_LOG_LEVEL="debug"
# Production: only warnings and errors
PINO_LOG_LEVEL="warn"
Default is info if not set.
import { logger } from "@/lib/common/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 });
}
}
Workflow functions run in a restricted environment. Use the logger step wrapper:
// src/workflows/chat/steps/logger.ts
import { logger } from "@/lib/common/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 });
}
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.