XyPriss Console Interception Guide #
Overview #
The Console Interception System is a powerful feature in XyPriss that intercepts all console.log, console.error, console.warn, etc. calls and routes them through the unified logging system. This provides enhanced control, filtering, encryption, and monitoring of console output.
Why Use Console Interception? #
✅ Unified Logging - All console output goes through one logging system
✅ Encryption - Encrypt sensitive console logs for security
✅ Filtering - Filter out noise and focus on important logs
✅ Source Mapping - Track where logs originated from
✅ Performance Monitoring - Track console overhead
✅ Production Ready - Different modes for dev vs production
Quick Start #
Basic Usage #
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
},
},
});
await app.waitForReady();
// Now all console.log calls are intercepted!
console.log("This is being intercepted");
// Check stats to verify
const stats = app.getConsoleStats();
console.log(stats); // { totalInterceptions: X, isActive: true, ... }
Important: How It Works #
Console interception works transparently in the background. When enabled:
- ✅ All
console.log,console.error,console.warn, etc. calls are intercepted - ✅ They're routed through the logging system for filtering, encryption, etc.
- ✅ The output you see depends on the
preserveOriginal.modesetting
What you see vs what's happening:
| Mode | What You See | What's Happening |
|---|---|---|
original | Normal console output | Intercepted + routed through logger + displayed as original |
intercepted | [USERAPP] prefixed logs | Intercepted + formatted by logger |
both | Both outputs | Intercepted + shown twice (original + formatted) |
none | Nothing | Intercepted + captured but not displayed |
The key point: Even in 'original' mode, interception IS working - you just see the original-looking output. Check app.getConsoleStats() to verify!
Configuration #
Full Configuration Example #
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
// Enable/disable the system
enabled: true,
// Which console methods to intercept
interceptMethods: ["log", "error", "warn", "info", "debug"],
// How to handle original console output
preserveOriginal: {
enabled: true,
mode: "original", // 'original' | 'intercepted' | 'both' | 'none'
showPrefix: false,
onlyUserApp: true,
colorize: true,
},
// Performance settings
performanceMode: true,
maxInterceptionsPerSecond: 1000,
// Source tracking
sourceMapping: true,
stackTrace: false,
// Filtering
filters: {
minLevel: "debug", // 'debug' | 'info' | 'warn' | 'error'
maxLength: 1000,
excludePatterns: ["node_modules", "internal"],
includePatterns: [],
},
// Error handling
fallback: {
onError: "console", // 'silent' | 'console' | 'throw'
gracefulDegradation: true,
maxErrors: 10,
},
},
},
});
Preserve Modes #
The preserveOriginal.mode setting controls how console output is displayed:
Mode: 'original' (Development - Default) #
Shows original console output only, no duplication.
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: 'original' // Show original console output
}
}
}
Output:
Hello World // Original console.log output
Use Case: Development - you want to see console output as normal
Mode: 'intercepted' (Production) #
Routes through logging system with prefixes and formatting.
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: 'intercepted', // Route through logging system
showPrefix: true
}
}
}
Output:
[USERAPP] Hello World // Formatted through logging system
Use Case: Production - structured logging with timestamps and prefixes
Mode: 'both' (Debugging) #
Shows both original and intercepted output.
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: 'both' // Show both
}
}
}
Output:
Hello World // Original
[USERAPP] Hello World // Intercepted
Use Case: Debugging - compare original vs intercepted output
Mode: 'none' (Silent) #
No console output at all (logs are still captured internally).
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: 'none' // Silent mode
}
}
}
Output:
(nothing displayed)
Use Case: Testing - suppress all console output
Preset Configurations #
XyPriss provides ready-to-use presets:
Development Preset #
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: "original",
showPrefix: false,
colorize: true,
},
},
},
});
Production Preset #
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: "intercepted",
showPrefix: true,
customPrefix: "[APP]",
colorize: false,
},
filters: {
minLevel: "info", // Filter out debug logs
excludePatterns: ["node_modules"],
},
},
},
});
Debug Preset #
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
enabled: true,
mode: "both", // Show both for comparison
showPrefix: true,
customPrefix: "[DEBUG]",
},
sourceMapping: true,
stackTrace: true,
},
},
});
Advanced Features #
1. Console Encryption #
Encrypt sensitive console logs for security:
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
encryption: {
enabled: true,
key: process.env.CONSOLE_ENCRYPTION_KEY, // Set via environment
algorithm: "aes-256-gcm",
displayMode: "encrypted", // 'readable' | 'encrypted' | 'both'
showEncryptionStatus: true,
},
},
},
});
app.start();
// Access encryption features
app.enableConsoleEncryption("your-secret-key");
app.setConsoleEncryptionDisplayMode("both"); // Show both readable and encrypted
Display Modes:
'readable'- Show original logs (encryption happens in background)'encrypted'- Show only encrypted hashes'both'- Show both readable and encrypted versions
2. Source Mapping #
Track where logs originated from:
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
sourceMapping: true, // Enable source tracking
stackTrace: false, // Full stack trace (optional)
},
},
});
Output:
[USERAPP] Hello World [at myFunction (file.ts:42)]
3. Filtering #
Filter logs based on patterns and levels:
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
filters: {
minLevel: "warn", // Only warn and error
maxLength: 500, // Truncate long messages
excludePatterns: ["node_modules", "internal", "DEBUG:"],
includePatterns: ["IMPORTANT:", "ERROR:"],
},
},
},
});
4. Performance Monitoring #
Track console interception overhead:
import { createServer } from "xypriss";
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
performanceMode: true, // Enable performance tracking
maxInterceptionsPerSecond: 1000, // Rate limiting
},
},
});
app.start();
// Get statistics
const stats = app.getConsoleStats();
console.log(stats);
/*
{
totalInterceptions: 1523,
interceptionsPerSecond: 45,
errorCount: 0,
averageOverhead: 0.23, // ms
isActive: true,
methodCounts: {
log: 1200,
error: 23,
warn: 300
}
}
*/
Runtime API #
Enable/Disable at Runtime #
const app = createServer({
/* ... */
});
// Enable console interception
app.enableConsoleInterception();
// Disable console interception
app.disableConsoleInterception();
// Check status
const isActive = app.getConsoleInterceptor().isActive();
Get Statistics #
const stats = app.getConsoleStats();
console.log("Total interceptions:", stats.totalInterceptions);
console.log("Average overhead:", stats.averageOverhead, "ms");
Reset Statistics #
app.resetConsoleStats();
Update Configuration #
// Get console interceptor
const interceptor = app.getConsoleInterceptor();
// Update configuration at runtime
interceptor.updateConfig({
preserveOriginal: {
enabled: true,
mode: "both",
},
filters: {
minLevel: "error",
},
});
Use Cases #
Use Case 1: Development Mode #
Show original console output for easy debugging:
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
mode: "original",
},
},
},
});
Use Case 2: Production Logging #
Structured logs with timestamps and prefixes:
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
mode: "intercepted",
showPrefix: true,
},
filters: {
minLevel: "info",
},
},
},
});
Use Case 3: Secure Production #
Encrypt sensitive logs:
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
mode: "intercepted",
},
encryption: {
enabled: true,
key: process.env.CONSOLE_ENCRYPTION_KEY,
displayMode: "encrypted",
},
},
},
});
Use Case 4: Testing (Silent Mode) #
Suppress all console output during tests:
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
mode: "none", // Silent
},
},
},
});
Use Case 5: Debugging #
See both original and intercepted output:
const app = createServer({
logging: {
consoleInterception: {
enabled: true,
preserveOriginal: {
mode: "both",
},
sourceMapping: true,
stackTrace: true,
},
},
});
Configuration Reference #
ConsoleInterceptionConfig #
interface ConsoleInterceptionConfig {
enabled: boolean;
interceptMethods: ("log" | "error" | "warn" | "info" | "debug" | "trace")[];
preserveOriginal: boolean | PreserveOption;
filterUserCode: boolean;
performanceMode: boolean;
sourceMapping: boolean;
stackTrace: boolean;
maxInterceptionsPerSecond: number;
encryption?: ConsoleEncryptionConfig;
filters: FilterConfig;
fallback: FallbackConfig;
}
PreserveOption #
interface PreserveOption {
enabled: boolean;
mode: "original" | "intercepted" | "both" | "none";
showPrefix: boolean;
allowDuplication: boolean;
customPrefix?: string;
separateStreams: boolean;
onlyUserApp: boolean;
colorize: boolean;
}
ConsoleEncryptionConfig #
interface ConsoleEncryptionConfig {
enabled?: boolean;
algorithm?: "aes-128-gcm" | "aes-192-gcm" | "aes-256-gcm";
key?: string;
displayMode?: "readable" | "encrypted" | "both";
showEncryptionStatus?: boolean;
}
Best Practices #
- Development: Use
mode: 'original'for normal console output - Production: Use
mode: 'intercepted'with filtering - Sensitive Data: Enable encryption in production
- Performance: Set
maxInterceptionsPerSecondto prevent overhead - Debugging: Use
mode: 'both'with source mapping - Testing: Use
mode: 'none'to suppress output
Troubleshooting #
Console output not showing #
Solution: Check preserveOriginal.mode - set to 'original' or 'both'
Too much console output #
Solution: Use filters to reduce noise:
filters: {
minLevel: 'warn',
excludePatterns: ['DEBUG:', 'node_modules']
}
Performance issues #
Solution: Reduce maxInterceptionsPerSecond or disable sourceMapping
Encryption not working #
Solution: Set encryption key via environment variable:
export CONSOLE_ENCRYPTION_KEY="your-secret-key"
Examples #
See .private/console-interception-examples.ts for comprehensive examples.
app.getConsoleInterceptor().updateConfig({ /_ ... _/ });
## Plugin Integration
Plugins can tap into the console interception system using the `onConsoleIntercept` hook. This allows for custom log analysis, external reporting, or advanced filtering.
### 1. Implement the Hook
```typescript
// Any XyPriss Plugin
{
name: "my-log-plugin",
version: "1.0.0",
onConsoleIntercept(log) {
if (log.category === 'system' && log.level === 'error') {
// Handle system errors
}
}
}
2. Grant Permissions #
Because console logs can contain sensitive data, the onConsoleIntercept hook is privileged and requires explicit permission in the server configuration.
const app = createServer({
pluginPermissions: [
{
name: "my-log-plugin",
allowedHooks: ["PLG.LOGGING.CONSOLE_INTERCEPT"],
},
],
});
For more details on plugin hooks, see the Plugin Core Hooks Guide.
Summary #
The Console Interception System provides powerful control over console output with:
- ✅ Multiple display modes (original, intercepted, both, none)
- ✅ Encryption for sensitive logs
- ✅ Filtering and source mapping
- ✅ Performance monitoring
- ✅ Runtime configuration
- ✅ Production-ready presets
Choose the right mode for your use case and enjoy enhanced logging! 🚀