[One Package Per Day] pino - The Logger We Trust in Node.js Projects
By hungpd, at: June 8, 2025, 6:25 p.m.
Estimated Reading Time: __READING_TIME__ minutes
![[One Package Per Day] pino - The Logger We Trust in Node.js Projects](/media/filer_public_thumbnails/filer_public/ad/85/ad854393-ffb3-4df5-8289-a75820e66da7/pino_logging_-_nodejs.png__1500x900_crop_subsampling-2_upscale.png)
![[One Package Per Day] pino - The Logger We Trust in Node.js Projects](/media/filer_public_thumbnails/filer_public/ad/85/ad854393-ffb3-4df5-8289-a75820e66da7/pino_logging_-_nodejs.png__400x240_crop_subsampling-2_upscale.png)
When building robust Node.js applications, logging is one of the most underrated superheroes. It saves us during debugging, helps us trace bugs in production, and provides critical observability into how our systems behave.
Over the years, we’ve tried many loggers - from console.log
(yes, guilty) to winston to bunyan. But for the last few years, one package has won our full trust: pino.
If you’re looking for speed, structure, and simplicity, look no further.
What is pino?
pino (which literally means pine in Italian) is a blazing-fast JSON logger for Node.js. It’s designed for production use where performance and structured logs matter.
It claims to be the fastest logger in town, and spoiler: it delivers.
Why We Use pino in Every Node Project
1. Crazy Fast
Benchmarks show that pino can log over 30,000 lines per second without breaking a sweat. That’s 10x faster than winston in many cases. If you care about performance (and you should), this is a game-changer.
const pino = require('pino');
const logger = pino();
logger.info('Hello world');
This runs faster than your morning coffee kicks in.
2. Structured Logging (JSON FTW)
pino logs everything in JSON format. That might seem noisy at first, but it’s gold for log aggregation platforms like:
Example output:
{
"level": 30,
"time": 1717481229491,
"pid": 9094,
"hostname": "glinteco-dev",
"msg": "Server started on port 3000"
}
Structured logs = searchable logs = better debugging.
3. Works Beautifully with TypeScript
If you’re using TypeScript, pino provides typings out of the box and integrates well with log levels, custom serializers, and log methods. You can even define your own log interface to enforce structure.
4. Low Overhead in Production
pino writes logs asynchronously by default. That means no blocking your main thread. It even recommends piping logs through its CLI tool pino-pretty during development so you don’t lose performance in production.
In dev:
node app.js | pino-pretty
In prod:
node app.js >> logs.json
Efficient and smart.
5. Flexible and Extensible
-
Want to redact sensitive fields?
-
Want custom serializers?
-
Need child loggers for different modules?
-
Want to log to a file, stdout, or external stream?
pino is versatile enough to scale with your growing app.
A Typical Setup at Glinteco
// logger.ts
import pino from 'pino';
export const logger = pino({
level: process.env.LOG_LEVEL || 'info',
redact: ['req.headers.authorization'], // hide secrets
transport:
process.env.NODE_ENV === 'development'
? {
target: 'pino-pretty',
options: { colorize: true },
}
: undefined,
});
Then in any file:
import { logger } from
'./logger';
logger.info('App is starting...');
pino vs winston vs bunyan
Final Thoughts
Logging shouldn’t be an afterthought. If you’re building anything in Node.js that might one day hit production, do yourself a favor: ditch console.log
and install pino.
Fast, structured, and reliable - it’s the logger we trust.