Skip to main content

Log Plugin

Provides comprehensive request and response logging for your application. Automatically logs HTTP requests and responses with configurable detail levels.

Quick Start

import { Server } from 'balda-js';

const server = new Server({
plugins: {
log: {
logRequest: true,
logResponse: true
}
}
});

Configuration

Basic Configuration

log: {
logRequest: true, // Enable request logging
logResponse: true // Enable response logging
}

Detailed Configuration

log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true, // Log HTTP method
url: true, // Log request URL
ip: true, // Log client IP
headers: true, // Log request headers
body: false // Log request body (default: false)
},
responsePayload: {
status: true, // Log response status
headers: false, // Log response headers (default: false)
body: false // Log response body (default: false)
}
}

Usage

Global Logging

const server = new Server({
plugins: {
log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true,
url: true,
ip: true,
headers: false, // Disable for privacy
body: false
},
responsePayload: {
status: true,
headers: false,
body: false
}
}
}
});

Route-Level Logging

import { log } from 'balda-js';

@controller('/api')
export class ApiController {
@get('/users', {
middleware: [log({
logRequest: true,
logResponse: true
})]
})
async getUsers(req: Request, res: Response) {
res.json(await getUsers());
}

// Disable logging for health checks
@get('/health', {
middleware: [log({
logRequest: false,
logResponse: false
})]
})
async health(req: Request, res: Response) {
res.json({ status: 'ok' });
}
}

Log Output

Request Log

{
"level": 30,
"time": 1234567890,
"type": "request",
"requestId": "abc123",
"method": "GET",
"url": "/api/users",
"headers": {}
}

Response Log

{
"level": 30,
"time": 1234567891,
"type": "response",
"requestId": "abc123",
"status": 200
}

Configuration Options

requestPayload Options

OptionTypeDefaultDescription
methodbooleantrueLog HTTP method
urlbooleantrueLog request URL
ipbooleantrueLog client IP
headersbooleantrueLog request headers
bodybooleanfalseLog request body

responsePayload Options

OptionTypeDefaultDescription
statusbooleantrueLog response status
headersbooleanfalseLog response headers
bodybooleanfalseLog response body

Common Patterns

Production Logging

log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true,
url: true,
ip: true,
headers: false, // Don't log sensitive headers
body: false // Don't log request bodies
},
responsePayload: {
status: true,
headers: false,
body: false
}
}

Development Logging

log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true,
url: true,
ip: true,
headers: true,
body: true // Log everything in development
},
responsePayload: {
status: true,
headers: true,
body: true
}
}

API Monitoring

log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true,
url: true,
ip: true,
headers: false,
body: false
},
responsePayload: {
status: true, // Track status codes
headers: false,
body: false
}
}

Minimal Logging

log: {
logRequest: true,
logResponse: false,
requestPayload: {
method: true,
url: true,
ip: false,
headers: false,
body: false
}
}

Environment-Based Configuration

const isProduction = process.env.NODE_ENV === 'production';

const server = new Server({
plugins: {
log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true,
url: true,
ip: true,
headers: !isProduction, // Only in development
body: !isProduction // Only in development
},
responsePayload: {
status: true,
headers: !isProduction,
body: !isProduction
}
}
}
});

Complete Example

const server = new Server({
port: 3000,
plugins: {
log: {
logRequest: true,
logResponse: true,
requestPayload: {
method: true,
url: true,
ip: true,
headers: false,
body: false
},
responsePayload: {
status: true,
headers: false,
body: false
}
}
}
});

@controller('/api')
export class ApiController {
@get('/users')
async getUsers(req: Request, res: Response) {
// Logs: GET /api/users → 200
const users = await getUsers();
res.json(users);
}

@get('/health', {
middleware: [log({ logRequest: false, logResponse: false })]
})
async health(req: Request, res: Response) {
// No logging for health checks
res.json({ status: 'ok' });
}
}

Disabling Logging

const server = new Server({
plugins: {
log: {
logRequest: false,
logResponse: false
}
}
});

Best Practices

  1. Don't log sensitive data - Disable headers/body logging in production
  2. Exclude health checks - Use route-level logging to exclude health endpoints
  3. Monitor performance - Track response times and status codes
  4. Use structured logging - JSON format makes logs easy to parse
  5. Configure by environment - More verbose in development, minimal in production