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-httpas middleware before routes, so requests are not logged. - Using
pinologger directly withoutpino-httpmiddleware, 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
pinoandpino-httppackages. - Add
pino-httpas middleware early withapp.use(). - Use
req.loginside 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.