Files
tilbudgivern/backend/LOGGING.md
T

96 lines
2.4 KiB
Markdown

# Structured Logging & Correlation Tracking
This backend implements structured logging with correlation IDs for end-to-end request tracing.
## Features
### Correlation IDs
- Every request gets a unique `correlationId` (UUID v4)
- Propagated through middleware, services, and logs
- Returned in response headers as `X-Correlation-ID`
- Supports client-provided IDs via `X-Correlation-ID` or `X-Request-ID` headers
### Structured Logs
- JSON format in production
- Colorized console with correlation ID in development
- All logs include: `timestamp`, `level`, `context`, `correlationId`, `message`
- Database persistence with full request context
### Log Levels
- `error`: System errors, exceptions
- `warn`: Slow requests (>1s), deprecated features
- `info`: Request/response cycles, business events
- `debug`: Detailed troubleshooting info
## Usage
### In Middleware
```javascript
const logger = require('./src/utils/logger');
app.use((req, res, next) => {
logger.logInfo('MyContext', 'Processing request', {
correlationId: req.correlationId,
req
});
next();
});
```
### In Services
```javascript
const logger = require('./src/utils/logger');
async function myService(req, data) {
try {
logger.logInfo('MyService', 'Starting operation', {
correlationId: req.correlationId,
metadata: { itemId: data.id }
});
// ... operation
} catch (error) {
logger.logError('MyService', error, {
correlationId: req.correlationId,
errorCode: 'SERVICE_ERROR'
});
throw error;
}
}
```
### Client-Side Tracking
```javascript
// Send correlation ID from frontend
axios.get('/api/endpoint', {
headers: {
'X-Correlation-ID': clientGeneratedId
}
});
// Read it from response
const correlationId = response.headers['x-correlation-id'];
```
## Azure App Insights Ready
Logs are structured for easy integration with Azure Application Insights:
- Correlation IDs map to `operation_Id`
- Contexts map to `customDimensions`
- Performance tracking via response times
To enable:
```javascript
const appInsights = require('applicationinsights');
appInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATIONKEY);
appInsights.defaultClient.context.tags[appInsights.defaultClient.context.keys.cloudRole] = 'tilbudgivern-backend';
appInsights.start();
```
## Performance
- Async logging doesn't block requests
- Connection pooling for database logs
- Automatic cleanup on process termination