- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
101 lines
3.1 KiB
JavaScript
101 lines
3.1 KiB
JavaScript
/**
|
|
* Erweiterter Logger mit Request-ID-Unterstützung und Server-Kommunikation.
|
|
*/
|
|
export class SecureLogger {
|
|
static enabled = true;
|
|
static apiEndpoint = '/api/log';
|
|
static requestId = null;
|
|
|
|
static log(...args) {
|
|
this._write('log', args);
|
|
}
|
|
|
|
static warn(...args) {
|
|
this._write('warn', args)
|
|
}
|
|
|
|
static info(...args) {
|
|
this._write('info', args);
|
|
}
|
|
|
|
static error(...args) {
|
|
this._write('error', args);
|
|
}
|
|
|
|
static _write(level, args) {
|
|
if(!this.enabled) return;
|
|
|
|
const date = new Date();
|
|
const timestamp = date.toLocaleTimeString('de-DE');
|
|
const requestIdStr = this.requestId ? `[${this.requestId}] ` : '';
|
|
|
|
const message = args.map(a => typeof a === 'object' ? JSON.stringify(a) : a).join(' ');
|
|
const formattedMessage = `[${timestamp}] ${requestIdStr}[${level.toUpperCase()}] ${message}`;
|
|
|
|
// Lokales Logging in der Konsole
|
|
console[level](formattedMessage);
|
|
|
|
// An den Server senden (wenn nicht in Produktion)
|
|
this._sendToServer(level, message, args.find(a => typeof a === 'object'));
|
|
}
|
|
|
|
static _sendToServer(level, message, context) {
|
|
fetch(this.apiEndpoint, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-Request-ID': this.requestId || ''
|
|
},
|
|
body: JSON.stringify({
|
|
level,
|
|
message,
|
|
context
|
|
})
|
|
})
|
|
.then(response => {
|
|
// Request-ID aus dem Header extrahieren
|
|
const requestId = response.headers.get('X-Request-ID');
|
|
if (requestId) {
|
|
// Nur den ID-Teil ohne Signatur speichern
|
|
const idPart = requestId.split('.')[0];
|
|
if (idPart) {
|
|
this.requestId = idPart;
|
|
}
|
|
}
|
|
return response.json();
|
|
})
|
|
.catch(err => {
|
|
// Fallback auf console.error da wir hier im Logger sind
|
|
console.error('Fehler beim Senden des Logs:', err);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Request-ID aus dem Document laden
|
|
*/
|
|
static initFromDocument() {
|
|
// Versuche die Request-ID aus einem Meta-Tag zu lesen
|
|
const meta = document.querySelector('meta[name="request-id"]');
|
|
if (meta) {
|
|
const fullRequestId = meta.getAttribute('content');
|
|
// Nur den ID-Teil ohne Signatur verwenden
|
|
this.requestId = fullRequestId.split('.')[0] || null;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Request-ID initialisieren, wenn das DOM geladen ist
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
SecureLogger.initFromDocument();
|
|
|
|
// Abfangen aller unbehandelten Fehler und Logging
|
|
window.addEventListener('error', (event) => {
|
|
SecureLogger.error('Unbehandelter Fehler:', event.error || event.message);
|
|
});
|
|
|
|
// Abfangen aller unbehandelten Promise-Rejects
|
|
window.addEventListener('unhandledrejection', (event) => {
|
|
SecureLogger.error('Unbehandelte Promise-Ablehnung:', event.reason);
|
|
});
|
|
});
|