Installation

Install Pino using npm:
npm install pino
For OpenTelemetry support, also install:
npm install pino-opentelemetry-transport

Setup

Create a logger.js file

Create a logger.js file in your project root to centralize logger configuration:
import pino from "pino";

const transport = pino.transport({
  targets: [
    {
      target: "pino/file",
      options: { destination: 1 }, // stdout
      level: "trace",
    },
    {
      target: "pino-opentelemetry-transport",
      options: {},
      level: "trace",
    },
  ],
});

// Wait for the Pino worker threads to be set up
// await new Promise((resolve) => setTimeout(resolve, 1000));

export const logger = pino(transport);
This configuration:
  • Sends logs to stdout (console)
  • Routes logs to OpenTelemetry transport for integration with observability platforms
  • Sets log level to “trace” to capture all events

Import and use in your app

In your main app.js, import the logger:
import { logger } from "./logger.js";
Then use it throughout your application:
logger.info("User logged in", { userId: 123 });
logger.warn("Rate limit approaching");
logger.error("Database connection failed", { error: err });

Log Levels

Pino supports the following log levels (in order of severity):
  • fatal - Application is unusable
  • error - Error condition
  • warn - Warning condition
  • info - Informational message
  • debug - Debug message
  • trace - Trace message (most verbose)

Learn More

For detailed documentation, visit the Pino npm package.