@nestjs-labs/pino-http-extra
Version:
Enhanced pino-http with OpenTelemetry, Loki, file rotation and enterprise features.
178 lines (135 loc) • 4.86 kB
Markdown
# @nestjs-labs/pino-http-extra
Enhanced pino-http with OpenTelemetry, Loki, file rotation and enterprise features.
[](https://www.npmjs.com/package/@nestjs-labs/pino-http-extra)
[](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