UNPKG

@nestjs-labs/pino-http-extra

Version:

Enhanced pino-http with OpenTelemetry, Loki, file rotation and enterprise features.

181 lines (135 loc) 4.9 kB
# @nestjs-labs/pino-http-extra Enhanced pino-http with OpenTelemetry, Loki, file rotation and enterprise features. [![npm version](https://img.shields.io/npm/v/@nestjs-labs/pino-http-extra.svg)](https://www.npmjs.com/package/@nestjs-labs/pino-http-extra) [![License](https://img.shields.io/npm/l/@nestjs-labs/pino-http-extra.svg)](https://github.com/nestjs-labs/nestjs-pino-extra/blob/main/LICENSE) ## Features - 🔍 **OpenTelemetry Integration**: Automatic span and trace ID injection - 📊 **Loki Transport**: Send logs to Grafana Loki - 📁 **File Rotation**: Automatic log file rotation with compression - 🎨 **Pretty Logging**: Colored and formatted console output - 🔒 **Security**: Automatic redaction of sensitive fields - ⚡ **Performance**: High-performance logging with Pino - 🆔 **Request ID**: Automatic request ID generation and tracking - 📈 **Response Time**: Automatic response time tracking ## Installation ```bash npm install @nestjs-labs/pino-http-extra ``` ## Quick Start ### Basic Setup ```typescript import pino from 'pino'; import pinoHttp from 'pino-http'; import { getPinoHttpOption, getMultiDestinationStream } from '@nestjs-labs/pino-http-extra'; 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); ``` ### Express.js Integration ```typescript 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', { host: 'http://loki:3100', basicAuth: { username: 'admin', password: 'admin', }, labels: { app, service: app, }, }); const pinoHttpOption = getPinoHttpOption(); const pinoHttpLogger = pinoHttp(pinoHttpOption); app.use(pinoHttpLogger); app.get('/', (req, res) => { req.log.info('Hello from pino-http-extra!'); res.json({ message: 'Hello World!' }); }); app.listen(3000, () => { console.log('Server running on port 3000'); }); ``` ### Fastify Integration ```typescript import Fastify from 'fastify'; import { getPinoHttpOption } 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 }); ``` ## API Reference ### Core Functions #### `getPinoHttpOption(level?, spanIdKey?, traceIdKey?)` Get pino-http options with OpenTelemetry integration and security features. **Parameters:** - `level`: `string` (default: `'info'`) - Log level - `spanIdKey`: `string` (default: `'spanId'`) - OpenTelemetry span ID key - `traceIdKey`: `string` (default: `'traceId'`) - OpenTelemetry trace ID key **Returns:** `Options` - Configured pino-http options #### `getMultiDestinationStream(app, level?, filepath?, loki?)` Create multi-destination stream supporting pretty, file, and Loki outputs. **Parameters:** - `app`: `string` - Application name for Loki labels - `level`: `pino.Level` (default: `'info'`) - Log level - `filepath`: `string` (optional) - Log file path for rotation - `loki`: `string` (optional) - Loki host URL **Returns:** `MultiStreamRes` - Configured multi-stream ## Examples ### Custom Logging ```typescript 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') }); ``` ### HTTP Request Logging The middleware automatically logs HTTP requests with: - **Request ID**: Automatically generated and tracked - **Response Time**: Automatic timing of request duration - **Status Code Logging**: - 2xx: `info` level - 4xx: `warn` level - 5xx: `error` level - 3xx: `silent` level - **Sensitive Data Redaction**: Automatic redaction of password fields - **OpenTelemetry Integration**: Automatic span and trace ID injection ### Log Output Example ```json { "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" } ``` ## License MIT