barsa 7c929eb4dc Update Customer Portal Documentation and Remove Deprecated Files
- Streamlined the README.md for clarity and conciseness.
- Deleted outdated documentation files related to Freebit SIM management, SIM management API data flow, and various architectural guides to reduce clutter and improve maintainability.
- Updated the last modified date in the README to reflect the latest changes.
2025-12-23 15:43:36 +09:00

332 lines
7.3 KiB
Markdown

# 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
### Benefits
- **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
---
## Log Levels
| Level | Numeric | What You'll See | Best For |
| ------- | ------- | -------------------- | ---------------------- |
| `error` | 0 | Only critical errors | Production monitoring |
| `warn` | 1 | Warnings + errors | Quiet development |
| `info` | 2 | General operations | **Normal development** |
| `debug` | 3 | Detailed debugging | Troubleshooting issues |
| `trace` | 4 | Very verbose tracing | Deep debugging |
---
## Configuration
### Environment Variables
```bash
# Core logging
LOG_LEVEL="info" # Main log level
DISABLE_HTTP_LOGGING="false" # Set to "true" to disable HTTP logs entirely
# Application context
APP_NAME="customer-portal-bff" # Service name in logs
NODE_ENV="development" # Affects log formatting
```
### Using the Script
```bash
# Check current level
./scripts/set-log-level.sh
# Set to minimal logging (production-like)
./scripts/set-log-level.sh warn
# Set to normal development logging
./scripts/set-log-level.sh info
# Set to detailed debugging
./scripts/set-log-level.sh debug
```
---
## 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");
}
```
---
## 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
logger.logApiCall("/api/invoices", "POST", 201, 250, {
userId: "user123",
invoiceId: "INV-001",
});
```
### User Action Logging
```typescript
logger.logUserAction("user123", "password_change", {
ipAddress: "192.168.1.1",
userAgent: "Mozilla/5.0...",
});
```
### Error Logging
```typescript
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");
```
---
## What's Been Optimized
### Reduced Noise
- **HTTP requests/responses**: Filtered out health checks, static assets
- **Request bodies**: Hidden by default (security + noise reduction)
- **Response bodies**: Hidden by default (reduces overwhelming output)
- **Session checks**: Frequent `/api/auth/session` calls ignored
### Cleaner Output
- **Pretty formatting**: Colored, timestamped logs in development
- **Message focus**: Emphasizes actual log messages over metadata
- **Structured data**: Still available but not overwhelming
### Security Enhanced
- **Sensitive data**: Automatically redacted (tokens, passwords, etc.)
- **Production ready**: No debug info exposed to customers
---
## Production Logging
### Structured JSON Output
```json
{
"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..."
}
}
```
### File Logging
```
# 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)
```
---
## 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
```json
{
"authorization": "[REDACTED]",
"cookie": "[REDACTED]",
"x-api-key": "[REDACTED]",
"user-agent": "Mozilla/5.0...",
"accept": "application/json"
}
```
---
## What NOT to Do
### Don't Use Multiple Logging Systems
```typescript
// ❌ WRONG: Mixing logging systems
import { Logger } from "@nestjs/common"; // Don't use this
// ✅ CORRECT: Use centralized logger
import { Logger } from "nestjs-pino";
```
### Don't Use Console Methods
```typescript
// ❌ WRONG: Direct console usage
console.log("Debug info");
console.error("Error occurred");
// ✅ CORRECT: Structured logging
logger.debug("Debug info");
logger.error("Error occurred");
```
---
## 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** |
---
## Common Scenarios
| Need | Command |
| --------------------- | ---------------------------------- |
| Too much noise | `./scripts/set-log-level.sh warn` |
| Debugging issues | `./scripts/set-log-level.sh debug` |
| Normal development | `./scripts/set-log-level.sh info` |
| Production monitoring | `./scripts/set-log-level.sh error` |
After changing log levels, restart your development server for changes to take effect.
---
## 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