180 lines
5.7 KiB
JavaScript
180 lines
5.7 KiB
JavaScript
/**
|
|
* Galaxy Strike Online - Debug Logger
|
|
* Enhanced debugging that integrates with existing Logger system
|
|
*/
|
|
|
|
class DebugLogger {
|
|
constructor() {
|
|
// Completely disable debug logging to prevent console flooding
|
|
this.debugEnabled = false;
|
|
|
|
this.startTime = performance.now();
|
|
this.stepTimers = new Map();
|
|
this.debugLogs = []; // Store logs in memory
|
|
this.maxLogs = 1000; // Limit memory usage
|
|
|
|
// Use the existing logger if available
|
|
this.logger = window.logger || null;
|
|
|
|
// Log initialization
|
|
if (this.debugEnabled) {
|
|
this.log('=== DEBUG SESSION STARTED ===');
|
|
}
|
|
}
|
|
|
|
async log(message, data = null) {
|
|
// Skip logging if debug is disabled
|
|
if (!this.debugEnabled) return;
|
|
|
|
const timestamp = new Date().toISOString();
|
|
const stackTrace = new Error().stack;
|
|
|
|
// Build performance object
|
|
const performanceData = {
|
|
elapsed: `${(performance.now() - this.startTime).toFixed(2)}ms`,
|
|
memory: performance.memory ? {
|
|
used: `${(performance.memory.usedJSHeapSize / 1024 / 1024).toFixed(2)}MB`,
|
|
total: `${(performance.memory.totalJSHeapSize / 1024 / 1024).toFixed(2)}MB`
|
|
} : null
|
|
};
|
|
|
|
// Create single formatted log message
|
|
let logMessage = `[DEBUG] ${message}`;
|
|
if (data) {
|
|
logMessage += `\n${JSON.stringify(data, null, 2)}`;
|
|
}
|
|
if (performanceData) {
|
|
logMessage += `\n[PERF] ${performanceData.elapsed} | Memory: ${performanceData.memory?.used || 'N/A'}/${performanceData.memory?.total || 'N/A'}`;
|
|
}
|
|
|
|
// Add to memory logs
|
|
const logEntry = {
|
|
timestamp: timestamp,
|
|
message: message,
|
|
data: data ? JSON.stringify(data, null, 2) : '',
|
|
stackTrace: stackTrace ? stackTrace.split('\n').slice(0, 3).join('\n') : '',
|
|
performance: performanceData
|
|
};
|
|
this.debugLogs.push(logEntry);
|
|
|
|
// Limit memory usage
|
|
if (this.debugLogs.length > this.maxLogs) {
|
|
this.debugLogs.shift();
|
|
}
|
|
|
|
// Skip console logging to prevent flooding
|
|
// console.log(`[DEBUG] ${message}`, data || '');
|
|
|
|
// Skip performance logging to prevent flooding
|
|
// if (performanceData.memory) {
|
|
// console.log(`[PERF] ${performanceData.elapsed} | Memory: ${performanceData.memory.used}/${performanceData.memory.total}`);
|
|
// }
|
|
|
|
// Use existing logger if available
|
|
if (this.logger) {
|
|
try {
|
|
await this.logger.debug(logMessage);
|
|
} catch (error) {
|
|
console.error('[DEBUG LOGGER] Failed to log via existing logger:', error);
|
|
}
|
|
} else {
|
|
// Fallback to electronAPI log
|
|
if (window.electronAPI && window.electronAPI.log) {
|
|
window.electronAPI.log('debug', logMessage);
|
|
}
|
|
}
|
|
}
|
|
|
|
async startStep(stepName) {
|
|
// Skip logging if debug is disabled
|
|
if (!this.debugEnabled) return;
|
|
|
|
this.stepTimers.set(stepName, performance.now());
|
|
await this.log(`STEP START: ${stepName}`, {
|
|
type: 'step_start',
|
|
step: stepName,
|
|
elapsed: '0ms'
|
|
});
|
|
}
|
|
|
|
async endStep(stepName, data = null) {
|
|
// Skip logging if debug is disabled
|
|
if (!this.debugEnabled) return;
|
|
|
|
const startTime = this.stepTimers.get(stepName);
|
|
const duration = startTime ? (performance.now() - startTime).toFixed(2) : 'N/A';
|
|
|
|
this.stepTimers.delete(stepName);
|
|
await this.log(`STEP END: ${stepName}`, {
|
|
type: 'step_end',
|
|
step: stepName,
|
|
duration: `${duration}ms`,
|
|
data
|
|
});
|
|
}
|
|
|
|
async logStep(stepName, data = null) {
|
|
// Skip logging if debug is disabled
|
|
if (!this.debugEnabled) return;
|
|
|
|
await this.log(`STEP: ${stepName}`, {
|
|
type: 'step',
|
|
step: stepName,
|
|
data
|
|
});
|
|
}
|
|
|
|
getLogs() {
|
|
return this.debugLogs;
|
|
}
|
|
|
|
exportLogs() {
|
|
const logText = this.debugLogs.map(entry =>
|
|
`[${entry.timestamp}] ${entry.message}${entry.data ? '\n' + entry.data : ''}${entry.performance ? '\nPerf: ' + entry.performance.elapsed : ''}`
|
|
).join('\n\n');
|
|
|
|
return logText;
|
|
}
|
|
|
|
clearLogs() {
|
|
this.debugLogs = [];
|
|
this.log('=== LOGS CLEARED ===');
|
|
}
|
|
|
|
async shutdown() {
|
|
await this.log('=== DEBUG SESSION ENDING ===');
|
|
await this.log('SESSION SUMMARY', {
|
|
totalLogs: this.debugLogs.length,
|
|
sessionDuration: `${(performance.now() - this.startTime).toFixed(2)}ms`
|
|
});
|
|
|
|
// No need to finalize files - the existing Logger handles that
|
|
console.log('[DEBUG LOGGER] Session ended cleanly');
|
|
}
|
|
|
|
// Convenience methods for specific logging types
|
|
async info(message, data = null) {
|
|
await this.log(`[INFO] ${message}`, data);
|
|
}
|
|
|
|
async error(message, data = null) {
|
|
await this.log(`[ERROR] ${message}`, data);
|
|
}
|
|
|
|
async warn(message, data = null) {
|
|
await this.log(`[WARN] ${message}`, data);
|
|
}
|
|
|
|
async errorEvent(error, context = 'Unknown') {
|
|
await this.error(`Error in ${context}`, {
|
|
name: error.name,
|
|
message: error.message,
|
|
stack: error.stack,
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
}
|
|
}
|
|
|
|
// Global debug logger instance
|
|
window.debugLogger = new DebugLogger();
|