Enhanced pino-http with OpenTelemetry, Loki, file rotation and enterprise features.
npm install @nestjs-labs/pino-http-extra
import pino from 'pino'
import pinoHttp from 'pino-http'
import { getPinoHttpOption, getMultiDestinationStream } from '@nestjs-labs/pino-http-extra'
import "dotenv/config"
const level = process.env.LOG_LEVEL || 'info'
const app = process.env.APP_NAME || 'my-app'
const pinoHttpOption = getPinoHttpOption(level, 'spanId', 'traceId')
const filename = process.env.LOG_FILE || 'logs/app.log'
const loki = process.env.LOKI_HOST
const multiStream = getMultiDestinationStream(app, level as pino.Level, filename, loki)
const pinoHttpLogger = pinoHttp(pinoHttpOption)
const logger = pino(pinoHttpOption, multiStream)
import express from 'express'
import pinoHttp from 'pino-http'
import { getPinoHttpOption, getMultiDestinationStream } from '@nestjs-labs/pino-http-extra'
const app = express()
const multiStream = getMultiDestinationStream(app, 'info', 'logs/app.log', 'http://loki:3100')
const pinoHttpOption = getPinoHttpOption()
const pinoHttpLogger = pinoHttp(pinoHttpOption)
const logger = pino(pinoHttpOption, multiStream)
// Use as middleware
app.use(pinoHttpLogger)
app.get('/', (req, res) => {
req.log.info('Hello from pino-http-extra!')
res.json({ message: 'Hello World!' })
})
app.listen(3000, () => {
logger.info('Server running on port 3000')
})
import Fastify from 'fastify'
import { getPinoHttpOption, getMultiDestinationStream } from '@nestjs-labs/pino-http-extra'
const fastify = Fastify({
logger: getPinoHttpOption()
})
fastify.get('/', async (request, reply) => {
request.log.info('Hello from pino-http-extra!')
return { message: 'Hello World!' }
})
fastify.listen({ port: 3000 })
import { getPinoHttpOption, getMultiDestinationStream } from '@nestjs-labs/pino-http-extra'
// Custom OpenTelemetry keys
const options = getPinoHttpOption('debug', 'customSpanId', 'customTraceId')
// Multi-destination with custom settings
const multiStream = getMultiDestinationStream(
'my-app', // app name
'info', // log level
'/var/log/app.log', // file path (optional)
'http://loki:3100' // loki host (optional)
)
getPinoHttpOption(level?, spanIdKey?, traceIdKey?)
Get pino-http options with OpenTelemetry integration and security features.
Parameters:
level
: string
(default: 'info'
) - Log levelspanIdKey
: string
(default: 'spanId'
) - OpenTelemetry span ID keytraceIdKey
: string
(default: 'traceId'
) - OpenTelemetry trace ID keyReturns: Options
- Configured pino-http options
Features:
getMultiDestinationStream(app, level?, filepath?, loki?)
Create multi-destination stream supporting pretty, file, and Loki outputs.
Parameters:
app
: string
- Application name for Loki labelslevel
: pino.Level
(default: 'info'
) - Log levelfilepath
: string
(optional) - Log file path for rotationloki
: string
(optional) - Loki host URLReturns: MultiStreamRes
- Configured multi-stream
Features:
createPrettyStreamEntry(app, level)
Create pretty console stream entry.
createFileStreamEntry(app, level, filepath)
Create file rotation stream entry.
createLokiStreamEntry(app, level, host)
Create Loki transport stream entry.
getOtelFormatters(spanIdKey?, traceIdKey?)
Get OpenTelemetry formatters for automatic span and trace ID injection.
getSerializers()
Get enhanced serializers for request/response objects.
import pino from 'pino'
import { getPinoHttpOption } from '@nestjs-labs/pino-http-extra'
const logger = pino(getPinoHttpOption())
logger.info('Application started')
logger.warn('Warning message')
logger.error('Error occurred', { error: new Error('Something went wrong') })
The middleware automatically logs HTTP requests with:
info
levelwarn
levelerror
levelsilent
level{
"level": "info",
"time": "2024-01-15T10:30:00.000Z",
"reqId": "550e8400-e29b-41d4-a716-446655440000",
"spanId": "1234567890abcdef",
"traceId": "abcdef1234567890",
"req": {
"method": "GET",
"url": "/api/users",
"headers": {
"user-agent": "Mozilla/5.0..."
}
},
"res": {
"statusCode": 200
},
"responseTime": 45,
"msg": "request completed"
}
This project is licensed under the MIT License - see the LICENSE file for details.