@spinajs/log 2.0.481 → 2.0.484
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 +55 -0
- package/lib/cjs/perf/LogMetricSink.d.ts.map +1 -0
- package/lib/cjs/perf/LogMetricSink.js +154 -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 +55 -0
- package/lib/mjs/perf/LogMetricSink.d.ts.map +1 -0
- package/lib/mjs/perf/LogMetricSink.js +151 -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 +26 -15
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./context.js";
|
|
2
|
+
export * from "./archive-strategy.js";
|
|
3
|
+
export * from "./retention-strategy.js";
|
|
4
|
+
export * from "./LogArchiveService.js";
|
|
5
|
+
export * from "./strategies/util.js";
|
|
6
|
+
export * from "./strategies/SizeLogArchiveStrategy.js";
|
|
7
|
+
export * from "./strategies/CronLogArchiveStrategy.js";
|
|
8
|
+
export * from "./strategies/CountLogRetentionStrategy.js";
|
|
9
|
+
export * from "./strategies/AgeLogRetentionStrategy.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/archive/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./context.js";
|
|
2
|
+
export * from "./archive-strategy.js";
|
|
3
|
+
export * from "./retention-strategy.js";
|
|
4
|
+
export * from "./LogArchiveService.js";
|
|
5
|
+
export * from "./strategies/util.js";
|
|
6
|
+
export * from "./strategies/SizeLogArchiveStrategy.js";
|
|
7
|
+
export * from "./strategies/CronLogArchiveStrategy.js";
|
|
8
|
+
export * from "./strategies/CountLogRetentionStrategy.js";
|
|
9
|
+
export * from "./strategies/AgeLogRetentionStrategy.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/archive/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Log } from "@spinajs/log-common";
|
|
2
|
+
import { ILogArchiveContext } from "./context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Retention policy for archived log files. Decides WHICH archives are deleted
|
|
5
|
+
* after a rotation ( eg. keep newest N, drop older than maxAge ).
|
|
6
|
+
*
|
|
7
|
+
* Retention strategies are composable - a file target applies a LIST of them in
|
|
8
|
+
* sequence, so count + age can be combined. Each concrete strategy is
|
|
9
|
+
* `@NewInstance()` to keep per-target state isolated, mirroring the fs cleanup
|
|
10
|
+
* strategies.
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class LogRetentionStrategy {
|
|
13
|
+
protected Logger: Log;
|
|
14
|
+
/**
|
|
15
|
+
* Removes archives from `ctx.archiveDir` according to the strategy policy.
|
|
16
|
+
*
|
|
17
|
+
* @param ctx archive context of the file target
|
|
18
|
+
*/
|
|
19
|
+
abstract prune(ctx: ILogArchiveContext): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Single prune guarded against errors so one failing retention strategy never
|
|
22
|
+
* aborts the rest of the retention list or the rotation routine.
|
|
23
|
+
*/
|
|
24
|
+
safePrune(ctx: ILogArchiveContext): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=retention-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention-strategy.d.ts","sourceRoot":"","sources":["../../../src/archive/retention-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;GAQG;AACH,8BAAsB,oBAAoB;IAExC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;IAEtB;;;;OAIG;aACa,KAAK,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7D;;;OAGG;IACU,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAO/D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Logger, Log } from "@spinajs/log-common";
|
|
11
|
+
/**
|
|
12
|
+
* Retention policy for archived log files. Decides WHICH archives are deleted
|
|
13
|
+
* after a rotation ( eg. keep newest N, drop older than maxAge ).
|
|
14
|
+
*
|
|
15
|
+
* Retention strategies are composable - a file target applies a LIST of them in
|
|
16
|
+
* sequence, so count + age can be combined. Each concrete strategy is
|
|
17
|
+
* `@NewInstance()` to keep per-target state isolated, mirroring the fs cleanup
|
|
18
|
+
* strategies.
|
|
19
|
+
*/
|
|
20
|
+
export class LogRetentionStrategy {
|
|
21
|
+
/**
|
|
22
|
+
* Single prune guarded against errors so one failing retention strategy never
|
|
23
|
+
* aborts the rest of the retention list or the rotation routine.
|
|
24
|
+
*/
|
|
25
|
+
async safePrune(ctx) {
|
|
26
|
+
try {
|
|
27
|
+
await this.prune(ctx);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
this.Logger.warn(`Log retention for target ${ctx.options.path} failed: ${err.message}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
__decorate([
|
|
35
|
+
Logger("LogFileTarget"),
|
|
36
|
+
__metadata("design:type", Log)
|
|
37
|
+
], LogRetentionStrategy.prototype, "Logger", void 0);
|
|
38
|
+
//# sourceMappingURL=retention-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention-strategy.js","sourceRoot":"","sources":["../../../src/archive/retention-strategy.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;;;;;;GAQG;AACH,MAAM,OAAgB,oBAAoB;IAWxC;;;OAGG;IACI,KAAK,CAAC,SAAS,CAAC,GAAuB;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,CAAC,OAAO,CAAC,IAAI,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;CACF;AApBW;IADT,MAAM,CAAC,eAAe,CAAC;8BACN,GAAG;oDAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LogRetentionStrategy } from "../retention-strategy.js";
|
|
2
|
+
import { ILogArchiveContext } from "../context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Deletes archives older than `maxAge` seconds ( from the logger.file config
|
|
5
|
+
* defaults ). Age is taken from the archive modification time.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AgeLogRetentionStrategy extends LogRetentionStrategy {
|
|
8
|
+
prune(ctx: ILogArchiveContext): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=AgeLogRetentionStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgeLogRetentionStrategy.d.ts","sourceRoot":"","sources":["../../../../src/archive/strategies/AgeLogRetentionStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD;;;GAGG;AACH,qBAEa,uBAAwB,SAAQ,oBAAoB;IAClD,KAAK,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB3D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
8
|
+
import { DateTime } from "luxon";
|
|
9
|
+
import { LogRetentionStrategy } from "../retention-strategy.js";
|
|
10
|
+
import { listArchives } from "./util.js";
|
|
11
|
+
/**
|
|
12
|
+
* Deletes archives older than `maxAge` seconds ( from the logger.file config
|
|
13
|
+
* defaults ). Age is taken from the archive modification time.
|
|
14
|
+
*/
|
|
15
|
+
let AgeLogRetentionStrategy = class AgeLogRetentionStrategy extends LogRetentionStrategy {
|
|
16
|
+
async prune(ctx) {
|
|
17
|
+
// maxAge is always populated from the config defaults ( see logger.file )
|
|
18
|
+
const maxAge = ctx.options.maxAge;
|
|
19
|
+
const now = DateTime.now();
|
|
20
|
+
const archives = await listArchives(ctx);
|
|
21
|
+
for (const a of archives) {
|
|
22
|
+
const ts = a.stat.ModifiedTime;
|
|
23
|
+
if (!ts || !ts.isValid) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (now.diff(ts, "seconds").seconds > maxAge) {
|
|
27
|
+
try {
|
|
28
|
+
this.Logger.trace(`Deleting archive ${a.path} ( older than ${maxAge}s )`);
|
|
29
|
+
await ctx.archiveFs.rm(a.path);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
this.Logger.warn(`Cannot delete archive ${a.path}: ${err.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
AgeLogRetentionStrategy = __decorate([
|
|
39
|
+
Injectable(LogRetentionStrategy),
|
|
40
|
+
NewInstance()
|
|
41
|
+
], AgeLogRetentionStrategy);
|
|
42
|
+
export { AgeLogRetentionStrategy };
|
|
43
|
+
//# sourceMappingURL=AgeLogRetentionStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgeLogRetentionStrategy.js","sourceRoot":"","sources":["../../../../src/archive/strategies/AgeLogRetentionStrategy.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;GAGG;AAGI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,oBAAoB;IACxD,KAAK,CAAC,KAAK,CAAC,GAAuB;QACxC,0EAA0E;QAC1E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAgB,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAE3B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAEzC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;YAC/B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,iBAAiB,MAAM,KAAK,CAAC,CAAC;oBAC1E,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAxBY,uBAAuB;IAFnC,UAAU,CAAC,oBAAoB,CAAC;IAChC,WAAW,EAAE;GACD,uBAAuB,CAwBnC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LogRetentionStrategy } from "../retention-strategy.js";
|
|
2
|
+
import { ILogArchiveContext } from "../context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Keeps the newest N archives ( `maxArchiveFiles`, from the logger.file config
|
|
5
|
+
* defaults ) and deletes the oldest, ordered by modification time.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CountLogRetentionStrategy extends LogRetentionStrategy {
|
|
8
|
+
prune(ctx: ILogArchiveContext): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=CountLogRetentionStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CountLogRetentionStrategy.d.ts","sourceRoot":"","sources":["../../../../src/archive/strategies/CountLogRetentionStrategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD;;;GAGG;AACH,qBAEa,yBAA0B,SAAQ,oBAAoB;IACpD,KAAK,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB3D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
8
|
+
import { LogRetentionStrategy } from "../retention-strategy.js";
|
|
9
|
+
import { listArchives } from "./util.js";
|
|
10
|
+
/**
|
|
11
|
+
* Keeps the newest N archives ( `maxArchiveFiles`, from the logger.file config
|
|
12
|
+
* defaults ) and deletes the oldest, ordered by modification time.
|
|
13
|
+
*/
|
|
14
|
+
let CountLogRetentionStrategy = class CountLogRetentionStrategy extends LogRetentionStrategy {
|
|
15
|
+
async prune(ctx) {
|
|
16
|
+
const keep = ctx.options.maxArchiveFiles;
|
|
17
|
+
// newest last ( ascending by ModifiedTime )
|
|
18
|
+
const archives = await listArchives(ctx);
|
|
19
|
+
if (archives.length <= keep) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const toDelete = archives.slice(0, archives.length - keep);
|
|
23
|
+
for (const a of toDelete) {
|
|
24
|
+
try {
|
|
25
|
+
this.Logger.trace(`Deleting archive ${a.path} ( over count limit ${keep} )`);
|
|
26
|
+
await ctx.archiveFs.rm(a.path);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
this.Logger.warn(`Cannot delete archive ${a.path}: ${err.message}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
CountLogRetentionStrategy = __decorate([
|
|
35
|
+
Injectable(LogRetentionStrategy),
|
|
36
|
+
NewInstance()
|
|
37
|
+
], CountLogRetentionStrategy);
|
|
38
|
+
export { CountLogRetentionStrategy };
|
|
39
|
+
//# sourceMappingURL=CountLogRetentionStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CountLogRetentionStrategy.js","sourceRoot":"","sources":["../../../../src/archive/strategies/CountLogRetentionStrategy.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;GAGG;AAGI,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,oBAAoB;IAC1D,KAAK,CAAC,KAAK,CAAC,GAAuB;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;QAEzC,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAE3D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,uBAAuB,IAAI,IAAI,CAAC,CAAC;gBAC7E,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAtBY,yBAAyB;IAFrC,UAAU,CAAC,oBAAoB,CAAC;IAChC,WAAW,EAAE;GACD,yBAAyB,CAsBrC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CronJob } from "cron";
|
|
2
|
+
import { LogArchiveStrategy } from "../archive-strategy.js";
|
|
3
|
+
import { ILogArchiveContext } from "../context.js";
|
|
4
|
+
/**
|
|
5
|
+
* Rotates the active log file on a cron schedule taken from the `rotate`
|
|
6
|
+
* option ( 6-field with seconds supported, eg. '0 0 1 * * *' = 1am daily ).
|
|
7
|
+
* The expression is required - creation fails without it, like fs
|
|
8
|
+
* CronTempCleanupStrategy.
|
|
9
|
+
*/
|
|
10
|
+
export declare class CronLogArchiveStrategy extends LogArchiveStrategy {
|
|
11
|
+
protected cronJob: CronJob | null;
|
|
12
|
+
start(ctx: ILogArchiveContext): void;
|
|
13
|
+
stop(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=CronLogArchiveStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CronLogArchiveStrategy.d.ts","sourceRoot":"","sources":["../../../../src/archive/strategies/CronLogArchiveStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;GAKG;AACH,qBAEa,sBAAuB,SAAQ,kBAAkB;IAC5D,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAQ;IAElC,KAAK,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI;IA0BpC,IAAI,IAAI,IAAI;CAMpB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
8
|
+
import { InvalidOption } from "@spinajs/exceptions";
|
|
9
|
+
import { CronJob } from "cron";
|
|
10
|
+
import { LogArchiveStrategy } from "../archive-strategy.js";
|
|
11
|
+
/**
|
|
12
|
+
* Rotates the active log file on a cron schedule taken from the `rotate`
|
|
13
|
+
* option ( 6-field with seconds supported, eg. '0 0 1 * * *' = 1am daily ).
|
|
14
|
+
* The expression is required - creation fails without it, like fs
|
|
15
|
+
* CronTempCleanupStrategy.
|
|
16
|
+
*/
|
|
17
|
+
let CronLogArchiveStrategy = class CronLogArchiveStrategy extends LogArchiveStrategy {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
this.cronJob = null;
|
|
21
|
+
}
|
|
22
|
+
start(ctx) {
|
|
23
|
+
if (!ctx.options.rotate) {
|
|
24
|
+
throw new InvalidOption(`Log target ${ctx.options.path} uses CronLogArchiveStrategy but 'rotate' cron expression is not set`);
|
|
25
|
+
}
|
|
26
|
+
this.stop();
|
|
27
|
+
// CronJob ctor throws on invalid expression - wrap for a clearer error
|
|
28
|
+
try {
|
|
29
|
+
this.cronJob = new CronJob(ctx.options.rotate, () => {
|
|
30
|
+
void this.triggerRotation(ctx);
|
|
31
|
+
}, null, true);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
throw new InvalidOption(`Log target ${ctx.options.path} has invalid rotate cron expression '${ctx.options.rotate}': ${err.message}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
stop() {
|
|
38
|
+
if (this.cronJob) {
|
|
39
|
+
this.cronJob.stop();
|
|
40
|
+
this.cronJob = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
CronLogArchiveStrategy = __decorate([
|
|
45
|
+
Injectable(LogArchiveStrategy),
|
|
46
|
+
NewInstance()
|
|
47
|
+
], CronLogArchiveStrategy);
|
|
48
|
+
export { CronLogArchiveStrategy };
|
|
49
|
+
//# sourceMappingURL=CronLogArchiveStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CronLogArchiveStrategy.js","sourceRoot":"","sources":["../../../../src/archive/strategies/CronLogArchiveStrategy.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D;;;;;GAKG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,kBAAkB;IAAvD;;QACK,YAAO,GAAmB,IAAI,CAAC;IAkC3C,CAAC;IAhCQ,KAAK,CAAC,GAAuB;QAClC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,aAAa,CACrB,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,sEAAsE,CACrG,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,uEAAuE;QACvE,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CACxB,GAAG,CAAC,OAAO,CAAC,MAAM,EAClB,GAAG,EAAE;gBACH,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC,EACD,IAAI,EACJ,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CACrB,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,wCAAwC,GAAG,CAAC,OAAO,CAAC,MAAM,MAAO,GAAa,CAAC,OAAO,EAAE,CACvH,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,IAAI;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;CACF,CAAA;AAnCY,sBAAsB;IAFlC,UAAU,CAAC,kBAAkB,CAAC;IAC9B,WAAW,EAAE;GACD,sBAAsB,CAmClC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LogArchiveStrategy } from "../archive-strategy.js";
|
|
2
|
+
import { ILogArchiveContext } from "../context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Rotates the active log file when its size exceeds `maxSize`, checked every
|
|
5
|
+
* `archiveInterval` seconds ( both resolved from the logger.file config
|
|
6
|
+
* defaults, overridable per target ).
|
|
7
|
+
*/
|
|
8
|
+
export declare class SizeLogArchiveStrategy extends LogArchiveStrategy {
|
|
9
|
+
protected timer: NodeJS.Timeout | null;
|
|
10
|
+
start(ctx: ILogArchiveContext): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Rotates only when the active file exists AND is over the size limit. A
|
|
14
|
+
* missing active file ( nothing written yet ) is not an error.
|
|
15
|
+
*/
|
|
16
|
+
protected check(ctx: ILogArchiveContext): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=SizeLogArchiveStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SizeLogArchiveStrategy.d.ts","sourceRoot":"","sources":["../../../../src/archive/strategies/SizeLogArchiveStrategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;GAIG;AACH,qBAEa,sBAAuB,SAAQ,kBAAkB;IAC5D,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;IAEvC,KAAK,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI;IAWpC,IAAI,IAAI,IAAI;IAOnB;;;OAGG;cACa,KAAK,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB9D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
8
|
+
import { LogArchiveStrategy } from "../archive-strategy.js";
|
|
9
|
+
/**
|
|
10
|
+
* Rotates the active log file when its size exceeds `maxSize`, checked every
|
|
11
|
+
* `archiveInterval` seconds ( both resolved from the logger.file config
|
|
12
|
+
* defaults, overridable per target ).
|
|
13
|
+
*/
|
|
14
|
+
let SizeLogArchiveStrategy = class SizeLogArchiveStrategy extends LogArchiveStrategy {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.timer = null;
|
|
18
|
+
}
|
|
19
|
+
start(ctx) {
|
|
20
|
+
// never leak a previous timer on repeated start
|
|
21
|
+
this.stop();
|
|
22
|
+
const interval = ctx.options.archiveInterval * 1000;
|
|
23
|
+
this.timer = setInterval(() => {
|
|
24
|
+
void this.check(ctx);
|
|
25
|
+
}, interval);
|
|
26
|
+
}
|
|
27
|
+
stop() {
|
|
28
|
+
if (this.timer) {
|
|
29
|
+
clearInterval(this.timer);
|
|
30
|
+
this.timer = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Rotates only when the active file exists AND is over the size limit. A
|
|
35
|
+
* missing active file ( nothing written yet ) is not an error.
|
|
36
|
+
*/
|
|
37
|
+
async check(ctx) {
|
|
38
|
+
try {
|
|
39
|
+
if (!(await ctx.fs.exists(ctx.activePath))) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const stat = await ctx.fs.stat(ctx.activePath);
|
|
43
|
+
const maxSize = ctx.options.maxSize;
|
|
44
|
+
const size = stat.Size ?? 0;
|
|
45
|
+
if (size > maxSize) {
|
|
46
|
+
this.Logger.trace(`Active log ${ctx.activePath} size ${size} exceeds ${maxSize}, rotating`);
|
|
47
|
+
await this.triggerRotation(ctx);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
this.Logger.warn(`Size check for log target ${ctx.activePath} failed: ${err.message}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
SizeLogArchiveStrategy = __decorate([
|
|
56
|
+
Injectable(LogArchiveStrategy),
|
|
57
|
+
NewInstance()
|
|
58
|
+
], SizeLogArchiveStrategy);
|
|
59
|
+
export { SizeLogArchiveStrategy };
|
|
60
|
+
//# sourceMappingURL=SizeLogArchiveStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SizeLogArchiveStrategy.js","sourceRoot":"","sources":["../../../../src/archive/strategies/SizeLogArchiveStrategy.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D;;;;GAIG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,kBAAkB;IAAvD;;QACK,UAAK,GAA0B,IAAI,CAAC;IA0ChD,CAAC;IAxCQ,KAAK,CAAC,GAAuB;QAClC,gDAAgD;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;QAEpD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;IAEM,IAAI;QACT,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,KAAK,CAAC,GAAuB;QAC3C,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;YAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,UAAU,SAAS,IAAI,YAAY,OAAO,YAAY,CAAC,CAAC;gBAC5F,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,GAAG,CAAC,UAAU,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;CACF,CAAA;AA3CY,sBAAsB;IAFlC,UAAU,CAAC,kBAAkB,CAAC;IAC9B,WAAW,EAAE;GACD,sBAAsB,CA2ClC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { IStat } from "@spinajs/fs";
|
|
2
|
+
import { ILogArchiveContext } from "../context.js";
|
|
3
|
+
/**
|
|
4
|
+
* Prefix every archived file name gets. Only files under `archiveDir` starting
|
|
5
|
+
* with this prefix are considered archives ( so the active log dir, when it is
|
|
6
|
+
* the same directory as the archive dir, is not touched ).
|
|
7
|
+
*/
|
|
8
|
+
export declare const ARCHIVE_PREFIX = "archived_";
|
|
9
|
+
export interface IArchiveEntry {
|
|
10
|
+
/**
|
|
11
|
+
* Path of the archive relative to `archiveFs` base path.
|
|
12
|
+
*/
|
|
13
|
+
path: string;
|
|
14
|
+
stat: IStat;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Joins archive dir + file name with forward slashes. fs providers resolve
|
|
18
|
+
* paths against their base path and normalize separators, so a posix join keeps
|
|
19
|
+
* behaviour identical across platforms.
|
|
20
|
+
*/
|
|
21
|
+
export declare function archivePath(ctx: ILogArchiveContext, name: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Lists archive files in `ctx.archiveDir` on `ctx.archiveFs`, sorted ascending
|
|
24
|
+
* by modification time ( oldest first, newest last ). Only files carrying the
|
|
25
|
+
* archive prefix are returned; directories and unrelated files are ignored.
|
|
26
|
+
*/
|
|
27
|
+
export declare function listArchives(ctx: ILogArchiveContext): Promise<IArchiveEntry[]>;
|
|
28
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/archive/strategies/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;CACb;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAmCpF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { posix } from "path";
|
|
2
|
+
/**
|
|
3
|
+
* Prefix every archived file name gets. Only files under `archiveDir` starting
|
|
4
|
+
* with this prefix are considered archives ( so the active log dir, when it is
|
|
5
|
+
* the same directory as the archive dir, is not touched ).
|
|
6
|
+
*/
|
|
7
|
+
export const ARCHIVE_PREFIX = "archived_";
|
|
8
|
+
/**
|
|
9
|
+
* Joins archive dir + file name with forward slashes. fs providers resolve
|
|
10
|
+
* paths against their base path and normalize separators, so a posix join keeps
|
|
11
|
+
* behaviour identical across platforms.
|
|
12
|
+
*/
|
|
13
|
+
export function archivePath(ctx, name) {
|
|
14
|
+
return ctx.archiveDir ? posix.join(ctx.archiveDir, name) : name;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Lists archive files in `ctx.archiveDir` on `ctx.archiveFs`, sorted ascending
|
|
18
|
+
* by modification time ( oldest first, newest last ). Only files carrying the
|
|
19
|
+
* archive prefix are returned; directories and unrelated files are ignored.
|
|
20
|
+
*/
|
|
21
|
+
export async function listArchives(ctx) {
|
|
22
|
+
let names;
|
|
23
|
+
try {
|
|
24
|
+
names = await ctx.archiveFs.list(ctx.archiveDir || "/");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// archive dir may not exist yet ( nothing rotated )
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const entries = [];
|
|
31
|
+
for (const name of names) {
|
|
32
|
+
if (!name.startsWith(ARCHIVE_PREFIX)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const p = archivePath(ctx, name);
|
|
36
|
+
try {
|
|
37
|
+
const stat = await ctx.archiveFs.stat(p);
|
|
38
|
+
if (stat.IsDirectory) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
entries.push({ path: p, stat });
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// stat can fail on a file removed concurrently - skip it
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
entries.sort((a, b) => {
|
|
48
|
+
const at = a.stat.ModifiedTime?.toMillis() ?? 0;
|
|
49
|
+
const bt = b.stat.ModifiedTime?.toMillis() ?? 0;
|
|
50
|
+
return at - bt;
|
|
51
|
+
});
|
|
52
|
+
return entries;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/archive/strategies/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAG7B;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAU1C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAuB,EAAE,IAAY;IAC/D,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAuB;IACxD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,YAAY,EAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,YAAY,EAAM,MAAM,aAAa,CAAC;AAkC3D,qBACa,cAAe,SAAQ,YAAY;IACvC,SAAS,IAAI,IAAI;CAmCzB"}
|
package/lib/mjs/bootstrap.js
CHANGED
|
@@ -6,7 +6,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { Configuration } from "@spinajs/configuration";
|
|
8
8
|
import { Injectable, Bootstrapper, DI } from "@spinajs/di";
|
|
9
|
-
import { Log } from "@spinajs/log-common";
|
|
9
|
+
import { Log, setLogContextProvider } from "@spinajs/log-common";
|
|
10
|
+
import { LogContext, scalarContext } from "./context.js";
|
|
11
|
+
import { wirePerfScope } from "./perf.js";
|
|
10
12
|
import CONFIGURATION_SCHEMA from "./schemas/log.configuration.js";
|
|
11
13
|
const uncaughtExceptionHandler = (err) => {
|
|
12
14
|
// if we have configuration resolved, we can assume that logger can read configuration
|
|
@@ -32,15 +34,36 @@ const unhandledRejection = (reason, p) => {
|
|
|
32
34
|
console.error("Unhandled rejection: \n reason: " + reason.message + " \n stack:" + reason.stack);
|
|
33
35
|
}
|
|
34
36
|
};
|
|
37
|
+
// Guard so a double bootstrap ( eg. re-run in the same process ) does not
|
|
38
|
+
// register the beforeExit drain twice.
|
|
39
|
+
let beforeExitAttached = false;
|
|
35
40
|
let LogBotstrapper = class LogBotstrapper extends Bootstrapper {
|
|
36
41
|
bootstrap() {
|
|
37
42
|
DI.register(CONFIGURATION_SCHEMA).asValue("__configurationSchema__");
|
|
43
|
+
// Best-effort teardown drain: on a CLEAN process exit, force-flush every
|
|
44
|
+
// logger's targets so buffered File / Loki / OTLP entries are written out.
|
|
45
|
+
// beforeExit does NOT run on hard exits ( process.exit / signals / crashes ),
|
|
46
|
+
// so this only catches clean drains. Node-only ( guard mirrors
|
|
47
|
+
// internal-logger ); do not double-register.
|
|
48
|
+
if (!beforeExitAttached && typeof process !== "undefined" && typeof process.on === "function") {
|
|
49
|
+
beforeExitAttached = true;
|
|
50
|
+
process.on("beforeExit", () => {
|
|
51
|
+
void Log.flushAll();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Feed the ambient async-context store into every log entry ( merged at
|
|
55
|
+
// lowest precedence by createLogMessageObject ). LogContext resolves the
|
|
56
|
+
// same DI-singleton AsyncLocalStorage the http module runs per action, so
|
|
57
|
+
// logs inherit requestId / realIp / ... for free.
|
|
58
|
+
setLogContextProvider(() => scalarContext(LogContext.active()));
|
|
59
|
+
// Wire the per-request perf accumulator onto the same async store.
|
|
60
|
+
wirePerfScope();
|
|
38
61
|
// check if we run tests,
|
|
39
62
|
// hook for uncaughtException causes to not showing
|
|
40
63
|
// mocha errors in console
|
|
41
64
|
if (!process.env.TESTING) {
|
|
42
65
|
process.removeListener("uncaughtException", uncaughtExceptionHandler);
|
|
43
|
-
process.removeListener("unhandledRejection",
|
|
66
|
+
process.removeListener("unhandledRejection", unhandledRejection);
|
|
44
67
|
process.on("uncaughtException", uncaughtExceptionHandler);
|
|
45
68
|
process.on("unhandledRejection", unhandledRejection);
|
|
46
69
|
}
|
package/lib/mjs/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAElE,MAAM,wBAAwB,GAAG,CAAC,GAAU,EAAE,EAAE;IAC9C,sFAAsF;IACtF,wBAAwB;IACxB,wBAAwB;IACxB,IAAI,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,GAAG,CAAC,OAAO,GAAG,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAa,EAAE,CAAmB,EAAE,EAAE;IAChE,sFAAsF;IACtF,wBAAwB;IACxB,wBAAwB;IACxB,IAAI,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,MAAe,EAAE,mCAAmC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,MAAM,CAAC,OAAO,GAAG,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnG,CAAC;AACH,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAElE,MAAM,wBAAwB,GAAG,CAAC,GAAU,EAAE,EAAE;IAC9C,sFAAsF;IACtF,wBAAwB;IACxB,wBAAwB;IACxB,IAAI,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,GAAG,CAAC,OAAO,GAAG,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAa,EAAE,CAAmB,EAAE,EAAE;IAChE,sFAAsF;IACtF,wBAAwB;IACxB,wBAAwB;IACxB,IAAI,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,MAAe,EAAE,mCAAmC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,MAAM,CAAC,OAAO,GAAG,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnG,CAAC;AACH,CAAC,CAAC;AAEF,0EAA0E;AAC1E,uCAAuC;AACvC,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAGxB,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,YAAY;IACvC,SAAS;QACd,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAErE,yEAAyE;QACzE,2EAA2E;QAC3E,8EAA8E;QAC9E,+DAA+D;QAC/D,6CAA6C;QAC7C,IAAI,CAAC,kBAAkB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YAC9F,kBAAkB,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;gBAC5B,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,kDAAkD;QAClD,qBAAqB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEhE,mEAAmE;QACnE,aAAa,EAAE,CAAC;QAEhB,yBAAyB;QACzB,mDAAmD;QACnD,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;YACtE,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;YAEjE,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;YAC1D,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAA;AApCY,cAAc;IAD1B,UAAU,CAAC,YAAY,CAAC;GACZ,cAAc,CAoC1B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort caller-frame capture for the `${callsite}` layout variable.
|
|
3
|
+
*
|
|
4
|
+
* NLog gates stack-trace capture behind `StackTraceUsage` so that logging is
|
|
5
|
+
* zero-cost unless a target's layout actually references the caller. This
|
|
6
|
+
* mirrors that: {@link FrameworkLogger} only calls {@link captureCallsite}
|
|
7
|
+
* when some target's layout references `${callsite}`, so the `new Error()`
|
|
8
|
+
* ( the only cost here ) is never constructed otherwise.
|
|
9
|
+
*
|
|
10
|
+
* The parser is intentionally defensive - it must NEVER throw. Browser stack
|
|
11
|
+
* formats vary and V8's format is not guaranteed, so an unparseable stack just
|
|
12
|
+
* yields `""` rather than crashing a log call.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Walk the current stack and return the first frame OUTSIDE the log package -
|
|
16
|
+
* i.e. the user's call site - as `"basename:line"` ( e.g. `service.ts:42` ).
|
|
17
|
+
*
|
|
18
|
+
* Internal frames belonging to the logger itself ( `log.ts`, `callsite.ts`,
|
|
19
|
+
* the `log-common` package, `wrapWrite`, `createLogMessageObject` ) are skipped
|
|
20
|
+
* so the returned frame is the caller of `log.info(...)` / `log.error(...)`.
|
|
21
|
+
*
|
|
22
|
+
* Returns `""` when no frame can be parsed ( no stack, or an unrecognized
|
|
23
|
+
* stack format ). Best-effort by design.
|
|
24
|
+
*/
|
|
25
|
+
export declare function captureCallsite(): string;
|
|
26
|
+
//# sourceMappingURL=callsite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callsite.d.ts","sourceRoot":"","sources":["../../src/callsite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAmCxC"}
|