@spinajs/log 2.0.480 → 2.0.482
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +744 -0
- package/lib/cjs/archive/LogArchiveService.d.ts +75 -0
- package/lib/cjs/archive/LogArchiveService.d.ts.map +1 -0
- package/lib/cjs/archive/LogArchiveService.js +189 -0
- package/lib/cjs/archive/LogArchiveService.js.map +1 -0
- package/lib/cjs/archive/archive-strategy.d.ts +32 -0
- package/lib/cjs/archive/archive-strategy.d.ts.map +1 -0
- package/lib/cjs/archive/archive-strategy.js +43 -0
- package/lib/cjs/archive/archive-strategy.js.map +1 -0
- package/lib/cjs/archive/context.d.ts +50 -0
- package/lib/cjs/archive/context.d.ts.map +1 -0
- package/lib/cjs/archive/context.js +3 -0
- package/lib/cjs/archive/context.js.map +1 -0
- package/lib/cjs/archive/index.d.ts +10 -0
- package/lib/cjs/archive/index.d.ts.map +1 -0
- package/lib/cjs/archive/index.js +26 -0
- package/lib/cjs/archive/index.js.map +1 -0
- package/lib/cjs/archive/retention-strategy.d.ts +26 -0
- package/lib/cjs/archive/retention-strategy.d.ts.map +1 -0
- package/lib/cjs/archive/retention-strategy.js +42 -0
- package/lib/cjs/archive/retention-strategy.js.map +1 -0
- package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.d.ts +10 -0
- package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.d.ts.map +1 -0
- package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.js +46 -0
- package/lib/cjs/archive/strategies/AgeLogRetentionStrategy.js.map +1 -0
- package/lib/cjs/archive/strategies/CountLogRetentionStrategy.d.ts +10 -0
- package/lib/cjs/archive/strategies/CountLogRetentionStrategy.d.ts.map +1 -0
- package/lib/cjs/archive/strategies/CountLogRetentionStrategy.js +42 -0
- package/lib/cjs/archive/strategies/CountLogRetentionStrategy.js.map +1 -0
- package/lib/cjs/archive/strategies/CronLogArchiveStrategy.d.ts +15 -0
- package/lib/cjs/archive/strategies/CronLogArchiveStrategy.d.ts.map +1 -0
- package/lib/cjs/archive/strategies/CronLogArchiveStrategy.js +52 -0
- package/lib/cjs/archive/strategies/CronLogArchiveStrategy.js.map +1 -0
- package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.d.ts +18 -0
- package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.d.ts.map +1 -0
- package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.js +63 -0
- package/lib/cjs/archive/strategies/SizeLogArchiveStrategy.js.map +1 -0
- package/lib/cjs/archive/strategies/util.d.ts +28 -0
- package/lib/cjs/archive/strategies/util.d.ts.map +1 -0
- package/lib/cjs/archive/strategies/util.js +59 -0
- package/lib/cjs/archive/strategies/util.js.map +1 -0
- package/lib/cjs/bootstrap.d.ts.map +1 -1
- package/lib/cjs/bootstrap.js +24 -1
- package/lib/cjs/bootstrap.js.map +1 -1
- package/lib/cjs/callsite.d.ts +26 -0
- package/lib/cjs/callsite.d.ts.map +1 -0
- package/lib/cjs/callsite.js +60 -0
- package/lib/cjs/callsite.js.map +1 -0
- package/lib/cjs/config/log.d.ts +96 -0
- package/lib/cjs/config/log.d.ts.map +1 -0
- package/lib/cjs/config/log.js +75 -0
- package/lib/cjs/config/log.js.map +1 -0
- package/lib/cjs/context.browser.d.ts +46 -0
- package/lib/cjs/context.browser.d.ts.map +1 -0
- package/lib/cjs/context.browser.js +85 -0
- package/lib/cjs/context.browser.js.map +1 -0
- package/lib/cjs/context.d.ts +61 -0
- package/lib/cjs/context.d.ts.map +1 -0
- package/lib/cjs/context.js +92 -0
- package/lib/cjs/context.js.map +1 -0
- package/lib/cjs/filters/LevelFilter.d.ts +24 -0
- package/lib/cjs/filters/LevelFilter.d.ts.map +1 -0
- package/lib/cjs/filters/LevelFilter.js +39 -0
- package/lib/cjs/filters/LevelFilter.js.map +1 -0
- package/lib/cjs/filters/MatchFilter.d.ts +30 -0
- package/lib/cjs/filters/MatchFilter.d.ts.map +1 -0
- package/lib/cjs/filters/MatchFilter.js +65 -0
- package/lib/cjs/filters/MatchFilter.js.map +1 -0
- package/lib/cjs/filters/RateLimitFilter.d.ts +37 -0
- package/lib/cjs/filters/RateLimitFilter.d.ts.map +1 -0
- package/lib/cjs/filters/RateLimitFilter.js +70 -0
- package/lib/cjs/filters/RateLimitFilter.js.map +1 -0
- package/lib/cjs/filters/index.d.ts +4 -0
- package/lib/cjs/filters/index.d.ts.map +1 -0
- package/lib/cjs/filters/index.js +20 -0
- package/lib/cjs/filters/index.js.map +1 -0
- package/lib/cjs/index.browser.d.ts +14 -0
- package/lib/cjs/index.browser.d.ts.map +1 -0
- package/lib/cjs/index.browser.js +46 -0
- package/lib/cjs/index.browser.js.map +1 -0
- package/lib/cjs/index.d.ts +8 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +8 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/log.d.ts +60 -1
- package/lib/cjs/log.d.ts.map +1 -1
- package/lib/cjs/log.js +294 -32
- package/lib/cjs/log.js.map +1 -1
- package/lib/cjs/perf/LogMetricSink.d.ts +28 -0
- package/lib/cjs/perf/LogMetricSink.d.ts.map +1 -0
- package/lib/cjs/perf/LogMetricSink.js +120 -0
- package/lib/cjs/perf/LogMetricSink.js.map +1 -0
- package/lib/cjs/perf/measure.d.ts +9 -0
- package/lib/cjs/perf/measure.d.ts.map +1 -0
- package/lib/cjs/perf/measure.js +21 -0
- package/lib/cjs/perf/measure.js.map +1 -0
- package/lib/cjs/perf.d.ts +9 -0
- package/lib/cjs/perf.d.ts.map +1 -0
- package/lib/cjs/perf.js +18 -0
- package/lib/cjs/perf.js.map +1 -0
- package/lib/cjs/schemas/log.configuration.d.ts +151 -18
- package/lib/cjs/schemas/log.configuration.d.ts.map +1 -1
- package/lib/cjs/schemas/log.configuration.js +154 -21
- package/lib/cjs/schemas/log.configuration.js.map +1 -1
- package/lib/cjs/targets/BrowserConsoleTarget.d.ts +48 -0
- package/lib/cjs/targets/BrowserConsoleTarget.d.ts.map +1 -0
- package/lib/cjs/targets/BrowserConsoleTarget.js +48 -0
- package/lib/cjs/targets/BrowserConsoleTarget.js.map +1 -0
- package/lib/cjs/targets/ColoredConsoleTarget.d.ts.map +1 -1
- package/lib/cjs/targets/ColoredConsoleTarget.js +21 -12
- package/lib/cjs/targets/ColoredConsoleTarget.js.map +1 -1
- package/lib/cjs/targets/FileTarget.d.ts +96 -20
- package/lib/cjs/targets/FileTarget.d.ts.map +1 -1
- package/lib/cjs/targets/FileTarget.js +188 -225
- package/lib/cjs/targets/FileTarget.js.map +1 -1
- package/lib/cjs/targets/JsonFileTarget.d.ts +19 -0
- package/lib/cjs/targets/JsonFileTarget.d.ts.map +1 -0
- package/lib/cjs/targets/JsonFileTarget.js +44 -0
- package/lib/cjs/targets/JsonFileTarget.js.map +1 -0
- package/lib/cjs/targets/JsonTarget.d.ts +27 -0
- package/lib/cjs/targets/JsonTarget.d.ts.map +1 -0
- package/lib/cjs/targets/JsonTarget.js +46 -0
- package/lib/cjs/targets/JsonTarget.js.map +1 -0
- package/lib/cjs/targets/MemoryTarget.d.ts +33 -0
- package/lib/cjs/targets/MemoryTarget.d.ts.map +1 -0
- package/lib/cjs/targets/MemoryTarget.js +63 -0
- package/lib/cjs/targets/MemoryTarget.js.map +1 -0
- package/lib/cjs/targets/index.d.ts +7 -0
- package/lib/cjs/targets/index.d.ts.map +1 -1
- package/lib/cjs/targets/index.js +7 -0
- package/lib/cjs/targets/index.js.map +1 -1
- package/lib/cjs/targets/wrappers/AutoFlushTarget.d.ts +37 -0
- package/lib/cjs/targets/wrappers/AutoFlushTarget.d.ts.map +1 -0
- package/lib/cjs/targets/wrappers/AutoFlushTarget.js +48 -0
- package/lib/cjs/targets/wrappers/AutoFlushTarget.js.map +1 -0
- package/lib/cjs/targets/wrappers/FallbackGroupTarget.d.ts +45 -0
- package/lib/cjs/targets/wrappers/FallbackGroupTarget.d.ts.map +1 -0
- package/lib/cjs/targets/wrappers/FallbackGroupTarget.js +94 -0
- package/lib/cjs/targets/wrappers/FallbackGroupTarget.js.map +1 -0
- package/lib/cjs/targets/wrappers/RetryingTarget.d.ts +44 -0
- package/lib/cjs/targets/wrappers/RetryingTarget.d.ts.map +1 -0
- package/lib/cjs/targets/wrappers/RetryingTarget.js +61 -0
- package/lib/cjs/targets/wrappers/RetryingTarget.js.map +1 -0
- package/lib/cjs/targets/wrappers/SplitGroupTarget.d.ts +30 -0
- package/lib/cjs/targets/wrappers/SplitGroupTarget.d.ts.map +1 -0
- package/lib/cjs/targets/wrappers/SplitGroupTarget.js +52 -0
- package/lib/cjs/targets/wrappers/SplitGroupTarget.js.map +1 -0
- package/lib/cjs/traceparent.d.ts +63 -0
- package/lib/cjs/traceparent.d.ts.map +1 -0
- package/lib/cjs/traceparent.js +107 -0
- package/lib/cjs/traceparent.js.map +1 -0
- package/lib/mjs/archive/LogArchiveService.d.ts +75 -0
- package/lib/mjs/archive/LogArchiveService.d.ts.map +1 -0
- package/lib/mjs/archive/LogArchiveService.js +186 -0
- package/lib/mjs/archive/LogArchiveService.js.map +1 -0
- package/lib/mjs/archive/archive-strategy.d.ts +32 -0
- package/lib/mjs/archive/archive-strategy.d.ts.map +1 -0
- package/lib/mjs/archive/archive-strategy.js +39 -0
- package/lib/mjs/archive/archive-strategy.js.map +1 -0
- package/lib/mjs/archive/context.d.ts +50 -0
- package/lib/mjs/archive/context.d.ts.map +1 -0
- package/lib/mjs/archive/context.js +2 -0
- package/lib/mjs/archive/context.js.map +1 -0
- package/lib/mjs/archive/index.d.ts +10 -0
- package/lib/mjs/archive/index.d.ts.map +1 -0
- package/lib/mjs/archive/index.js +10 -0
- package/lib/mjs/archive/index.js.map +1 -0
- package/lib/mjs/archive/retention-strategy.d.ts +26 -0
- package/lib/mjs/archive/retention-strategy.d.ts.map +1 -0
- package/lib/mjs/archive/retention-strategy.js +38 -0
- package/lib/mjs/archive/retention-strategy.js.map +1 -0
- package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.d.ts +10 -0
- package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.d.ts.map +1 -0
- package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.js +43 -0
- package/lib/mjs/archive/strategies/AgeLogRetentionStrategy.js.map +1 -0
- package/lib/mjs/archive/strategies/CountLogRetentionStrategy.d.ts +10 -0
- package/lib/mjs/archive/strategies/CountLogRetentionStrategy.d.ts.map +1 -0
- package/lib/mjs/archive/strategies/CountLogRetentionStrategy.js +39 -0
- package/lib/mjs/archive/strategies/CountLogRetentionStrategy.js.map +1 -0
- package/lib/mjs/archive/strategies/CronLogArchiveStrategy.d.ts +15 -0
- package/lib/mjs/archive/strategies/CronLogArchiveStrategy.d.ts.map +1 -0
- package/lib/mjs/archive/strategies/CronLogArchiveStrategy.js +49 -0
- package/lib/mjs/archive/strategies/CronLogArchiveStrategy.js.map +1 -0
- package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.d.ts +18 -0
- package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.d.ts.map +1 -0
- package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.js +60 -0
- package/lib/mjs/archive/strategies/SizeLogArchiveStrategy.js.map +1 -0
- package/lib/mjs/archive/strategies/util.d.ts +28 -0
- package/lib/mjs/archive/strategies/util.d.ts.map +1 -0
- package/lib/mjs/archive/strategies/util.js +54 -0
- package/lib/mjs/archive/strategies/util.js.map +1 -0
- package/lib/mjs/bootstrap.d.ts.map +1 -1
- package/lib/mjs/bootstrap.js +25 -2
- package/lib/mjs/bootstrap.js.map +1 -1
- package/lib/mjs/callsite.d.ts +26 -0
- package/lib/mjs/callsite.d.ts.map +1 -0
- package/lib/mjs/callsite.js +57 -0
- package/lib/mjs/callsite.js.map +1 -0
- package/lib/mjs/config/log.d.ts +96 -0
- package/lib/mjs/config/log.d.ts.map +1 -0
- package/lib/mjs/config/log.js +72 -0
- package/lib/mjs/config/log.js.map +1 -0
- package/lib/mjs/context.browser.d.ts +46 -0
- package/lib/mjs/context.browser.d.ts.map +1 -0
- package/lib/mjs/context.browser.js +81 -0
- package/lib/mjs/context.browser.js.map +1 -0
- package/lib/mjs/context.d.ts +61 -0
- package/lib/mjs/context.d.ts.map +1 -0
- package/lib/mjs/context.js +88 -0
- package/lib/mjs/context.js.map +1 -0
- package/lib/mjs/filters/LevelFilter.d.ts +24 -0
- package/lib/mjs/filters/LevelFilter.d.ts.map +1 -0
- package/lib/mjs/filters/LevelFilter.js +36 -0
- package/lib/mjs/filters/LevelFilter.js.map +1 -0
- package/lib/mjs/filters/MatchFilter.d.ts +30 -0
- package/lib/mjs/filters/MatchFilter.d.ts.map +1 -0
- package/lib/mjs/filters/MatchFilter.js +62 -0
- package/lib/mjs/filters/MatchFilter.js.map +1 -0
- package/lib/mjs/filters/RateLimitFilter.d.ts +37 -0
- package/lib/mjs/filters/RateLimitFilter.d.ts.map +1 -0
- package/lib/mjs/filters/RateLimitFilter.js +67 -0
- package/lib/mjs/filters/RateLimitFilter.js.map +1 -0
- package/lib/mjs/filters/index.d.ts +4 -0
- package/lib/mjs/filters/index.d.ts.map +1 -0
- package/lib/mjs/filters/index.js +4 -0
- package/lib/mjs/filters/index.js.map +1 -0
- package/lib/mjs/index.browser.d.ts +14 -0
- package/lib/mjs/index.browser.d.ts.map +1 -0
- package/lib/mjs/index.browser.js +30 -0
- package/lib/mjs/index.browser.js.map +1 -0
- package/lib/mjs/index.d.ts +8 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +8 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/log.d.ts +60 -1
- package/lib/mjs/log.d.ts.map +1 -1
- package/lib/mjs/log.js +295 -33
- package/lib/mjs/log.js.map +1 -1
- package/lib/mjs/perf/LogMetricSink.d.ts +28 -0
- package/lib/mjs/perf/LogMetricSink.d.ts.map +1 -0
- package/lib/mjs/perf/LogMetricSink.js +117 -0
- package/lib/mjs/perf/LogMetricSink.js.map +1 -0
- package/lib/mjs/perf/measure.d.ts +9 -0
- package/lib/mjs/perf/measure.d.ts.map +1 -0
- package/lib/mjs/perf/measure.js +18 -0
- package/lib/mjs/perf/measure.js.map +1 -0
- package/lib/mjs/perf.d.ts +9 -0
- package/lib/mjs/perf.d.ts.map +1 -0
- package/lib/mjs/perf.js +15 -0
- package/lib/mjs/perf.js.map +1 -0
- package/lib/mjs/schemas/log.configuration.d.ts +151 -18
- package/lib/mjs/schemas/log.configuration.d.ts.map +1 -1
- package/lib/mjs/schemas/log.configuration.js +154 -21
- package/lib/mjs/schemas/log.configuration.js.map +1 -1
- package/lib/mjs/targets/BrowserConsoleTarget.d.ts +48 -0
- package/lib/mjs/targets/BrowserConsoleTarget.d.ts.map +1 -0
- package/lib/mjs/targets/BrowserConsoleTarget.js +45 -0
- package/lib/mjs/targets/BrowserConsoleTarget.js.map +1 -0
- package/lib/mjs/targets/ColoredConsoleTarget.d.ts.map +1 -1
- package/lib/mjs/targets/ColoredConsoleTarget.js +21 -9
- package/lib/mjs/targets/ColoredConsoleTarget.js.map +1 -1
- package/lib/mjs/targets/FileTarget.d.ts +96 -20
- package/lib/mjs/targets/FileTarget.d.ts.map +1 -1
- package/lib/mjs/targets/FileTarget.js +191 -192
- package/lib/mjs/targets/FileTarget.js.map +1 -1
- package/lib/mjs/targets/JsonFileTarget.d.ts +19 -0
- package/lib/mjs/targets/JsonFileTarget.d.ts.map +1 -0
- package/lib/mjs/targets/JsonFileTarget.js +41 -0
- package/lib/mjs/targets/JsonFileTarget.js.map +1 -0
- package/lib/mjs/targets/JsonTarget.d.ts +27 -0
- package/lib/mjs/targets/JsonTarget.d.ts.map +1 -0
- package/lib/mjs/targets/JsonTarget.js +43 -0
- package/lib/mjs/targets/JsonTarget.js.map +1 -0
- package/lib/mjs/targets/MemoryTarget.d.ts +33 -0
- package/lib/mjs/targets/MemoryTarget.d.ts.map +1 -0
- package/lib/mjs/targets/MemoryTarget.js +60 -0
- package/lib/mjs/targets/MemoryTarget.js.map +1 -0
- package/lib/mjs/targets/index.d.ts +7 -0
- package/lib/mjs/targets/index.d.ts.map +1 -1
- package/lib/mjs/targets/index.js +7 -0
- package/lib/mjs/targets/index.js.map +1 -1
- package/lib/mjs/targets/wrappers/AutoFlushTarget.d.ts +37 -0
- package/lib/mjs/targets/wrappers/AutoFlushTarget.d.ts.map +1 -0
- package/lib/mjs/targets/wrappers/AutoFlushTarget.js +45 -0
- package/lib/mjs/targets/wrappers/AutoFlushTarget.js.map +1 -0
- package/lib/mjs/targets/wrappers/FallbackGroupTarget.d.ts +45 -0
- package/lib/mjs/targets/wrappers/FallbackGroupTarget.d.ts.map +1 -0
- package/lib/mjs/targets/wrappers/FallbackGroupTarget.js +91 -0
- package/lib/mjs/targets/wrappers/FallbackGroupTarget.js.map +1 -0
- package/lib/mjs/targets/wrappers/RetryingTarget.d.ts +44 -0
- package/lib/mjs/targets/wrappers/RetryingTarget.d.ts.map +1 -0
- package/lib/mjs/targets/wrappers/RetryingTarget.js +58 -0
- package/lib/mjs/targets/wrappers/RetryingTarget.js.map +1 -0
- package/lib/mjs/targets/wrappers/SplitGroupTarget.d.ts +30 -0
- package/lib/mjs/targets/wrappers/SplitGroupTarget.d.ts.map +1 -0
- package/lib/mjs/targets/wrappers/SplitGroupTarget.js +49 -0
- package/lib/mjs/targets/wrappers/SplitGroupTarget.js.map +1 -0
- package/lib/mjs/traceparent.d.ts +63 -0
- package/lib/mjs/traceparent.d.ts.map +1 -0
- package/lib/mjs/traceparent.js +100 -0
- package/lib/mjs/traceparent.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +25 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColoredConsoleTarget.js","sourceRoot":"","sources":["../../../src/targets/ColoredConsoleTarget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ColoredConsoleTarget.js","sourceRoot":"","sources":["../../../src/targets/ColoredConsoleTarget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,104 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
1
|
import { IInstanceCheck } from "@spinajs/di";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
import { fs } from "@spinajs/fs";
|
|
3
|
+
import { IFileTargetOptions, Log, ILogEntry, LogTarget, BatchQueue } from "@spinajs/log-common";
|
|
4
|
+
import { LogArchiveService } from "../archive/LogArchiveService.js";
|
|
5
|
+
import { ILogArchiveContext } from "../archive/context.js";
|
|
6
|
+
/**
|
|
7
|
+
* Writes log messages to a file through the @spinajs/fs abstraction.
|
|
8
|
+
*
|
|
9
|
+
* Messages are buffered in memory and flushed as a single batched append,
|
|
10
|
+
* either when the buffer reaches `maxBufferSize` or on a periodic flush tick.
|
|
11
|
+
* Rotation / archiving / retention is delegated to {@link LogArchiveService}.
|
|
12
|
+
*
|
|
13
|
+
* A single async write-lock ( a promise-chain mutex ) serializes every flush
|
|
14
|
+
* and every rotation, so a rename can never race an in-flight append.
|
|
15
|
+
*
|
|
16
|
+
* PerInstanceCheck: multiple file targets can point at different files, but two
|
|
17
|
+
* targets with the same name share one writer.
|
|
18
|
+
*/
|
|
9
19
|
export declare class FileTarget extends LogTarget<IFileTargetOptions> implements IInstanceCheck {
|
|
10
20
|
protected Log: Log;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
protected
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
protected
|
|
19
|
-
|
|
21
|
+
/**
|
|
22
|
+
* fs provider holding the active log file.
|
|
23
|
+
*/
|
|
24
|
+
protected Fs: fs;
|
|
25
|
+
/**
|
|
26
|
+
* fs provider archives are moved to ( defaults to `Fs` ).
|
|
27
|
+
*/
|
|
28
|
+
protected ArchiveFs: fs;
|
|
29
|
+
/**
|
|
30
|
+
* Directory ( relative to ArchiveFs ) archives are stored in.
|
|
31
|
+
*/
|
|
32
|
+
protected ArchiveDir: string;
|
|
33
|
+
protected ArchiveService: LogArchiveService;
|
|
34
|
+
protected Context: ILogArchiveContext;
|
|
35
|
+
/**
|
|
36
|
+
* Buffered-batch queue owning accumulation, the flush tick and the hard queue
|
|
37
|
+
* cap. It delegates the actual batched append to {@link append} via onFlush.
|
|
38
|
+
*/
|
|
39
|
+
protected Queue: BatchQueue<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Set true when the queue drops overflow, so the drop warning is emitted ONCE
|
|
42
|
+
* per overflow episode and reset when a batch appends successfully.
|
|
43
|
+
*/
|
|
44
|
+
protected Overflowed: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Async initialization ( fs resolution + mkdir + archive start ). write()
|
|
47
|
+
* and flush() await this so nothing touches the fs before it is ready.
|
|
48
|
+
*/
|
|
49
|
+
protected Ready: Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Promise-chain mutex tail. Every critical section ( flush, rotation ) chains
|
|
52
|
+
* onto this so they run strictly one at a time.
|
|
53
|
+
*/
|
|
54
|
+
protected WriteLock: Promise<unknown>;
|
|
55
|
+
protected Disposed: boolean;
|
|
20
56
|
__checkInstance__(creationOptions: IFileTargetOptions[]): boolean;
|
|
21
57
|
resolve(): void;
|
|
22
|
-
|
|
23
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Resolves fs providers, ensures directories exist, builds the archive
|
|
60
|
+
* context and starts the archive service.
|
|
61
|
+
*/
|
|
62
|
+
protected init(): Promise<void>;
|
|
24
63
|
write(data: ILogEntry): Promise<void>;
|
|
25
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Builds the single line appended for one entry. Overridable so subclasses can
|
|
66
|
+
* change ONLY the per-entry serialization while reusing the whole FileTarget
|
|
67
|
+
* pipeline ( batched append, write-lock, rotation, retention, zip ). The base
|
|
68
|
+
* renders the configured string `layout`.
|
|
69
|
+
*/
|
|
70
|
+
protected formatEntry(data: ILogEntry): string;
|
|
71
|
+
/**
|
|
72
|
+
* Flushes any buffered messages. Delegates to the queue's forceFlush so a
|
|
73
|
+
* caller ( eg. dispose or a test ) can await the drain.
|
|
74
|
+
*/
|
|
75
|
+
protected flush(): Promise<void>;
|
|
76
|
+
forceFlush(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Appends one batch as a single write, guarded by the write-lock ( the SAME
|
|
79
|
+
* lock rotation uses, so a rename can never race an append ). On failure the
|
|
80
|
+
* batch is requeued at the FRONT so nothing is lost ( never-drop, bounded by
|
|
81
|
+
* maxQueue ). This ALWAYS resolves ( never rejects ) so queue.shutdown() -
|
|
82
|
+
* driven by dispose() - never rejects.
|
|
83
|
+
*/
|
|
84
|
+
protected append(batch: string[]): Promise<void>;
|
|
85
|
+
dispose(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Runs `fn` under the shared write-lock. Flush and rotation both go through
|
|
88
|
+
* here, so a rename can never overlap an append.
|
|
89
|
+
*/
|
|
90
|
+
protected withWriteLock<T>(fn: () => Promise<T>): Promise<T>;
|
|
91
|
+
/**
|
|
92
|
+
* Active log path relative to the fs provider base path. Recomputed each call
|
|
93
|
+
* so dynamic ( eg. date-based ) paths work.
|
|
94
|
+
*/
|
|
95
|
+
protected activePath(): string;
|
|
96
|
+
/**
|
|
97
|
+
* Normalizes a configured path to forward slashes and strips a leading
|
|
98
|
+
* separator. Paths are interpreted relative to the fs provider base path -
|
|
99
|
+
* the provider itself sandboxes and resolves them, so we only canonicalize
|
|
100
|
+
* separators here.
|
|
101
|
+
*/
|
|
102
|
+
protected normalize(p: string): string;
|
|
26
103
|
}
|
|
27
|
-
export {};
|
|
28
104
|
//# sourceMappingURL=FileTarget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"AAIA,OAAO,EAAM,cAAc,EAAgC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAU,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAExG,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D;;;;;;;;;;;;GAYG;AACH,qBAEa,UAAW,SAAQ,SAAS,CAAC,kBAAkB,CAAE,YAAW,cAAc;IAErF,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,UAAU,SAAM;IAE1B,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC5C,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAEtC;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpC;;;OAGG;IACH,SAAS,CAAC,UAAU,UAAS;IAE7B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAqB;IAE1D,SAAS,CAAC,QAAQ,UAAS;IAE3B,iBAAiB,CAAC,eAAe,EAAE,kBAAkB,EAAE,GAAG,OAAO;IAI1D,OAAO,IAAI,IAAI;IA+CtB;;;OAGG;cACa,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCxB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD;;;;;OAKG;IACH,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAI9C;;;OAGG;cACa,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;;;;OAMG;cACa,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASrC;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAO5D;;;OAGG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAK9B;;;;;OAKG;IACH,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAGvC"}
|
|
@@ -1,265 +1,228 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
7
|
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
10
|
};
|
|
44
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
-
};
|
|
47
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
12
|
exports.FileTarget = void 0;
|
|
49
|
-
/* eslint-disable security/detect-object-injection */
|
|
50
13
|
const os_1 = require("os");
|
|
51
|
-
const
|
|
52
|
-
const path = __importStar(require("path"));
|
|
53
|
-
const glob_1 = __importDefault(require("glob"));
|
|
54
|
-
const zlib = __importStar(require("zlib"));
|
|
55
|
-
const stream_1 = require("stream");
|
|
14
|
+
const path_1 = require("path");
|
|
56
15
|
const configuration_1 = require("@spinajs/configuration");
|
|
57
16
|
const exceptions_1 = require("@spinajs/exceptions");
|
|
58
17
|
const di_1 = require("@spinajs/di");
|
|
59
18
|
const log_common_1 = require("@spinajs/log-common");
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
19
|
+
const LogArchiveService_js_1 = require("../archive/LogArchiveService.js");
|
|
20
|
+
const log_js_1 = require("../config/log.js");
|
|
21
|
+
/**
|
|
22
|
+
* Writes log messages to a file through the @spinajs/fs abstraction.
|
|
23
|
+
*
|
|
24
|
+
* Messages are buffered in memory and flushed as a single batched append,
|
|
25
|
+
* either when the buffer reaches `maxBufferSize` or on a periodic flush tick.
|
|
26
|
+
* Rotation / archiving / retention is delegated to {@link LogArchiveService}.
|
|
27
|
+
*
|
|
28
|
+
* A single async write-lock ( a promise-chain mutex ) serializes every flush
|
|
29
|
+
* and every rotation, so a rename can never race an in-flight append.
|
|
30
|
+
*
|
|
31
|
+
* PerInstanceCheck: multiple file targets can point at different files, but two
|
|
32
|
+
* targets with the same name share one writer.
|
|
33
|
+
*/
|
|
69
34
|
let FileTarget = class FileTarget extends log_common_1.LogTarget {
|
|
70
35
|
constructor() {
|
|
71
36
|
super(...arguments);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
this.
|
|
37
|
+
/**
|
|
38
|
+
* Directory ( relative to ArchiveFs ) archives are stored in.
|
|
39
|
+
*/
|
|
40
|
+
this.ArchiveDir = "";
|
|
41
|
+
/**
|
|
42
|
+
* Set true when the queue drops overflow, so the drop warning is emitted ONCE
|
|
43
|
+
* per overflow episode and reset when a batch appends successfully.
|
|
44
|
+
*/
|
|
45
|
+
this.Overflowed = false;
|
|
46
|
+
/**
|
|
47
|
+
* Promise-chain mutex tail. Every critical section ( flush, rotation ) chains
|
|
48
|
+
* onto this so they run strictly one at a time.
|
|
49
|
+
*/
|
|
50
|
+
this.WriteLock = Promise.resolve();
|
|
51
|
+
this.Disposed = false;
|
|
76
52
|
}
|
|
77
53
|
__checkInstance__(creationOptions) {
|
|
78
54
|
return this.Options.name === creationOptions[0].name;
|
|
79
55
|
}
|
|
80
56
|
resolve() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
this.
|
|
89
|
-
if (!this.
|
|
90
|
-
throw new exceptions_1.InvalidOption(
|
|
91
|
-
}
|
|
92
|
-
if (!fs_1.default.existsSync(this.LogDirPath)) {
|
|
93
|
-
fs_1.default.mkdirSync(this.LogDirPath, { recursive: true });
|
|
94
|
-
}
|
|
95
|
-
if (this.ArchiveDirPath) {
|
|
96
|
-
if (!fs_1.default.existsSync(this.ArchiveDirPath)) {
|
|
97
|
-
fs_1.default.mkdirSync(this.ArchiveDirPath, { recursive: true });
|
|
98
|
-
}
|
|
57
|
+
// Defaults come from the shipped `logger.file` config ( discoverable and
|
|
58
|
+
// user-overridable like every other spinajs package ). LOG_FILE_DEFAULTS is
|
|
59
|
+
// the same object the config ships and is used as a last-resort fallback for
|
|
60
|
+
// environments where the config file was not discovered ( eg. some tests ).
|
|
61
|
+
// Merge order ( lowest to highest ): constant < config < per-target options.
|
|
62
|
+
const cfg = di_1.DI.get(configuration_1.Configuration);
|
|
63
|
+
const fileDefaults = cfg ? cfg.get("logger.file", {}) : {};
|
|
64
|
+
this.Options.options = Object.assign({}, log_js_1.LOG_FILE_DEFAULTS, fileDefaults, this.Options.options);
|
|
65
|
+
if (!this.Options.options.path) {
|
|
66
|
+
throw new exceptions_1.InvalidOption(`FileTarget ${this.Options.name} requires a 'path' option`);
|
|
99
67
|
}
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
68
|
+
// start async init - fs resolution and dir creation cannot run in a sync
|
|
69
|
+
// SyncService.resolve, so writes buffer until Ready settles
|
|
70
|
+
this.Ready = this.init();
|
|
71
|
+
this.Ready.catch((err) => {
|
|
72
|
+
this.HasError = true;
|
|
73
|
+
this.Error = err;
|
|
74
|
+
this.Log.error(err, `Cannot initialize file target ${this.Options.name}`);
|
|
75
|
+
});
|
|
76
|
+
// BatchQueue owns accumulation, the periodic flush tick ( unref'd, so a
|
|
77
|
+
// pending flush never keeps the process alive ) and the hard queue cap. The
|
|
78
|
+
// batched append itself runs in append() under the write-lock.
|
|
79
|
+
this.Queue = new log_common_1.BatchQueue({
|
|
80
|
+
maxBatch: this.Options.options.maxBufferSize,
|
|
81
|
+
maxQueue: this.Options.options.maxQueueSize,
|
|
82
|
+
flushIntervalMs: this.Options.options.flushInterval ?? log_js_1.LOG_FILE_DEFAULTS.flushInterval,
|
|
83
|
+
onFlush: (batch) => this.append(batch),
|
|
84
|
+
onOverflow: (droppedItems) => {
|
|
85
|
+
// droppedItems here are already-formatted STRINGS, so we cannot
|
|
86
|
+
// reconstruct the original ILogEntry to route via OnDropped. File
|
|
87
|
+
// overflow stays warn-only ( count from droppedItems.length ). The
|
|
88
|
+
// drop-hook ( D ) targets the network-primary -> file-fallback case,
|
|
89
|
+
// not File-as-primary drops.
|
|
90
|
+
if (!this.Overflowed) {
|
|
91
|
+
this.Overflowed = true;
|
|
92
|
+
this.Log.warn(`File target ${this.Options.name} buffer exceeded ${this.Options.options.maxQueueSize} messages, dropped ${droppedItems.length} oldest buffered messages.`);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
});
|
|
126
96
|
super.resolve();
|
|
127
97
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Resolves fs providers, ensures directories exist, builds the archive
|
|
100
|
+
* context and starts the archive service.
|
|
101
|
+
*/
|
|
102
|
+
async init() {
|
|
103
|
+
const o = this.Options.options;
|
|
104
|
+
// o.fs is always populated from LOG_FILE_DEFAULTS ( see resolve() )
|
|
105
|
+
this.Fs = di_1.DI.resolve("__file_provider__", [o.fs]);
|
|
106
|
+
this.ArchiveFs = o.archiveFs ? di_1.DI.resolve("__file_provider__", [o.archiveFs]) : this.Fs;
|
|
107
|
+
// path is relative to the fs provider base path; ensure its directory exists
|
|
108
|
+
const logDir = path_1.posix.dirname(this.activePath());
|
|
109
|
+
if (logDir && logDir !== ".") {
|
|
110
|
+
await this.Fs.mkdir(logDir);
|
|
132
111
|
}
|
|
133
|
-
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
this.
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// stop flush timer
|
|
152
|
-
clearInterval(this.FlushTimer);
|
|
153
|
-
// write all messages from buffer
|
|
154
|
-
this.WriteBuffer = [...this.WriteBuffer, ...this.Buffer];
|
|
155
|
-
this.flush();
|
|
112
|
+
// archivePath ( when set ) is a directory relative to the archive fs; when
|
|
113
|
+
// not set, archives live in the same directory as the active log
|
|
114
|
+
this.ArchiveDir = o.archivePath ? this.normalize((0, configuration_1.format)(null, o.archivePath)) : logDir === "." ? "" : logDir;
|
|
115
|
+
if (this.ArchiveDir) {
|
|
116
|
+
await this.ArchiveFs.mkdir(this.ArchiveDir);
|
|
117
|
+
}
|
|
118
|
+
this.Context = {
|
|
119
|
+
fs: this.Fs,
|
|
120
|
+
archiveFs: this.ArchiveFs,
|
|
121
|
+
activePath: this.activePath(),
|
|
122
|
+
archiveDir: this.ArchiveDir,
|
|
123
|
+
options: o,
|
|
124
|
+
logger: this.Log,
|
|
125
|
+
rotate: () => this.ArchiveService.rotate(this.Context),
|
|
126
|
+
withWriteLock: (fn) => this.withWriteLock(fn),
|
|
127
|
+
};
|
|
128
|
+
this.ArchiveService = await di_1.DI.resolve(LogArchiveService_js_1.LogArchiveService);
|
|
129
|
+
await this.ArchiveService.start(this.Context);
|
|
156
130
|
}
|
|
157
131
|
async write(data) {
|
|
158
|
-
if (!this.Options.enabled) {
|
|
132
|
+
if (!this.Options.enabled || this.Disposed) {
|
|
159
133
|
return;
|
|
160
134
|
}
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
//
|
|
164
|
-
|
|
165
|
-
|
|
135
|
+
const entry = this.formatEntry(data);
|
|
136
|
+
// enqueue awaits the batched append when maxBatch ( = maxBufferSize ) is
|
|
137
|
+
// reached, preserving the old "await flush when full" back-pressure
|
|
138
|
+
await this.Queue.enqueue(entry);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Builds the single line appended for one entry. Overridable so subclasses can
|
|
142
|
+
* change ONLY the per-entry serialization while reusing the whole FileTarget
|
|
143
|
+
* pipeline ( batched append, write-lock, rotation, retention, zip ). The base
|
|
144
|
+
* renders the configured string `layout`.
|
|
145
|
+
*/
|
|
146
|
+
formatEntry(data) {
|
|
147
|
+
return (0, configuration_1.format)(data.Variables, this.Options.layout);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Flushes any buffered messages. Delegates to the queue's forceFlush so a
|
|
151
|
+
* caller ( eg. dispose or a test ) can await the drain.
|
|
152
|
+
*/
|
|
153
|
+
async flush() {
|
|
154
|
+
await this.Queue.forceFlush();
|
|
155
|
+
}
|
|
156
|
+
forceFlush() {
|
|
157
|
+
return this.Queue ? this.Queue.forceFlush() : Promise.resolve();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Appends one batch as a single write, guarded by the write-lock ( the SAME
|
|
161
|
+
* lock rotation uses, so a rename can never race an append ). On failure the
|
|
162
|
+
* batch is requeued at the FRONT so nothing is lost ( never-drop, bounded by
|
|
163
|
+
* maxQueue ). This ALWAYS resolves ( never rejects ) so queue.shutdown() -
|
|
164
|
+
* driven by dispose() - never rejects.
|
|
165
|
+
*/
|
|
166
|
+
async append(batch) {
|
|
167
|
+
await this.Ready.catch(() => {
|
|
168
|
+
/* init failed - error already recorded, skip appending */
|
|
169
|
+
});
|
|
170
|
+
if (!this.Fs) {
|
|
171
|
+
// init failed / fs unavailable - keep the batch for a later retry
|
|
172
|
+
this.Queue.requeueFront(batch);
|
|
166
173
|
return;
|
|
167
174
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
name: f,
|
|
185
|
-
stat: fs_1.default.statSync(f),
|
|
186
|
-
};
|
|
187
|
-
})
|
|
188
|
-
.sort((a, b) => a.stat.mtime.getTime() - b.stat.mtime.getTime());
|
|
189
|
-
const lFiles = glob_1.default
|
|
190
|
-
.sync(path.join(this.LogDirPath, `*${ext}`).replace(/\\/g, "/"))
|
|
191
|
-
.map((f) => {
|
|
192
|
-
return {
|
|
193
|
-
name: f,
|
|
194
|
-
stat: fs_1.default.statSync(f),
|
|
195
|
-
};
|
|
196
|
-
})
|
|
197
|
-
.sort((a, b) => a.stat.mtime.getTime() - b.stat.mtime.getTime());
|
|
198
|
-
// clear archived files above limit
|
|
199
|
-
if (aFiles.length > this.Options.options.maxArchiveFiles) {
|
|
200
|
-
for (let i = 0; i < aFiles.length - this.Options.options.maxArchiveFiles; i++) {
|
|
201
|
-
fs_1.default.unlink(aFiles[i].name, (err) => {
|
|
202
|
-
if (err) {
|
|
203
|
-
this.Log.error(err, `Cannot delete archived file at path ${aFiles[i - 1].name}`);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
this.Log.info(`Deleted archived file at path ${aFiles[i].name}`);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
175
|
+
await this.withWriteLock(async () => {
|
|
176
|
+
const path = this.activePath();
|
|
177
|
+
try {
|
|
178
|
+
await this.Fs.append(path, batch.join(os_1.EOL) + os_1.EOL);
|
|
179
|
+
this.HasError = false;
|
|
180
|
+
this.Error = null;
|
|
181
|
+
// batch appended successfully - allow the next overflow episode to warn again
|
|
182
|
+
this.Overflowed = false;
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
this.HasError = true;
|
|
186
|
+
this.Error = err;
|
|
187
|
+
this.Log.error(err, `Cannot write log messages to file target at path ${path}`);
|
|
188
|
+
// restore the batch in front of anything queued meanwhile - never drop.
|
|
189
|
+
// the queue caps at maxQueue, dropping the oldest if the sink stays down.
|
|
190
|
+
this.Queue.requeueFront(batch);
|
|
209
191
|
}
|
|
210
|
-
}
|
|
211
|
-
// now move log files that are above limited file size or old
|
|
212
|
-
const filesToArchive = lFiles.filter((x) => {
|
|
213
|
-
return x.stat.size > this.Options.options.maxSize || lFiles.indexOf(x) <= lFiles.length - 2;
|
|
214
192
|
});
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
this.Log.info(`Succesyfully compressed archive log at path ${zippedPath}`);
|
|
250
|
-
fs_1.default.unlink(archPath, (err) => {
|
|
251
|
-
if (err) {
|
|
252
|
-
this.Log.error(err, `Cannot delete archived log after compression at path ${archPath}`);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
this.ArchiveStatus = FileTargetStatus.IDLE;
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
this.ArchiveStatus = FileTargetStatus.IDLE;
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
}
|
|
193
|
+
}
|
|
194
|
+
async dispose() {
|
|
195
|
+
this.Disposed = true;
|
|
196
|
+
// stops the flush timer and performs a final flush of anything buffered
|
|
197
|
+
await this.Queue.shutdown();
|
|
198
|
+
this.ArchiveService?.stop();
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Runs `fn` under the shared write-lock. Flush and rotation both go through
|
|
202
|
+
* here, so a rename can never overlap an append.
|
|
203
|
+
*/
|
|
204
|
+
withWriteLock(fn) {
|
|
205
|
+
const run = this.WriteLock.then(() => fn());
|
|
206
|
+
// keep the chain alive on failure so the lock never deadlocks
|
|
207
|
+
this.WriteLock = run.catch(() => undefined);
|
|
208
|
+
return run;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Active log path relative to the fs provider base path. Recomputed each call
|
|
212
|
+
* so dynamic ( eg. date-based ) paths work.
|
|
213
|
+
*/
|
|
214
|
+
activePath() {
|
|
215
|
+
const p = (0, configuration_1.format)({ logger: this.Options.name }, this.Options.options.path);
|
|
216
|
+
return this.normalize(p);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Normalizes a configured path to forward slashes and strips a leading
|
|
220
|
+
* separator. Paths are interpreted relative to the fs provider base path -
|
|
221
|
+
* the provider itself sandboxes and resolves them, so we only canonicalize
|
|
222
|
+
* separators here.
|
|
223
|
+
*/
|
|
224
|
+
normalize(p) {
|
|
225
|
+
return p.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
263
226
|
}
|
|
264
227
|
};
|
|
265
228
|
exports.FileTarget = FileTarget;
|