import { DyNTS_SingletonService } from '../../_services/base/singleton.service'; /** * In-memory ring buffer a szerver console kimenethez. * Interceptalja a console.log/error/warn/info hivasokat es eltarolja az utolso N sort. * * Hasznalat: * DyNTS_LogBuffer_Service.getInstance().install(); // app startup-nal * DyNTS_LogBuffer_Service.getInstance().getLines(100); // utolso 100 sor */ export class DyNTS_LogBuffer_Service extends DyNTS_SingletonService { static getInstance(): DyNTS_LogBuffer_Service { return DyNTS_LogBuffer_Service.getSingletonInstance(); } private readonly maxLines: number = 2000; private readonly buffer: string[] = []; private installed: boolean = false; /** * Interceptalja a console.log/error/warn/info kimeneteket es a bufferbe irja. * Egyszer kell hivni, a szerver indulasakor (lehetoleg a legelso muvelet). */ install(): void { if (this.installed) { return; } this.installed = true; const self: DyNTS_LogBuffer_Service = this; const originalLog: typeof console.log = console.log.bind(console); const originalError: typeof console.error = console.error.bind(console); const originalWarn: typeof console.warn = console.warn.bind(console); const originalInfo: typeof console.info = console.info.bind(console); console.log = (...args: any[]): void => { self.addLine('LOG', args); originalLog(...args); }; console.error = (...args: any[]): void => { self.addLine('ERR', args); originalError(...args); }; console.warn = (...args: any[]): void => { self.addLine('WRN', args); originalWarn(...args); }; console.info = (...args: any[]): void => { self.addLine('INF', args); originalInfo(...args); }; } /** * A log buffer be van-e kapcsolva (install megtortent-e). */ isInstalled(): boolean { return this.installed; } /** * Az utolso N sor lekerdezese. */ getLines(count: number = 200): string[] { const start: number = Math.max(0, this.buffer.length - count); return this.buffer.slice(start); } /** * Az osszes buffered sor szama. */ getLineCount(): number { return this.buffer.length; } /** * Buffer uritese. */ clear(): void { this.buffer.length = 0; } private addLine(level: string, args: any[]): void { const timestamp: string = new Date().toISOString(); const message: string = args.map(formatArg).join(' '); this.buffer.push(`${timestamp} [${level}] ${message}`); if (this.buffer.length > this.maxLines) { this.buffer.shift(); } } } function formatArg(arg: any): string { if (typeof arg === 'string') { return arg; } try { return JSON.stringify(arg); } catch { return String(arg); } }