Agent skill

pino

Pino fast JSON logger for Node.js. Covers log levels, child loggers, transports, and redaction. Triggers on pino, logger, log.info, log.error.

Stars 163
Forks 31

Install this agent skill to your Project

npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/development/pino

SKILL.md

<mcp_first> CRITICAL: Fetch Pino documentation before implementing.

MCPSearch({ query: "select:mcp__plugin_devtools_octocode__githubSearchCode" })
typescript
// Pino configuration
mcp__octocode__githubSearchCode({
  keywordsToSearch: ["pino", "logger", "transport"],
  owner: "pinojs",
  repo: "pino",
  path: "lib",
  mainResearchGoal: "Understand Pino logger configuration",
  researchGoal: "Find logger setup patterns",
  reasoning: "Need current API for Pino setup"
})

// Transports
mcp__octocode__githubSearchCode({
  keywordsToSearch: ["pino-pretty", "transport", "destination"],
  owner: "pinojs",
  repo: "pino",
  path: "docs",
  mainResearchGoal: "Understand Pino transports",
  researchGoal: "Find transport configuration patterns",
  reasoning: "Need current API for log transports"
})

</mcp_first>

<quick_start> Basic setup:

typescript
import pino from "pino";

const logger = pino({
  level: process.env.LOG_LEVEL || "info",
});

logger.info("Server started");
logger.error({ err }, "Database connection failed");
logger.debug({ userId }, "User authenticated");

With pretty printing (development):

typescript
import pino from "pino";

const logger = pino({
  level: "debug",
  transport: {
    target: "pino-pretty",
    options: {
      colorize: true,
      translateTime: "HH:MM:ss",
      ignore: "pid,hostname",
    },
  },
});

Child loggers:

typescript
const requestLogger = logger.child({ requestId: req.id });
requestLogger.info("Processing request");
// Output: {"level":30,"requestId":"abc123","msg":"Processing request"}

</quick_start>

<log_levels>

Level Value Use Case
fatal 60 App crash
error 50 Error conditions
warn 40 Warning conditions
info 30 Normal operations
debug 20 Debug information
trace 10 Detailed tracing
</log_levels>
typescript
// Good - structured data
logger.info({ userId, action: "login" }, "User logged in");

// Bad - string interpolation
logger.info(`User ${userId} logged in`);

Error logging:

typescript
try {
  await riskyOperation();
} catch (error) {
  // Pass error as `err` property for proper serialization
  logger.error({ err: error, context: "riskyOperation" }, "Operation failed");
}

Request logging middleware:

typescript
function requestLogger(req, res, next) {
  const start = Date.now();
  const log = logger.child({ requestId: req.id });

  res.on("finish", () => {
    log.info({
      method: req.method,
      url: req.url,
      status: res.statusCode,
      duration: Date.now() - start,
    }, "Request completed");
  });

  req.log = log;
  next();
}

Redaction (hide sensitive data):

typescript
const logger = pino({
  redact: ["password", "creditCard", "*.secret", "users[*].token"],
});

logger.info({ password: "secret123" }); // password: "[Redacted]"
typescript
import pino from "pino";

const logger = pino({
  transport: {
    targets: [
      {
        target: "pino-pretty",
        options: { colorize: true },
        level: "debug",
      },
      {
        target: "pino/file",
        options: { destination: "./app.log" },
        level: "info",
      },
    ],
  },
});

Custom transport:

typescript
const logger = pino({
  transport: {
    target: "./my-transport.js",
    options: { customOption: true },
  },
});

Performance:

  • Pino is async by default
  • Use pino.destination() for sync in critical paths
  • Avoid logging in hot paths

<success_criteria>

  • Logger configured with appropriate level
  • Structured logging (not string interpolation)
  • Errors passed as err property
  • Sensitive data redacted
  • Pretty printing in development only </success_criteria>

Didn't find tool you were looking for?

Be as detailed as possible for better results