import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base'; import { DyNTS_FileLog_Entry } from './_models/file-log-entry.interface'; import { DyNTS_FileLog_ReadOptions, DyNTS_FileLog_ReadResult } from './_models/file-log-read-result.interface'; /** * File-based szerver log service — duplikalja a stdout/stderr-t per-session * log fajl(ok)ba, miközben a console kimenet erintetlenul marad. Az * in-memory ring buffer (`DyNTS_Logs_Service`) MELLETT mukodik, NEM * helyette. * * Architecture: * - `process.stdout.write` es `process.stderr.write` monkey-patch (NEM * `console.*` — azt mar a `DyNTS_Logs_Service` patch-elheti) * - Per-session fajl: `{logDir}/{prefix}YYYY-MM-DD_HH-MM-SS.log` * - Sync `appendFileSync` iras — crash-safe, azonnali flush * - Rotation: `maxFileSizeMb` atlepesenel uj session fajl * - Retention: `maxFiles` (count) ES `retentionDays` (age) — ami elobb * teljesul; install-kor + minden rotation utan futtatva * - Silent failure: file IO hibak ELNYELODNEK (a file logger SOHASEM * buktathatja el a szervert) * * Idempotens: tobbszori install() hivas no-op (a masodiktol). * * Hasznalat: * DyNTS_global_settings.log_settings.file_log = { enabled: true, ... }; * DyNTS_FileLog_Service.getInstance().install(); // szerver startup */ export declare class DyNTS_FileLog_Service extends DyNTS_SingletonServiceBase { static getInstance(): DyNTS_FileLog_Service; private installed; private activeLogDir; private filenamePrefix; private maxFileSizeBytes; private maxFiles; private retentionDays; private stripAnsiEnabled; private currentLogPath; private currentLogSizeBytes; private originalStdoutWrite; private originalStderrWrite; /** * Telepiti a file logger-t a `DyNTS_global_settings.log_settings.file_log` * config alapjan. Ha `enabled === false` vagy hianyzik a config → no-op. * * Idempotens — masodszori hivas no-op (akkor is, ha kozben a config * valtozott; a service uj install-jara teardownFor Testing() + install()). */ install(): void; /** * Visszaadja az aktualis log fajl abszolut path-jat (csak akkor letezo, * ha az install() sikeresen lefutott; egyebkent ures string). */ getCurrentLogPath(): string; /** * Az aktualis aktiv log fajl basename-je (NEM teljes path). Csak akkor * nem-ures, ha az install() sikeresen lefutott. */ getCurrentLogFilename(): string; /** * Aktiv log dir abszolut path-ja. Csak akkor nem-ures, ha az install() * sikeresen lefutott. */ getActiveLogDir(): string; /** * Aktiv filename prefix (a service config-jabol). Hasznalja a controller * a request-fajlnev whitelist regex epitesehez. */ getFilenamePrefix(): string; /** * Osszes log fajl listazasa az aktiv log dir-bol. Csak a service prefix-evel * matchelo fajlokat veszi (`{prefix}*.log`). * * Rendezes: mtime DESC (legujabb elol). Hibakat csendben elnyel — ha a dir * nem letezik vagy nem olvashato, ures array-t ad vissza. */ listLogFiles(): DyNTS_FileLog_Entry[]; /** * Egy konkret log fajl olvasasa, line-based mode-ban (tail / head / range). * * **Biztonsagi safeguards:** * - Filename whitelist: `{prefix}*.log` mintara matchelo nev kotelezo * - Path resolution `path.resolve(activeLogDir, name)` + `startsWith(activeLogDir)` (path traversal vedelem) * - Sor szam cap: `MAX_READ_LINES` (10000) * * **Hibak:** * - Throw `Error('not installed')` ha a service nincs install-olva * - Throw `Error('invalid filename')` ha a name nem matchel a whitelist-re VAGY kilep az activeLogDir-bol * - Throw `Error('file not found')` ha a fajl nem letezik * * A hivot kell vigyaznia hogy ezeket HTTP status code-okra forditja. */ readLogFile(name: string, options?: DyNTS_FileLog_ReadOptions): DyNTS_FileLog_ReadResult; /** * Filename whitelist ellenorzes. Csak a service prefix-evel matchelo, * biztonsagos karakterkeszletu fajlnev megengedett. */ private isValidFilename; /** * Telepitve van-e (csak akkor true, ha az enabled === true es a setup nem bukott). */ isInstalled(): boolean; /** * Test-only: visszallitja az eredeti stdout/stderr.write-okat, hogy a * specfajlok egymas utan tisztán futhassanak. Production code NE hivja. */ _teardownForTesting(): void; /** * Session fajl nev: `{prefix}YYYY-MM-DD_HH-MM-SS_RANDOM.log`. Az RANDOM * suffix biztositja a unique nevet ha ugyanazon a masodpercen tobb fajl jon letre * (pl. rotation kozvetlenul install utan, vagy specfajlok gyors egymas utan). */ private buildSessionFilename; /** * Egyetlen stdout/stderr iras tee-zese az aktualis log fajlba. * Hibakat csendben elnyeli — a file logger SOHASEM blokkolja a szervert. * Size-trackeli az aktualis fajlt es szukseg szerint rotalja. */ private teeWrite; /** * Uj session fajl letrehozasa (az aktualis lezarodik). Retention cleanup-ot is * vegrehajt, hogy a rotation termeszetesen tisztan tarttsa a log dir-t. */ private rotate; /** * Retention takaritas: ket szabaly ami ami elobb teljesul: * 1) maxFiles — ha tobb mint N log fajl van, a legregebbieket torli * 2) retentionDays — `retentionDays`-nel idosebb fajlokat torli * * Hibakat csendben elnyel. A torolt fajlokat es az okot NEM logoljuk, hogy * ne kerüljön extra szennyezes a most induló session fajlba. */ private cleanupOldLogs; } //# sourceMappingURL=file-log.service.d.ts.map