# 📝 Centralized Logging System

This guide covers the **centralized, high-performance logging system** implemented using **Pino** - the fastest JSON logger for Node.js applications.

## 🎯 **Architecture Overview**

### **Single Logger System**

- ✅ **Backend (BFF)**: `nestjs-pino` with Pino
- ✅ **Frontend**: Custom structured logger compatible with backend
- ✅ **Shared**: Common interfaces and configurations
- ❌ **No more mixed logging systems**

### **Benefits of Centralization**

- 🚀 **Performance**: Pino is 5x faster than winston
- 🔒 **Security**: Automatic sensitive data sanitization
- 📊 **Structured**: JSON logging for better parsing
- 🌐 **Correlation**: Request tracking across services
- 📈 **Monitoring**: Easy integration with log aggregation'
- this implemetnatin requires more type safety faeteur

## 🏗️ **Implementation**

### **Backend (BFF) - NestJS + Pino**

```typescript
// ✅ CORRECT: Use nestjs-pino Logger
import { Logger } from "nestjs-pino";

@Injectable()
export class UserService {
  constructor(@Inject(Logger) private readonly logger: Logger) {}

  async findUser(id: string) {
    this.logger.info(`Finding user ${id}`);
    // ... implementation
  }
}
```

### **Frontend - Structured Logger**

```typescript
// ✅ CORRECT: Use shared logger interface
import { logger } from "@/lib/logger";

export function handleApiCall() {
  logger.logApiCall("/api/users", "GET", 200, 150);
  logger.logUserAction("user123", "login");
}
```

## 🚫 **What NOT to Do**

### **❌ Don't Use Multiple Logging Systems**

```typescript
// ❌ WRONG: Mixing logging systems
import { Logger } from "@nestjs/common"; // Don't use this - REMOVED
import { Logger } from "nestjs-pino"; // ✅ Use this - CENTRALIZED

// ❌ WRONG: Console logging in production
console.log("User logged in"); // Don't use console.log
logger.info("User logged in"); // Use structured logger
```

### **✅ Current Status: FULLY CENTRALIZED**

- **All BFF services** now use `nestjs-pino` Logger
- **No more** `@nestjs/common` Logger imports
- **No more** `new Logger()` instantiations
- **Single logging system** throughout the entire backend

### **❌ Don't Use Console Methods**

```typescript
// ❌ WRONG: Direct console usage
console.log("Debug info");
console.error("Error occurred");
console.warn("Warning message");

// ✅ CORRECT: Structured logging
logger.debug("Debug info");
logger.error("Error occurred");
logger.warn("Warning message");
```

## 🔧 **Configuration**

### **Environment Variables**

```bash
# Logging configuration
LOG_LEVEL=info                    # error, warn, info, debug, trace
APP_NAME=customer-portal-bff     # Service identifier
NODE_ENV=development             # Environment context
```

### **Log Levels**

| Level   | Numeric | Description                          |
| ------- | ------- | ------------------------------------ |
| `error` | 0       | Errors that need immediate attention |
| `warn`  | 1       | Warnings that should be monitored    |
| `info`  | 2       | General information about operations |
| `debug` | 3       | Detailed debugging information       |
| `trace` | 4       | Very detailed tracing information    |

## 📝 **Usage Examples**

### **Basic Logging**

```typescript
// Simple messages
logger.info("User authentication successful");
logger.warn("Rate limit approaching");
logger.error("Database connection failed");

// With structured data
logger.info("Invoice created", {
  invoiceId: "INV-001",
  amount: 99.99,
  userId: "user123",
});
```

### **API Call Logging**

```typescript
// Automatic API call logging
logger.logApiCall("/api/invoices", "POST", 201, 250, {
  userId: "user123",
  invoiceId: "INV-001",
});
```

### **User Action Logging**

```typescript
// User activity tracking
logger.logUserAction("user123", "password_change", {
  ipAddress: "192.168.1.1",
  userAgent: "Mozilla/5.0...",
});
```

### **Error Logging**

```typescript
// Comprehensive error logging
try {
  // ... operation
} catch (error) {
  logger.logError(error, "user_creation", {
    userId: "user123",
    email: "user@example.com",
  });
}
```

## 🔍 **Request Correlation**

### **Automatic Correlation IDs**

```typescript
// Every request gets a unique correlation ID
// Headers: x-correlation-id: 1703123456789-abc123def

logger.info("Processing request", {
  correlationId: req.headers["x-correlation-id"],
  endpoint: req.url,
  method: req.method,
});
```

