@calmhive/calmhive-cli
Version:
🐝 Intelligent Claude CLI wrapper with rule injection, AFk background processing, voice interface, and adaptive retry
574 lines (453 loc) • 13.5 kB
Markdown
# Detailed Logging System - Complete Guide
## Overview
The Calmhive v11.0.0 detailed logging system provides comprehensive, production-ready logging capabilities designed specifically for AFk background processes and interactive sessions. This system evolved through three iterations to provide enterprise-grade logging with real-time monitoring, automatic rotation, and advanced analytics.
## Architecture
### Core Components
1. **DetailedLogger** (`test/detailed-logging-test.js`) - Basic implementation with test framework
2. **EnhancedLogger** (`lib/enhanced-logger.js`) - Advanced features with streaming and metrics
3. **ProductionLogger** (`lib/production-logger.js`) - Production-optimized with error handling
### Feature Matrix
| Feature | DetailedLogger | EnhancedLogger | ProductionLogger |
|---------|----------------|----------------|------------------|
| Multi-level logging | ✅ | ✅ | ✅ |
| File rotation | ❌ | ✅ | ✅ |
| Real-time streaming | ❌ | ✅ | ✅ |
| Performance benchmarking | ✅ | ✅ | ✅ |
| Memory tracking | ✅ | ✅ | ✅ |
| Error handling | Basic | Advanced | Enterprise |
| Graceful degradation | ❌ | ❌ | ✅ |
| Async batch writing | ❌ | ❌ | ✅ |
| Production defaults | ❌ | ❌ | ✅ |
## Quick Start
### Basic Usage
```javascript
const ProductionLogger = require('./lib/production-logger');
// Initialize with default settings
const logger = new ProductionLogger({
logFile: './logs/app.log',
logLevel: 'INFO'
});
// Basic logging
logger.info('Application started', { version: '1.0.0' });
logger.warn('High memory usage detected', { usage: '85%' });
logger.error('Database connection failed', { error: 'ECONNREFUSED' });
// With context
logger.info('User action', { userId: 'user123' }, { module: 'auth' });
```
### AFk Integration
```javascript
const ProductionLogger = require('./lib/production-logger');
const path = require('path');
// AFk-compatible setup
const sessionId = 'afk-session-12345';
const afkRegistryDir = path.join(process.env.HOME, '.claude', 'afk_registry', sessionId);
const logFile = path.join(afkRegistryDir, 'worker.log');
const logger = new ProductionLogger({
logFile,
enableStreaming: true,
performanceMode: 'balanced'
});
// Monitor critical events
logger.on('log', (logEntry) => {
if (logEntry.level === 'ERROR') {
// Handle critical events
console.log('🚨 Critical event detected');
}
});
// AFk iteration logging
logger.info('AFk iteration started', {
iteration: 1,
task: 'Implement feature X',
sessionId
});
```
## Configuration Options
### Production Logger Options
```javascript
const logger = new ProductionLogger({
// File settings
logFile: './logs/app.log',
maxFileSize: 50 * 1024 * 1024, // 50MB
maxFiles: 10,
// Performance settings
performanceMode: 'balanced', // 'fast', 'balanced', 'safe'
asyncWrites: true,
batchSize: 50,
flushInterval: 5000, // 5 seconds
// Error handling
enableGracefulDegradation: true,
errorThreshold: 100,
// Monitoring
enableStreaming: true,
enableMetrics: true,
bufferSize: 1000,
// Log filtering
logLevel: 'INFO' // 'DEBUG', 'INFO', 'WARN', 'ERROR'
});
```
### Performance Modes
#### Fast Mode
- Optimized for maximum throughput
- Minimal error checking
- Larger batch sizes
- Best for high-volume logging
```javascript
performanceMode: 'fast',
batchSize: 100,
flushInterval: 10000,
enableGracefulDegradation: false
```
#### Balanced Mode (Default)
- Good balance of performance and reliability
- Moderate error checking
- Standard batch sizes
- Recommended for most applications
```javascript
performanceMode: 'balanced',
batchSize: 50,
flushInterval: 5000,
enableGracefulDegradation: true
```
#### Safe Mode
- Maximum reliability and error handling
- Synchronous writes
- Immediate flushing
- Best for critical applications
```javascript
performanceMode: 'safe',
asyncWrites: false,
batchSize: 1,
flushInterval: 1000,
enableGracefulDegradation: true
```
## Advanced Features
### Real-time Streaming
```javascript
// Set up real-time monitoring
logger.on('log', (logEntry) => {
if (logEntry.level === 'ERROR') {
// Send alert to monitoring system
alertSystem.send(`Error: ${logEntry.message}`);
}
});
logger.on('metrics', (metrics) => {
// Update dashboard with current metrics
dashboard.update(metrics);
});
logger.on('degraded', (event) => {
// Handle degraded mode
console.warn('Logger degraded:', event.reason);
});
```
### Log Search and Filtering
```javascript
// Search logs in memory buffer
const results = logger.searchLogs('error', {
level: 'ERROR',
timeRange: {
start: '2025-06-25T00:00:00Z',
end: '2025-06-25T23:59:59Z'
},
limit: 50
});
console.log(`Found ${results.length} error logs`);
```
### Performance Benchmarking
```javascript
// Benchmark critical operations
const result = await logger.benchmark(
'Database Query Performance',
async (iteration) => {
return await database.query('SELECT * FROM users LIMIT 100');
},
1000 // iterations
);
console.log(`Average query time: ${result.avgDuration}ms`);
console.log(`Throughput: ${result.throughput}`);
```
### Log Rotation Management
```javascript
// Automatic rotation when file exceeds maxFileSize
// Manual rotation trigger
await logger.rotateLogFile();
// Check current file size
const metrics = logger.getMetrics();
console.log(`Current log file size: ${metrics.currentFileSize} bytes`);
```
## AFk Integration Patterns
### Context Monitoring
```javascript
// Create AFk-compatible context monitoring
const contextFile = path.join(afkRegistryDir, 'context-monitor.log');
logger.on('log', (logEntry) => {
if (logEntry.level === 'ERROR') {
const alert = `CRITICAL: ${logEntry.timestamp} - ${logEntry.message}\n`;
fs.appendFileSync(contextFile, alert);
}
});
```
### Progress Tracking
```javascript
// Update progress reports for AFk monitoring
logger.on('log', (logEntry) => {
if (logEntry.message.includes('progress')) {
const report = {
sessionId,
lastUpdate: logEntry.timestamp,
progress: logEntry.data,
status: 'active'
};
const reportFile = path.join(afkRegistryDir, 'context-report.json');
fs.writeFileSync(reportFile, JSON.stringify(report, null, 2));
}
});
```
### Session Lifecycle
```javascript
// AFk session start
logger.info('AFk session started', {
sessionId,
task: 'Implement comprehensive feature',
expectedIterations: 5
});
// Iteration logging
for (let i = 1; i <= 5; i++) {
logger.info(`AFk iteration ${i} started`, { iteration: i });
// Phase logging
logger.debug('Analysis phase', { phase: 'analysis', iteration: i });
logger.debug('Implementation phase', { phase: 'implementation', iteration: i });
logger.debug('Verification phase', { phase: 'verification', iteration: i });
logger.info(`AFk iteration ${i} completed`, {
iteration: i,
duration: '2.5s',
success: true
});
}
// Session completion
logger.info('AFk session completed', {
sessionId,
totalIterations: 5,
status: 'success'
});
```
## Error Handling and Degradation
### Graceful Degradation
The production logger automatically handles various error scenarios:
1. **File System Errors**: Continues with console-only logging
2. **Permission Issues**: Attempts alternative log locations
3. **Disk Space**: Reduces buffer size and increases rotation frequency
4. **Memory Pressure**: Flushes buffers more aggressively
```javascript
// Monitor degradation events
logger.on('degraded', (event) => {
console.warn(`Logger degraded: ${event.reason}`);
// Implement fallback logging strategy
if (event.reason.includes('disk')) {
// Switch to remote logging
remoteLogger.init();
}
});
```
### Error Recovery
```javascript
// Check if logger is in degraded mode
const metrics = logger.getMetrics();
if (metrics.degradedMode) {
console.log('Logger is in degraded mode');
// Attempt recovery
try {
await logger.flush();
logger.info('Attempting recovery from degraded mode');
} catch (error) {
console.error('Recovery failed:', error);
}
}
```
## Performance Optimization
### Memory Management
```javascript
// Monitor memory usage
logger.on('metrics', (metrics) => {
const memoryMB = metrics.memory.heapUsed / 1024 / 1024;
if (memoryMB > 100) {
// Reduce buffer size dynamically
logger.options.bufferSize = Math.max(100, logger.options.bufferSize * 0.8);
logger.warn('Reducing buffer size due to memory pressure', {
newBufferSize: logger.options.bufferSize
});
}
});
```
### Disk I/O Optimization
```javascript
// Optimize for high-throughput scenarios
const highThroughputLogger = new ProductionLogger({
logFile: './logs/high-volume.log',
performanceMode: 'fast',
batchSize: 200,
flushInterval: 10000,
maxFileSize: 100 * 1024 * 1024, // 100MB
asyncWrites: true
});
```
## Testing and Validation
### Comprehensive Test Suite
Run the complete test suite to validate functionality:
```bash
# Basic functionality test
node test/detailed-logging-test.js
# Advanced features test
node test/streaming-logger-test.js
# AFk integration test
node test/afk-integration-test.js
```
### Performance Testing
```javascript
// Stress test the logger
const stressTest = async () => {
const logger = new ProductionLogger({
logFile: './logs/stress-test.log',
performanceMode: 'fast'
});
const startTime = Date.now();
const logCount = 10000;
for (let i = 0; i < logCount; i++) {
logger.info(`Stress test log ${i}`, {
iteration: i,
timestamp: Date.now()
});
}
await logger.flush();
const duration = Date.now() - startTime;
console.log(`Logged ${logCount} messages in ${duration}ms`);
console.log(`Throughput: ${(logCount / duration * 1000).toFixed(2)} logs/sec`);
await logger.destroy();
};
```
## Best Practices
### 1. Log Level Management
```javascript
// Use appropriate log levels
logger.debug('Detailed debugging info'); // Development only
logger.info('Normal application flow'); // General information
logger.warn('Something unusual happened'); // Potential issues
logger.error('Something failed'); // Actual errors
```
### 2. Structured Logging
```javascript
// Good: Structured data
logger.info('User login', {
userId: 'user123',
ip: '192.168.1.1',
userAgent: 'Mozilla/5.0...'
});
// Better: With context
logger.info('User login',
{ userId: 'user123', success: true },
{ module: 'auth', action: 'login' }
);
```
### 3. Error Context
```javascript
// Include full error context
try {
await riskyOperation();
} catch (error) {
logger.error('Operation failed', {
error: error.message,
stack: error.stack,
operation: 'riskyOperation',
retryAttempt: 1
});
}
```
### 4. Performance Monitoring
```javascript
// Log performance metrics
const startTime = Date.now();
await longRunningOperation();
const duration = Date.now() - startTime;
logger.info('Operation completed', {
operation: 'longRunningOperation',
duration: `${duration}ms`,
performance: duration < 1000 ? 'good' : 'slow'
});
```
## Troubleshooting
### Common Issues
1. **High Memory Usage**
- Reduce buffer size
- Increase flush frequency
- Check for log level misconfiguration
2. **Slow Performance**
- Enable async writes
- Increase batch size
- Use 'fast' performance mode
3. **File Permission Errors**
- Enable graceful degradation
- Check log directory permissions
- Use alternative log location
4. **Log Rotation Issues**
- Verify disk space
- Check file permissions
- Monitor rotation frequency
### Debug Mode
```javascript
// Enable debug logging
const logger = new ProductionLogger({
logLevel: 'DEBUG',
enableMetrics: true
});
// Monitor internal logger events
logger.on('degraded', console.warn);
logger.on('metrics', (m) => console.log('Metrics:', m.logs));
```
## Deployment Guide
### Production Deployment
```javascript
// Production configuration
const productionLogger = new ProductionLogger({
logFile: '/var/log/calmhive/app.log',
maxFileSize: 100 * 1024 * 1024, // 100MB
maxFiles: 20,
logLevel: 'INFO',
performanceMode: 'balanced',
enableGracefulDegradation: true,
enableMetrics: true,
asyncWrites: true
});
// Set up monitoring
productionLogger.on('degraded', (event) => {
alertingSystem.send(`Logger degraded: ${event.reason}`);
});
// Graceful shutdown
process.on('SIGTERM', async () => {
await productionLogger.flush();
await productionLogger.destroy();
process.exit(0);
});
```
### Docker Integration
```dockerfile
# Create log directory
RUN mkdir -p /var/log/calmhive
# Set proper permissions
RUN chown -R node:node /var/log/calmhive
# Volume for persistent logs
VOLUME ["/var/log/calmhive"]
```
### Monitoring Integration
```javascript
// Integration with monitoring systems
logger.on('metrics', (metrics) => {
// Prometheus metrics
prometheus.gauge('logger_total_logs').set(metrics.logs.totalLogs);
prometheus.gauge('logger_error_count').set(metrics.logs.logsByLevel.ERROR);
prometheus.gauge('logger_memory_usage').set(metrics.memory.heapUsed);
// Custom monitoring
if (metrics.degradedMode) {
monitoring.alert('logger_degraded', 'Logger entered degraded mode');
}
});
```
This comprehensive logging system provides enterprise-grade capabilities suitable for production AFk deployments while maintaining the flexibility needed for development and testing environments.