0
0
ExpressHow-ToBeginner · 3 min read

How to Use Pino Logger in Express for Fast Logging

To use pino in express, install pino and pino-http, then add pino-http as middleware to your Express app. This setup logs HTTP requests automatically with minimal code.
📐

Syntax

Use pino-http middleware to integrate Pino logging into Express. Import pino-http, create a logger instance, and add it as middleware with app.use(). This logs each HTTP request and response.

  • pinoHttp(): Initializes the logger middleware.
  • app.use(): Adds middleware to Express.
  • req.log: Logger instance available on each request.
javascript
import express from 'express';
import pinoHttp from 'pino-http';

const app = express();
const logger = pinoHttp();

app.use(logger);

app.get('/', (req, res) => {
  req.log.info('Handling root route');
  res.send('Hello from Express with Pino!');
});

app.listen(3000);
💻

Example

This example shows a simple Express server using pino-http middleware. It logs every request automatically and also logs a custom message inside the route handler.

javascript
import express from 'express';
import pinoHttp from 'pino-http';

const app = express();
const logger = pinoHttp();

app.use(logger);

app.get('/', (req, res) => {
  req.log.info('Root route accessed');
  res.send('Hello, Pino logging!');
});

app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});
Output
{"level":30,"time":1680000000000,"pid":12345,"hostname":"host","reqId":1,"req":{"method":"GET","url":"/","headers":{"host":"localhost:3000"}},"msg":"request completed"} {"level":30,"time":1680000000000,"pid":12345,"hostname":"host","reqId":1,"msg":"Root route accessed"}
⚠️

Common Pitfalls

Common mistakes when using Pino in Express include:

  • Not adding pino-http as middleware before routes, so requests are not logged.
  • Using pino logger directly without pino-http middleware, missing automatic request context.
  • Logging inside routes without using req.log, losing request-specific info.

Always use req.log inside route handlers for consistent request logging.

javascript
import express from 'express';
import pino from 'pino';
import pinoHttp from 'pino-http';

const app = express();
const logger = pino();

// Wrong: Not using pino-http middleware
app.get('/', (req, res) => {
  logger.info('This log misses request context');
  res.send('Hello');
});

// Right: Use pino-http middleware
app.use(pinoHttp());
app.get('/correct', (req, res) => {
  req.log.info('This log has request context');
  res.send('Hello with pino-http');
});
📊

Quick Reference

Summary tips for using Pino with Express:

  • Install pino and pino-http packages.
  • Add pino-http as middleware early with app.use().
  • Use req.log inside routes for request-specific logs.
  • Configure Pino options if needed for JSON formatting or log levels.

Key Takeaways

Add pino-http middleware to Express with app.use() for automatic request logging.
Use req.log inside route handlers to log messages with request context.
Install both pino and pino-http packages before using.
Avoid using pino logger directly without pino-http middleware in Express.
Configure pino options to customize log output and levels if needed.