import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base'; import { DyNTS_global_settings } from '../../_collections/global-settings.const'; /** * In-memory ring buffer a szerver logokhoz. * Interceptalja a console.log/error/warn kimeneteket es tarolja oket. * Max entryszam a log_settings.logs_endpoint.maxEntries-bol jon (default: 2000). * * Hasznalat: * DyNTS_Logs_Service.getInstance().install() — egyszer, szerver indulasakor * DyNTS_Logs_Service.getInstance().getLines(200) — utolso N sor */ export class DyNTS_Logs_Service extends DyNTS_SingletonServiceBase { static getInstance(): DyNTS_Logs_Service { return DyNTS_Logs_Service.getSingletonInstance() as DyNTS_Logs_Service; } private readonly maxEntries: number; private readonly buffer: string[] = []; private installed: boolean = false; protected constructor() { super(); this.maxEntries = DyNTS_global_settings.log_settings?.logs_endpoint?.maxEntries ?? 2000; } /** * Interceptalja a console.log/error/warn kimeneteket es a bufferbe irja. * Egyszer kell hivni, a szerver indulasakor. Tobbszori hivas no-op. */ install(): void { if (this.installed) { return; } this.installed = true; 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 self: DyNTS_Logs_Service = this; 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); }; } /** * 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); } /** * Osszes bufferelt sor szama. */ getLineCount(): number { return this.buffer.length; } /** * Buffer uritese. */ clear(): void { this.buffer.length = 0; } /** * Telepitve van-e mar a console intercept. */ isInstalled(): boolean { return this.installed; } private addLine(level: string, args: any[]): void { const message: string = args.map((arg: any) => { if (typeof arg === 'string') { return arg; } try { return JSON.stringify(arg); } catch { return String(arg); } }).join(' '); const timestamped: string = `${new Date().toISOString()} [${level}] ${message}`; this.buffer.push(timestamped); if (this.buffer.length > this.maxEntries) { this.buffer.shift(); } } }