@spinajs/log 2.0.481 → 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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { DI } from "@spinajs/di";
|
|
3
|
+
/**
|
|
4
|
+
* Ambient log context backed by `node:async_hooks` AsyncLocalStorage.
|
|
5
|
+
*
|
|
6
|
+
* It deliberately resolves the SAME DI-singleton AsyncLocalStorage instance the
|
|
7
|
+
* @spinajs/http module runs per action ( `als.run(req.storage, ...)` ). Because
|
|
8
|
+
* that instance is a shared DI singleton, any log emitted anywhere inside a
|
|
9
|
+
* request automatically inherits the request store ( requestId, realIp, ... )
|
|
10
|
+
* with zero threading — the log package wires `setLogContextProvider(() =>
|
|
11
|
+
* LogContext.active())` so `createLogMessageObject` merges it at lowest
|
|
12
|
+
* precedence.
|
|
13
|
+
*
|
|
14
|
+
* The store type is a plain `Record<string, unknown>` — a superset of http's
|
|
15
|
+
* `IActionLocalStoregeContext` — so log stays independent of http.
|
|
16
|
+
*/
|
|
17
|
+
class LogContextImpl {
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the shared AsyncLocalStorage from DI. Resolved as a bare concrete
|
|
20
|
+
* class it is a shared singleton, so this is the very instance http drives per
|
|
21
|
+
* action. We deliberately do NOT cache the reference: DI returns the same
|
|
22
|
+
* singleton on every call ( cheap lookup ), and NOT caching keeps LogContext
|
|
23
|
+
* consistent with the current DI instance even if the container is reset /
|
|
24
|
+
* re-registered ( a stale cached reference would silently diverge — e.g. after
|
|
25
|
+
* a `DI.clearCache()` the store written via a freshly-resolved instance would
|
|
26
|
+
* be invisible here ).
|
|
27
|
+
*/
|
|
28
|
+
storage() {
|
|
29
|
+
return DI.resolve(AsyncLocalStorage);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The current ambient store, or an empty object when outside any context.
|
|
33
|
+
*/
|
|
34
|
+
active() {
|
|
35
|
+
return this.storage().getStore() ?? {};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run `fn` with `vars` merged ( copy-on-write ) onto the current store, so
|
|
39
|
+
* nesting accumulates and http's already-set fields ( eg. requestId ) survive.
|
|
40
|
+
*/
|
|
41
|
+
with(vars, fn) {
|
|
42
|
+
return this.storage().run({ ...this.active(), ...vars }, fn);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Mutate the current store in place ( late-bound values ). No-op when called
|
|
46
|
+
* outside any active context.
|
|
47
|
+
*/
|
|
48
|
+
set(key, value) {
|
|
49
|
+
const store = this.storage().getStore();
|
|
50
|
+
if (store) {
|
|
51
|
+
store[key] = value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Capture the current store and re-attach it whenever the returned function is
|
|
56
|
+
* invoked. Use to carry context across detached callbacks / EventEmitter
|
|
57
|
+
* handlers that would otherwise lose it.
|
|
58
|
+
*/
|
|
59
|
+
bind(fn) {
|
|
60
|
+
const store = this.storage().getStore();
|
|
61
|
+
if (!store) {
|
|
62
|
+
return fn;
|
|
63
|
+
}
|
|
64
|
+
return (...args) => this.storage().run(store, () => fn(...args));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Shared ambient log context. See {@link LogContextImpl}.
|
|
69
|
+
*/
|
|
70
|
+
export const LogContext = new LogContextImpl();
|
|
71
|
+
/**
|
|
72
|
+
* Projects only primitive scalar values ( string / number / boolean / bigint )
|
|
73
|
+
* from an ambient-context object, dropping objects, arrays, Dates, functions,
|
|
74
|
+
* null and undefined. Ambient context is meant for correlation ids ( requestId,
|
|
75
|
+
* traceId, ... ) that belong on every log line; structured payloads should be
|
|
76
|
+
* passed explicitly per call ( log.info({ obj }, ... ) ), not via ambient context.
|
|
77
|
+
*/
|
|
78
|
+
export function scalarContext(ctx) {
|
|
79
|
+
const out = {};
|
|
80
|
+
for (const [k, v] of Object.entries(ctx)) {
|
|
81
|
+
const t = typeof v;
|
|
82
|
+
if (t === "string" || t === "number" || t === "boolean" || t === "bigint") {
|
|
83
|
+
out[k] = v;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC;;;;;;;;;;;;;GAaG;AACH,MAAM,cAAc;IAClB;;;;;;;;;OASG;IACK,OAAO;QACb,OAAO,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAA+C,CAAC;IACrF,CAAC;IAED;;OAEG;IACI,MAAM;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACI,IAAI,CAAI,IAA6B,EAAE,EAAW;QACvD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,GAAW,EAAE,KAAc;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAyB,EAAkB;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,GAAG,IAAO,EAAK,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAA4B;IACxD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1E,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ILogEntry, ILogFilterOptions, LogFilter, LogLevel, StrToLogLevel } from "@spinajs/log-common";
|
|
2
|
+
type LevelName = keyof typeof StrToLogLevel;
|
|
3
|
+
/**
|
|
4
|
+
* Options for {@link LevelFilter}.
|
|
5
|
+
*/
|
|
6
|
+
export interface ILevelFilterOptions extends ILogFilterOptions {
|
|
7
|
+
/** Lowest level to keep ( inclusive ). Entries below are dropped. */
|
|
8
|
+
min?: LevelName;
|
|
9
|
+
/** Highest level to keep ( inclusive ). Entries above are dropped. */
|
|
10
|
+
max?: LevelName;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Level-window filter. Keeps an entry only when its numeric {@link LogLevel} is
|
|
14
|
+
* within `[min, max]` ( both inclusive, both optional ), otherwise drops it.
|
|
15
|
+
* Useful for routing eg. only warn..error to a given target via a filter.
|
|
16
|
+
*/
|
|
17
|
+
export declare class LevelFilter extends LogFilter {
|
|
18
|
+
protected min: LogLevel;
|
|
19
|
+
protected max: LogLevel;
|
|
20
|
+
constructor(options?: ILevelFilterOptions);
|
|
21
|
+
apply(entry: ILogEntry): ILogEntry | null;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=LevelFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LevelFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/LevelFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGvG,KAAK,SAAS,GAAG,MAAM,OAAO,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,qEAAqE;IACrE,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,sEAAsE;IACtE,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAEa,WAAY,SAAQ,SAAS;IACxC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC;IACxB,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC;gBAEZ,OAAO,CAAC,EAAE,mBAAmB;IAMlC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;CAMjD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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 { LogFilter, LogLevel, StrToLogLevel } from "@spinajs/log-common";
|
|
11
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
12
|
+
/**
|
|
13
|
+
* Level-window filter. Keeps an entry only when its numeric {@link LogLevel} is
|
|
14
|
+
* within `[min, max]` ( both inclusive, both optional ), otherwise drops it.
|
|
15
|
+
* Useful for routing eg. only warn..error to a given target via a filter.
|
|
16
|
+
*/
|
|
17
|
+
let LevelFilter = class LevelFilter extends LogFilter {
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super(options);
|
|
20
|
+
this.min = options?.min !== undefined ? StrToLogLevel[options.min] : LogLevel.Trace;
|
|
21
|
+
this.max = options?.max !== undefined ? StrToLogLevel[options.max] : LogLevel.Security;
|
|
22
|
+
}
|
|
23
|
+
apply(entry) {
|
|
24
|
+
if (entry.Level < this.min || entry.Level > this.max) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return entry;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
LevelFilter = __decorate([
|
|
31
|
+
Injectable("LevelFilter"),
|
|
32
|
+
NewInstance(),
|
|
33
|
+
__metadata("design:paramtypes", [Object])
|
|
34
|
+
], LevelFilter);
|
|
35
|
+
export { LevelFilter };
|
|
36
|
+
//# sourceMappingURL=LevelFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LevelFilter.js","sourceRoot":"","sources":["../../../src/filters/LevelFilter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AActD;;;;GAIG;AAGI,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,SAAS;IAIxC,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpF,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzF,CAAC;IAEM,KAAK,CAAC,KAAgB;QAC3B,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAhBY,WAAW;IAFvB,UAAU,CAAC,aAAa,CAAC;IACzB,WAAW,EAAE;;GACD,WAAW,CAgBvB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ILogEntry, ILogFilterOptions, LogFilter } from "@spinajs/log-common";
|
|
2
|
+
/**
|
|
3
|
+
* Options for {@link MatchFilter}.
|
|
4
|
+
*/
|
|
5
|
+
export interface IMatchFilterOptions extends ILogFilterOptions {
|
|
6
|
+
/** Regex source tested against the chosen field. Required. */
|
|
7
|
+
pattern: string;
|
|
8
|
+
/** Variable field to test. Default "message". */
|
|
9
|
+
field?: string;
|
|
10
|
+
/** "keep" ( default ) keeps on match, drops otherwise; "drop" drops on match. */
|
|
11
|
+
mode?: "keep" | "drop";
|
|
12
|
+
/** RegExp flags ( eg. "i" ). */
|
|
13
|
+
flags?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Regex keep/drop filter. Builds a RegExp from `pattern`/`flags` and tests it
|
|
17
|
+
* against `String(entry.Variables[field])` ( field defaults to "message" ).
|
|
18
|
+
* In "keep" mode the entry is kept only on a match; in "drop" mode it is
|
|
19
|
+
* dropped on a match. An invalid pattern degrades to a no-op ( pass-through )
|
|
20
|
+
* and warns ONCE so a bad config never silently swallows or drops everything.
|
|
21
|
+
*/
|
|
22
|
+
export declare class MatchFilter extends LogFilter {
|
|
23
|
+
protected regex: RegExp | null;
|
|
24
|
+
protected field: string;
|
|
25
|
+
protected mode: "keep" | "drop";
|
|
26
|
+
protected warned: boolean;
|
|
27
|
+
constructor(options?: IMatchFilterOptions);
|
|
28
|
+
apply(entry: ILogEntry): ILogEntry | null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=MatchFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatchFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/MatchFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,qBAEa,WAAY,SAAQ,SAAS;IACxC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,SAAS,CAAC,MAAM,UAAS;gBAEb,OAAO,CAAC,EAAE,mBAAmB;IAqBlC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;CAejD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 { LogFilter } from "@spinajs/log-common";
|
|
11
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
12
|
+
/**
|
|
13
|
+
* Regex keep/drop filter. Builds a RegExp from `pattern`/`flags` and tests it
|
|
14
|
+
* against `String(entry.Variables[field])` ( field defaults to "message" ).
|
|
15
|
+
* In "keep" mode the entry is kept only on a match; in "drop" mode it is
|
|
16
|
+
* dropped on a match. An invalid pattern degrades to a no-op ( pass-through )
|
|
17
|
+
* and warns ONCE so a bad config never silently swallows or drops everything.
|
|
18
|
+
*/
|
|
19
|
+
let MatchFilter = class MatchFilter extends LogFilter {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
super(options);
|
|
22
|
+
this.regex = null;
|
|
23
|
+
this.warned = false;
|
|
24
|
+
this.field = options?.field ?? "message";
|
|
25
|
+
this.mode = options?.mode ?? "keep";
|
|
26
|
+
try {
|
|
27
|
+
if (options?.pattern === undefined) {
|
|
28
|
+
throw new Error("MatchFilter requires a `pattern` option");
|
|
29
|
+
}
|
|
30
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
31
|
+
this.regex = new RegExp(options.pattern, options.flags);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
this.regex = null;
|
|
35
|
+
// no-op on bad config; warn once to the raw console ( never re-enter the
|
|
36
|
+
// logger pipeline ) so a broken filter is visible but harmless.
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.warn(`MatchFilter: invalid pattern "${options?.pattern}" - filter disabled ( no-op ). ${err.message}`);
|
|
39
|
+
this.warned = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
apply(entry) {
|
|
43
|
+
// invalid / missing pattern => no-op pass-through
|
|
44
|
+
if (!this.regex) {
|
|
45
|
+
return entry;
|
|
46
|
+
}
|
|
47
|
+
const value = String(entry.Variables[this.field]);
|
|
48
|
+
const matched = this.regex.test(value);
|
|
49
|
+
if (this.mode === "drop") {
|
|
50
|
+
return matched ? null : entry;
|
|
51
|
+
}
|
|
52
|
+
// keep mode
|
|
53
|
+
return matched ? entry : null;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
MatchFilter = __decorate([
|
|
57
|
+
Injectable("MatchFilter"),
|
|
58
|
+
NewInstance(),
|
|
59
|
+
__metadata("design:paramtypes", [Object])
|
|
60
|
+
], MatchFilter);
|
|
61
|
+
export { MatchFilter };
|
|
62
|
+
//# sourceMappingURL=MatchFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatchFilter.js","sourceRoot":"","sources":["../../../src/filters/MatchFilter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgC,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgBtD;;;;;;GAMG;AAGI,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,SAAS;IAMxC,YAAY,OAA6B;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QANP,UAAK,GAAkB,IAAI,CAAC;QAG5B,WAAM,GAAG,KAAK,CAAC;QAIvB,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC;QAEpC,IAAI,CAAC;YACH,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YACD,8DAA8D;YAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,yEAAyE;YACzE,gEAAgE;YAChE,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,EAAE,OAAO,kCAAmC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1H,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,KAAgB;QAC3B,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAChC,CAAC;QACD,YAAY;QACZ,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;CACF,CAAA;AA1CY,WAAW;IAFvB,UAAU,CAAC,aAAa,CAAC;IACzB,WAAW,EAAE;;GACD,WAAW,CA0CvB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ILogEntry, ILogFilterOptions, LogFilter } from "@spinajs/log-common";
|
|
2
|
+
/**
|
|
3
|
+
* Options for {@link RateLimitFilter}.
|
|
4
|
+
*/
|
|
5
|
+
export interface IRateLimitFilterOptions extends ILogFilterOptions {
|
|
6
|
+
/** Max entries kept per window. Required. */
|
|
7
|
+
limit: number;
|
|
8
|
+
/** Fixed window length in SECONDS. Required. */
|
|
9
|
+
intervalSeconds: number;
|
|
10
|
+
/** Variable field used to bucket the limit ( eg. per-logger ). Global if unset. */
|
|
11
|
+
key?: string;
|
|
12
|
+
}
|
|
13
|
+
interface IWindowRecord {
|
|
14
|
+
count: number;
|
|
15
|
+
windowStart: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Fixed-window rate limiter. Keeps at most `limit` entries per `intervalSeconds`
|
|
19
|
+
* window, bucketed by `entry.Variables[key]` when `key` is given ( else a single
|
|
20
|
+
* global bucket ). Overflow entries within a window are DROPPED; the counter
|
|
21
|
+
* resets when the window elapses. The bucket map is self-pruning ( stale windows
|
|
22
|
+
* dropped on access ) so memory stays bounded. Clock is injectable for tests.
|
|
23
|
+
*/
|
|
24
|
+
export declare class RateLimitFilter extends LogFilter {
|
|
25
|
+
protected now: () => number;
|
|
26
|
+
protected limit: number;
|
|
27
|
+
protected intervalMs: number;
|
|
28
|
+
protected keyField?: string;
|
|
29
|
+
protected windows: Map<string, IWindowRecord>;
|
|
30
|
+
constructor(options?: IRateLimitFilterOptions, now?: () => number);
|
|
31
|
+
protected keyOf(entry: ILogEntry): string;
|
|
32
|
+
apply(entry: ILogEntry): ILogEntry | null;
|
|
33
|
+
/** Drops windows whose interval has fully elapsed so the map stays bounded. */
|
|
34
|
+
protected prune(now: number): void;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=RateLimitFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/RateLimitFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;;;;;GAMG;AACH,qBAEa,eAAgB,SAAQ,SAAS;IAMG,SAAS,CAAC,GAAG,EAAE,MAAM,MAAM;IAL1E,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAa;gBAE9C,OAAO,CAAC,EAAE,uBAAuB,EAAY,GAAG,GAAE,MAAM,MAAyB;IAO7F,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM;IAOlC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;IAqBhD,+EAA+E;IAC/E,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAOnC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 { LogFilter } from "@spinajs/log-common";
|
|
11
|
+
import { Injectable, NewInstance } from "@spinajs/di";
|
|
12
|
+
const GLOBAL_KEY = "__global__";
|
|
13
|
+
/**
|
|
14
|
+
* Fixed-window rate limiter. Keeps at most `limit` entries per `intervalSeconds`
|
|
15
|
+
* window, bucketed by `entry.Variables[key]` when `key` is given ( else a single
|
|
16
|
+
* global bucket ). Overflow entries within a window are DROPPED; the counter
|
|
17
|
+
* resets when the window elapses. The bucket map is self-pruning ( stale windows
|
|
18
|
+
* dropped on access ) so memory stays bounded. Clock is injectable for tests.
|
|
19
|
+
*/
|
|
20
|
+
let RateLimitFilter = class RateLimitFilter extends LogFilter {
|
|
21
|
+
constructor(options, now = () => Date.now()) {
|
|
22
|
+
super(options);
|
|
23
|
+
this.now = now;
|
|
24
|
+
this.windows = new Map();
|
|
25
|
+
this.limit = options?.limit ?? 0;
|
|
26
|
+
this.intervalMs = (options?.intervalSeconds ?? 0) * 1000;
|
|
27
|
+
this.keyField = options?.key;
|
|
28
|
+
}
|
|
29
|
+
keyOf(entry) {
|
|
30
|
+
if (!this.keyField) {
|
|
31
|
+
return GLOBAL_KEY;
|
|
32
|
+
}
|
|
33
|
+
return String(entry.Variables[this.keyField]);
|
|
34
|
+
}
|
|
35
|
+
apply(entry) {
|
|
36
|
+
const now = this.now();
|
|
37
|
+
const key = this.keyOf(entry);
|
|
38
|
+
const record = this.windows.get(key);
|
|
39
|
+
if (!record || now - record.windowStart >= this.intervalMs) {
|
|
40
|
+
// fresh window - start counting from this entry
|
|
41
|
+
this.windows.set(key, { count: 1, windowStart: now });
|
|
42
|
+
this.prune(now);
|
|
43
|
+
return entry;
|
|
44
|
+
}
|
|
45
|
+
if (record.count < this.limit) {
|
|
46
|
+
record.count++;
|
|
47
|
+
return entry;
|
|
48
|
+
}
|
|
49
|
+
// window full - drop
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/** Drops windows whose interval has fully elapsed so the map stays bounded. */
|
|
53
|
+
prune(now) {
|
|
54
|
+
for (const [k, r] of this.windows) {
|
|
55
|
+
if (now - r.windowStart >= this.intervalMs) {
|
|
56
|
+
this.windows.delete(k);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
RateLimitFilter = __decorate([
|
|
62
|
+
Injectable("RateLimitFilter"),
|
|
63
|
+
NewInstance(),
|
|
64
|
+
__metadata("design:paramtypes", [Object, Function])
|
|
65
|
+
], RateLimitFilter);
|
|
66
|
+
export { RateLimitFilter };
|
|
67
|
+
//# sourceMappingURL=RateLimitFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitFilter.js","sourceRoot":"","sources":["../../../src/filters/RateLimitFilter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgC,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmBtD,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC;;;;;;GAMG;AAGI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,SAAS;IAM5C,YAAY,OAAiC,EAAY,MAAoB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC3F,KAAK,CAAC,OAAO,CAAC,CAAC;QADwC,QAAG,GAAH,GAAG,CAAiC;QAFnF,YAAO,GAA+B,IAAI,GAAG,EAAE,CAAC;QAIxD,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,eAAe,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,GAAG,CAAC;IAC/B,CAAC;IAES,KAAK,CAAC,KAAgB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,KAAgB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3D,gDAAgD;YAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qBAAqB;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IACrE,KAAK,CAAC,GAAW;QACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,GAAG,GAAG,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAjDY,eAAe;IAF3B,UAAU,CAAC,iBAAiB,CAAC;IAC7B,WAAW,EAAE;;GACD,eAAe,CAiD3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "@spinajs/log-common";
|
|
2
|
+
export * from "./targets/BlackHoleTarget.js";
|
|
3
|
+
export * from "./targets/BrowserConsoleTarget.js";
|
|
4
|
+
export * from "./targets/JsonTarget.js";
|
|
5
|
+
export * from "./targets/MemoryTarget.js";
|
|
6
|
+
export * from "./targets/wrappers/SplitGroupTarget.js";
|
|
7
|
+
export * from "./targets/wrappers/AutoFlushTarget.js";
|
|
8
|
+
export * from "./targets/wrappers/RetryingTarget.js";
|
|
9
|
+
export * from "./targets/wrappers/FallbackGroupTarget.js";
|
|
10
|
+
export * from "./filters/index.js";
|
|
11
|
+
export * from "./log.js";
|
|
12
|
+
export * from "./context.browser.js";
|
|
13
|
+
export * from "./traceparent.js";
|
|
14
|
+
//# sourceMappingURL=index.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAcA,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser entry ( "browser" exports condition ).
|
|
3
|
+
*
|
|
4
|
+
* Reuses the platform-free FrameworkLogger + DI factory registrations from
|
|
5
|
+
* log.js verbatim; swaps ColoredConsoleTarget ( chalk ) for BrowserConsoleTarget
|
|
6
|
+
* and omits FileTarget ( fs/zlib/stream ) and bootstrap.js ( process handlers ).
|
|
7
|
+
*
|
|
8
|
+
* Importing this module transitively imports @spinajs/configuration, which on
|
|
9
|
+
* the browser condition registers BrowserFrameworkConfiguration — so a single
|
|
10
|
+
* side-effect `import "@spinajs/log"` wires both log and configuration.
|
|
11
|
+
*/
|
|
12
|
+
import { setLogContextProvider } from "@spinajs/log-common";
|
|
13
|
+
import { LogContext, scalarContext } from "./context.browser.js";
|
|
14
|
+
export * from "@spinajs/log-common";
|
|
15
|
+
export * from "./targets/BlackHoleTarget.js";
|
|
16
|
+
export * from "./targets/BrowserConsoleTarget.js";
|
|
17
|
+
export * from "./targets/JsonTarget.js";
|
|
18
|
+
export * from "./targets/MemoryTarget.js";
|
|
19
|
+
export * from "./targets/wrappers/SplitGroupTarget.js";
|
|
20
|
+
export * from "./targets/wrappers/AutoFlushTarget.js";
|
|
21
|
+
export * from "./targets/wrappers/RetryingTarget.js";
|
|
22
|
+
export * from "./targets/wrappers/FallbackGroupTarget.js";
|
|
23
|
+
export * from "./filters/index.js";
|
|
24
|
+
export * from "./log.js";
|
|
25
|
+
export * from "./context.browser.js";
|
|
26
|
+
export * from "./traceparent.js";
|
|
27
|
+
// The browser build has no Bootstrapper flow wiring the seam, so register the
|
|
28
|
+
// synchronous fallback provider as an import side-effect.
|
|
29
|
+
setLogContextProvider(() => scalarContext(LogContext.active()));
|
|
30
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEjE,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AAEjC,8EAA8E;AAC9E,0DAA0D;AAC1D,qBAAqB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC"}
|
package/lib/mjs/index.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
export * from "@spinajs/log-common";
|
|
2
2
|
export * from "./targets/index.js";
|
|
3
|
+
export * from "./filters/index.js";
|
|
4
|
+
export * from "./archive/index.js";
|
|
3
5
|
export * from "./log.js";
|
|
6
|
+
export * from "./callsite.js";
|
|
4
7
|
export * from "./bootstrap.js";
|
|
8
|
+
export * from "./context.js";
|
|
9
|
+
export * from "./perf.js";
|
|
10
|
+
export * from "./perf/LogMetricSink.js";
|
|
11
|
+
export * from "./perf/measure.js";
|
|
12
|
+
export * from "./traceparent.js";
|
|
5
13
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/mjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/lib/mjs/index.js
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
export * from "@spinajs/log-common";
|
|
2
2
|
export * from "./targets/index.js";
|
|
3
|
+
export * from "./filters/index.js";
|
|
4
|
+
export * from "./archive/index.js";
|
|
3
5
|
export * from "./log.js";
|
|
6
|
+
export * from "./callsite.js";
|
|
4
7
|
export * from "./bootstrap.js";
|
|
8
|
+
export * from "./context.js";
|
|
9
|
+
export * from "./perf.js";
|
|
10
|
+
export * from "./perf/LogMetricSink.js";
|
|
11
|
+
export * from "./perf/measure.js";
|
|
12
|
+
export * from "./traceparent.js";
|
|
5
13
|
//# sourceMappingURL=index.js.map
|
package/lib/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/lib/mjs/log.d.ts
CHANGED
|
@@ -1,30 +1,89 @@
|
|
|
1
|
-
import { ILogEntry, Log } from "@spinajs/log-common";
|
|
1
|
+
import { ICommonTargetOptions, LogLevel, ILogEntry, StrToLogLevel, ILogRule, ITargetsOption, LogTarget, Log, LogFilter, ILogFilterOptions, ILogTargetDesc } from "@spinajs/log-common";
|
|
2
2
|
/**
|
|
3
3
|
* Default log implementation interface. Taken from bunyan. Feel free to implement own.
|
|
4
4
|
*/
|
|
5
5
|
export declare class FrameworkLogger extends Log {
|
|
6
6
|
Name: string;
|
|
7
7
|
protected Parent?: Log | undefined;
|
|
8
|
+
protected Filters: LogFilter[];
|
|
9
|
+
CaptureCallsite: boolean;
|
|
8
10
|
constructor(Name: string, variables?: Record<string, unknown>, Parent?: Log | undefined);
|
|
9
11
|
resolve(): void;
|
|
10
12
|
trace(message: string, ...args: any[]): void;
|
|
11
13
|
trace(err: Error, message: string, ...args: any[]): void;
|
|
14
|
+
trace(fields: object, message?: string, ...args: any[]): void;
|
|
12
15
|
debug(message: string, ...args: any[]): void;
|
|
13
16
|
debug(err: Error, message: string, ...args: any[]): void;
|
|
17
|
+
debug(fields: object, message?: string, ...args: any[]): void;
|
|
14
18
|
info(message: string, ...args: any[]): void;
|
|
15
19
|
info(err: Error, message: string, ...args: any[]): void;
|
|
20
|
+
info(fields: object, message?: string, ...args: any[]): void;
|
|
16
21
|
warn(message: string, ...args: any[]): void;
|
|
17
22
|
warn(err: Error, message: string, ...args: any[]): void;
|
|
23
|
+
warn(fields: object, message?: string, ...args: any[]): void;
|
|
18
24
|
error(message: string, ...args: any[]): void;
|
|
19
25
|
error(err: Error, message: string, ...args: any[]): void;
|
|
26
|
+
error(fields: object, message?: string, ...args: any[]): void;
|
|
20
27
|
fatal(message: string, ...args: any[]): void;
|
|
21
28
|
fatal(err: Error, message: string, ...args: any[]): void;
|
|
29
|
+
fatal(fields: object, message?: string, ...args: any[]): void;
|
|
22
30
|
security(message: string, ...args: any[]): void;
|
|
23
31
|
security(err: Error, message: string, ...args: any[]): void;
|
|
32
|
+
security(fields: object, message?: string, ...args: any[]): void;
|
|
24
33
|
success(message: string, ...args: any[]): void;
|
|
25
34
|
success(err: Error, message: string, ...args: any[]): void;
|
|
35
|
+
success(fields: object, message?: string, ...args: any[]): void;
|
|
26
36
|
write(entry: ILogEntry): Promise<PromiseSettledResult<void>[]>;
|
|
27
37
|
protected resolveLogTargets(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Build one {@link ILogTargetDesc } from a target definition, its level
|
|
40
|
+
* WINDOWS and a representative rule. Shared by config-time
|
|
41
|
+
* {@link resolveLogTargets } and the runtime {@link addTarget } so both
|
|
42
|
+
* resolve the target instance and its per-target filters the SAME way:
|
|
43
|
+
* the target class is resolved by its DI string `type`, and each per-target
|
|
44
|
+
* filter spec is resolved by its DI string `type` ( @NewInstance => per-use
|
|
45
|
+
* state ).
|
|
46
|
+
*/
|
|
47
|
+
protected buildTargetDesc(def: ITargetsOption, ranges: {
|
|
48
|
+
min: LogLevel;
|
|
49
|
+
max: LogLevel;
|
|
50
|
+
}[], rule: ILogRule): ILogTargetDesc;
|
|
51
|
+
/**
|
|
52
|
+
* Recompute the two cheap gates that {@link write } / the per-method
|
|
53
|
+
* isEnabled() guard rely on, so they stay correct after the target set
|
|
54
|
+
* changes at runtime ( {@link addTarget } / {@link removeTarget } ):
|
|
55
|
+
* - MinLevel = lowest `min` across all attached targets' windows ( floor
|
|
56
|
+
* Trace when there are none ), so a call below it is short-circuited.
|
|
57
|
+
* - CaptureCallsite = true iff some attached target's layout references
|
|
58
|
+
* ${callsite}, gating the caller-frame capture in wrapWrite.
|
|
59
|
+
*/
|
|
60
|
+
protected recomputeGates(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Attach a sink to THIS logger AT RUNTIME, without touching config. Resolves
|
|
63
|
+
* the target ( and its per-target filters ) exactly as config-time routing
|
|
64
|
+
* does, then recomputes the MinLevel / ${callsite} gates so dispatch stays
|
|
65
|
+
* correct. Returns the resolved instance, or `undefined` when nothing was
|
|
66
|
+
* attached ( `def.enabled === false` ).
|
|
67
|
+
*
|
|
68
|
+
* A level WINDOW `[opts.level ?? "trace", opts.maxLevel ?? security]` is
|
|
69
|
+
* applied ( same semantics as a routing rule's window ). Adding a target
|
|
70
|
+
* whose name already exists REPLACES the existing descriptor(s) ( the old
|
|
71
|
+
* instance is flushed first ) so a name is never duplicated.
|
|
72
|
+
*
|
|
73
|
+
* `opts.filters` are APPENDED to any `def.filters` ( def first, opts last ).
|
|
74
|
+
*/
|
|
75
|
+
addTarget(def: ITargetsOption, opts?: {
|
|
76
|
+
level?: keyof typeof StrToLogLevel;
|
|
77
|
+
maxLevel?: keyof typeof StrToLogLevel;
|
|
78
|
+
filters?: ILogFilterOptions[];
|
|
79
|
+
}): LogTarget<ICommonTargetOptions> | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Detach a runtime sink by its target `name`. Each matching descriptor's
|
|
82
|
+
* instance is force-flushed ( to drain buffered entries ) BEFORE removal - it
|
|
83
|
+
* is NOT disposed, since the instance may be shared / DI-owned. Recomputes the
|
|
84
|
+
* gates afterwards. No-op when no target with that name is attached.
|
|
85
|
+
*/
|
|
86
|
+
removeTarget(name: string): Promise<void>;
|
|
28
87
|
protected matchRulesToLogger(): void;
|
|
29
88
|
}
|
|
30
89
|
//# sourceMappingURL=log.d.ts.map
|
package/lib/mjs/log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/log.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/log.ts"],"names":[],"mappings":"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"}
|