### **Manual Correlation**

```typescript
// Set correlation context
logger.setCorrelationId("req-123");
logger.setUserId("user-456");
logger.setRequestId("req-789");

// All subsequent logs include this context
logger.info("User action completed");
```

## 📊 **Production Logging**

### **File Logging**

```typescript
// Automatic log rotation
// - Combined logs: logs/customer-portal-bff-combined.log
// - Error logs: logs/customer-portal-bff-error.log
// - Console output: stdout (for container logs)
```

### **Log Aggregation**

```typescript
// Structured JSON output for easy parsing
{
  "timestamp": "2025-01-22T10:30:00.000Z",
  "level": "info",
  "service": "customer-portal-bff",
  "environment": "production",
  "message": "User authentication successful",
  "correlationId": "req-123",
  "userId": "user-456",
  "data": {
    "ipAddress": "192.168.1.1",
    "userAgent": "Mozilla/5.0..."
  }
}
```

## 🚀 **Performance Benefits**

### **Benchmarks (Pino vs Winston)**

| Operation            | Pino | Winston | Improvement   |
| -------------------- | ---- | ------- | ------------- |
| JSON serialization   | 1x   | 5x      | **5x faster** |
| Object serialization | 1x   | 3x      | **3x faster** |
| String interpolation | 1x   | 2x      | **2x faster** |
| Overall performance  | 1x   | 5x      | **5x faster** |

### **Memory Usage**

- **Pino**: Minimal memory footprint
- **Winston**: Higher memory usage due to object retention
- **Console**: No memory overhead but unstructured

## 🔒 **Security Features**

### **Automatic Data Sanitization**

```typescript
// Sensitive data is automatically redacted
logger.info("User login", {
  email: "user@example.com",
  password: "[REDACTED]", // Automatically sanitized
  token: "[REDACTED]", // Automatically sanitized
  ipAddress: "192.168.1.1", // Safe to log
});
```

### **Sanitized Headers**

```typescript
// Request headers are automatically cleaned
{
  "authorization": "[REDACTED]",
  "cookie": "[REDACTED]",
  "x-api-key": "[REDACTED]",
  "user-agent": "Mozilla/5.0...",  // Safe to log
  "accept": "application/json"      // Safe to log
}
```

## 🔄 **Migration Guide**

### **From @nestjs/common Logger**

```typescript
// ❌ OLD: @nestjs/common Logger
import { Logger } from "@nestjs/common";
private readonly logger = new Logger(ServiceName.name);

// ✅ NEW: nestjs-pino Logger
import { Logger } from "nestjs-pino";
constructor(@Inject(Logger) private readonly logger: Logger) {}
```

### **From Console Logging**

```typescript
// ❌ OLD: Console methods
console.log("Debug info");
console.error("Error occurred");

// ✅ NEW: Structured logger
logger.debug("Debug info");
logger.error("Error occurred");
```

### **From Winston**

```typescript
// ❌ OLD: Winston logger
import * as winston from 'winston';
const logger = winston.createLogger({...});

// ✅ NEW: Pino logger
import { Logger } from "nestjs-pino";
constructor(@Inject(Logger) private readonly logger: Logger) {}
```

## 📋 **Best Practices**

### **✅ Do's**

- Use structured logging with context
- Include correlation IDs in all logs
- Log at appropriate levels
- Sanitize sensitive data
- Use consistent message formats

### **❌ Don'ts**

- Don't mix logging systems
- Don't use console methods in production
- Don't log sensitive information
- Don't log large objects unnecessarily
- Don't use string interpolation for logging

## 🛠️ **Troubleshooting**

### **Common Issues**

1. **Multiple Logger Instances**: Ensure single logger per service
2. **Missing Correlation IDs**: Check middleware configuration
3. **Performance Issues**: Verify log level settings
4. **Missing Logs**: Check file permissions and disk space

### **Debug Mode**

```bash
# Enable debug logging
LOG_LEVEL=debug pnpm dev

# Check logger configuration
LOG_LEVEL=trace pnpm dev
```

## 📚 **Additional Resources**

- [Pino Documentation](https://getpino.io/)
- [NestJS Pino Module](https://github.com/iamolegga/nestjs-pino)
- [Structured Logging Best Practices](https://12factor.net/logs)
- [Log Correlation Patterns](https://microservices.io/patterns/observability/distributed-tracing.html)
