@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
|
@@ -1,265 +1,228 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
7
|
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
10
|
};
|
|
44
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
-
};
|
|
47
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
12
|
exports.FileTarget = void 0;
|
|
49
|
-
/* eslint-disable security/detect-object-injection */
|
|
50
13
|
const os_1 = require("os");
|
|
51
|
-
const
|
|
52
|
-
const path = __importStar(require("path"));
|
|
53
|
-
const glob_1 = __importDefault(require("glob"));
|
|
54
|
-
const zlib = __importStar(require("zlib"));
|
|
55
|
-
const stream_1 = require("stream");
|
|
14
|
+
const path_1 = require("path");
|
|
56
15
|
const configuration_1 = require("@spinajs/configuration");
|
|
57
16
|
const exceptions_1 = require("@spinajs/exceptions");
|
|
58
17
|
const di_1 = require("@spinajs/di");
|
|
59
18
|
const log_common_1 = require("@spinajs/log-common");
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
19
|
+
const LogArchiveService_js_1 = require("../archive/LogArchiveService.js");
|
|
20
|
+
const log_js_1 = require("../config/log.js");
|
|
21
|
+
/**
|
|
22
|
+
* Writes log messages to a file through the @spinajs/fs abstraction.
|
|
23
|
+
*
|
|
24
|
+
* Messages are buffered in memory and flushed as a single batched append,
|
|
25
|
+
* either when the buffer reaches `maxBufferSize` or on a periodic flush tick.
|
|
26
|
+
* Rotation / archiving / retention is delegated to {@link LogArchiveService}.
|
|
27
|
+
*
|
|
28
|
+
* A single async write-lock ( a promise-chain mutex ) serializes every flush
|
|
29
|
+
* and every rotation, so a rename can never race an in-flight append.
|
|
30
|
+
*
|
|
31
|
+
* PerInstanceCheck: multiple file targets can point at different files, but two
|
|
32
|
+
* targets with the same name share one writer.
|
|
33
|
+
*/
|
|
69
34
|
let FileTarget = class FileTarget extends log_common_1.LogTarget {
|
|
70
35
|
constructor() {
|
|
71
36
|
super(...arguments);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
this.
|
|
37
|
+
/**
|
|
38
|
+
* Directory ( relative to ArchiveFs ) archives are stored in.
|
|
39
|
+
*/
|
|
40
|
+
this.ArchiveDir = "";
|
|
41
|
+
/**
|
|
42
|
+
* Set true when the queue drops overflow, so the drop warning is emitted ONCE
|
|
43
|
+
* per overflow episode and reset when a batch appends successfully.
|
|
44
|
+
*/
|
|
45
|
+
this.Overflowed = false;
|
|
46
|
+
/**
|
|
47
|
+
* Promise-chain mutex tail. Every critical section ( flush, rotation ) chains
|
|
48
|
+
* onto this so they run strictly one at a time.
|
|
49
|
+
*/
|
|
50
|
+
this.WriteLock = Promise.resolve();
|
|
51
|
+
this.Disposed = false;
|
|
76
52
|
}
|
|
77
53
|
__checkInstance__(creationOptions) {
|
|
78
54
|
return this.Options.name === creationOptions[0].name;
|
|
79
55
|
}
|
|
80
56
|
resolve() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
this.
|
|
89
|
-
if (!this.
|
|
90
|
-
throw new exceptions_1.InvalidOption(
|
|
91
|
-
}
|
|
92
|
-
if (!fs_1.default.existsSync(this.LogDirPath)) {
|
|
93
|
-
fs_1.default.mkdirSync(this.LogDirPath, { recursive: true });
|
|
94
|
-
}
|
|
95
|
-
if (this.ArchiveDirPath) {
|
|
96
|
-
if (!fs_1.default.existsSync(this.ArchiveDirPath)) {
|
|
97
|
-
fs_1.default.mkdirSync(this.ArchiveDirPath, { recursive: true });
|
|
98
|
-
}
|
|
57
|
+
// Defaults come from the shipped `logger.file` config ( discoverable and
|
|
58
|
+
// user-overridable like every other spinajs package ). LOG_FILE_DEFAULTS is
|
|
59
|
+
// the same object the config ships and is used as a last-resort fallback for
|
|
60
|
+
// environments where the config file was not discovered ( eg. some tests ).
|
|
61
|
+
// Merge order ( lowest to highest ): constant < config < per-target options.
|
|
62
|
+
const cfg = di_1.DI.get(configuration_1.Configuration);
|
|
63
|
+
const fileDefaults = cfg ? cfg.get("logger.file", {}) : {};
|
|
64
|
+
this.Options.options = Object.assign({}, log_js_1.LOG_FILE_DEFAULTS, fileDefaults, this.Options.options);
|
|
65
|
+
if (!this.Options.options.path) {
|
|
66
|
+
throw new exceptions_1.InvalidOption(`FileTarget ${this.Options.name} requires a 'path' option`);
|
|
99
67
|
}
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
68
|
+
// start async init - fs resolution and dir creation cannot run in a sync
|
|
69
|
+
// SyncService.resolve, so writes buffer until Ready settles
|
|
70
|
+
this.Ready = this.init();
|
|
71
|
+
this.Ready.catch((err) => {
|
|
72
|
+
this.HasError = true;
|
|
73
|
+
this.Error = err;
|
|
74
|
+
this.Log.error(err, `Cannot initialize file target ${this.Options.name}`);
|
|
75
|
+
});
|
|
76
|
+
// BatchQueue owns accumulation, the periodic flush tick ( unref'd, so a
|
|
77
|
+
// pending flush never keeps the process alive ) and the hard queue cap. The
|
|
78
|
+
// batched append itself runs in append() under the write-lock.
|
|
79
|
+
this.Queue = new log_common_1.BatchQueue({
|
|
80
|
+
maxBatch: this.Options.options.maxBufferSize,
|
|
81
|
+
maxQueue: this.Options.options.maxQueueSize,
|
|
82
|
+
flushIntervalMs: this.Options.options.flushInterval ?? log_js_1.LOG_FILE_DEFAULTS.flushInterval,
|
|
83
|
+
onFlush: (batch) => this.append(batch),
|
|
84
|
+
onOverflow: (droppedItems) => {
|
|
85
|
+
// droppedItems here are already-formatted STRINGS, so we cannot
|
|
86
|
+
// reconstruct the original ILogEntry to route via OnDropped. File
|
|
87
|
+
// overflow stays warn-only ( count from droppedItems.length ). The
|
|
88
|
+
// drop-hook ( D ) targets the network-primary -> file-fallback case,
|
|
89
|
+
// not File-as-primary drops.
|
|
90
|
+
if (!this.Overflowed) {
|
|
91
|
+
this.Overflowed = true;
|
|
92
|
+
this.Log.warn(`File target ${this.Options.name} buffer exceeded ${this.Options.options.maxQueueSize} messages, dropped ${droppedItems.length} oldest buffered messages.`);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
});
|
|
126
96
|
super.resolve();
|
|
127
97
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Resolves fs providers, ensures directories exist, builds the archive
|
|
100
|
+
* context and starts the archive service.
|
|
101
|
+
*/
|
|
102
|
+
async init() {
|
|
103
|
+
const o = this.Options.options;
|
|
104
|
+
// o.fs is always populated from LOG_FILE_DEFAULTS ( see resolve() )
|
|
105
|
+
this.Fs = di_1.DI.resolve("__file_provider__", [o.fs]);
|
|
106
|
+
this.ArchiveFs = o.archiveFs ? di_1.DI.resolve("__file_provider__", [o.archiveFs]) : this.Fs;
|
|
107
|
+
// path is relative to the fs provider base path; ensure its directory exists
|
|
108
|
+
const logDir = path_1.posix.dirname(this.activePath());
|
|
109
|
+
if (logDir && logDir !== ".") {
|
|
110
|
+
await this.Fs.mkdir(logDir);
|
|
132
111
|
}
|
|
133
|
-
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
this.
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// stop flush timer
|
|
152
|
-
clearInterval(this.FlushTimer);
|
|
153
|
-
// write all messages from buffer
|
|
154
|
-
this.WriteBuffer = [...this.WriteBuffer, ...this.Buffer];
|
|
155
|
-
this.flush();
|
|
112
|
+
// archivePath ( when set ) is a directory relative to the archive fs; when
|
|
113
|
+
// not set, archives live in the same directory as the active log
|
|
114
|
+
this.ArchiveDir = o.archivePath ? this.normalize((0, configuration_1.format)(null, o.archivePath)) : logDir === "." ? "" : logDir;
|
|
115
|
+
if (this.ArchiveDir) {
|
|
116
|
+
await this.ArchiveFs.mkdir(this.ArchiveDir);
|
|
117
|
+
}
|
|
118
|
+
this.Context = {
|
|
119
|
+
fs: this.Fs,
|
|
120
|
+
archiveFs: this.ArchiveFs,
|
|
121
|
+
activePath: this.activePath(),
|
|
122
|
+
archiveDir: this.ArchiveDir,
|
|
123
|
+
options: o,
|
|
124
|
+
logger: this.Log,
|
|
125
|
+
rotate: () => this.ArchiveService.rotate(this.Context),
|
|
126
|
+
withWriteLock: (fn) => this.withWriteLock(fn),
|
|
127
|
+
};
|
|
128
|
+
this.ArchiveService = await di_1.DI.resolve(LogArchiveService_js_1.LogArchiveService);
|
|
129
|
+
await this.ArchiveService.start(this.Context);
|
|
156
130
|
}
|
|
157
131
|
async write(data) {
|
|
158
|
-
if (!this.Options.enabled) {
|
|
132
|
+
if (!this.Options.enabled || this.Disposed) {
|
|
159
133
|
return;
|
|
160
134
|
}
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
//
|
|
164
|
-
|
|
165
|
-
|
|
135
|
+
const entry = this.formatEntry(data);
|
|
136
|
+
// enqueue awaits the batched append when maxBatch ( = maxBufferSize ) is
|
|
137
|
+
// reached, preserving the old "await flush when full" back-pressure
|
|
138
|
+
await this.Queue.enqueue(entry);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Builds the single line appended for one entry. Overridable so subclasses can
|
|
142
|
+
* change ONLY the per-entry serialization while reusing the whole FileTarget
|
|
143
|
+
* pipeline ( batched append, write-lock, rotation, retention, zip ). The base
|
|
144
|
+
* renders the configured string `layout`.
|
|
145
|
+
*/
|
|
146
|
+
formatEntry(data) {
|
|
147
|
+
return (0, configuration_1.format)(data.Variables, this.Options.layout);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Flushes any buffered messages. Delegates to the queue's forceFlush so a
|
|
151
|
+
* caller ( eg. dispose or a test ) can await the drain.
|
|
152
|
+
*/
|
|
153
|
+
async flush() {
|
|
154
|
+
await this.Queue.forceFlush();
|
|
155
|
+
}
|
|
156
|
+
forceFlush() {
|
|
157
|
+
return this.Queue ? this.Queue.forceFlush() : Promise.resolve();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Appends one batch as a single write, guarded by the write-lock ( the SAME
|
|
161
|
+
* lock rotation uses, so a rename can never race an append ). On failure the
|
|
162
|
+
* batch is requeued at the FRONT so nothing is lost ( never-drop, bounded by
|
|
163
|
+
* maxQueue ). This ALWAYS resolves ( never rejects ) so queue.shutdown() -
|
|
164
|
+
* driven by dispose() - never rejects.
|
|
165
|
+
*/
|
|
166
|
+
async append(batch) {
|
|
167
|
+
await this.Ready.catch(() => {
|
|
168
|
+
/* init failed - error already recorded, skip appending */
|
|
169
|
+
});
|
|
170
|
+
if (!this.Fs) {
|
|
171
|
+
// init failed / fs unavailable - keep the batch for a later retry
|
|
172
|
+
this.Queue.requeueFront(batch);
|
|
166
173
|
return;
|
|
167
174
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
name: f,
|
|
185
|
-
stat: fs_1.default.statSync(f),
|
|
186
|
-
};
|
|
187
|
-
})
|
|
188
|
-
.sort((a, b) => a.stat.mtime.getTime() - b.stat.mtime.getTime());
|
|
189
|
-
const lFiles = glob_1.default
|
|
190
|
-
.sync(path.join(this.LogDirPath, `*${ext}`).replace(/\\/g, "/"))
|
|
191
|
-
.map((f) => {
|
|
192
|
-
return {
|
|
193
|
-
name: f,
|
|
194
|
-
stat: fs_1.default.statSync(f),
|
|
195
|
-
};
|
|
196
|
-
})
|
|
197
|
-
.sort((a, b) => a.stat.mtime.getTime() - b.stat.mtime.getTime());
|
|
198
|
-
// clear archived files above limit
|
|
199
|
-
if (aFiles.length > this.Options.options.maxArchiveFiles) {
|
|
200
|
-
for (let i = 0; i < aFiles.length - this.Options.options.maxArchiveFiles; i++) {
|
|
201
|
-
fs_1.default.unlink(aFiles[i].name, (err) => {
|
|
202
|
-
if (err) {
|
|
203
|
-
this.Log.error(err, `Cannot delete archived file at path ${aFiles[i - 1].name}`);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
this.Log.info(`Deleted archived file at path ${aFiles[i].name}`);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
175
|
+
await this.withWriteLock(async () => {
|
|
176
|
+
const path = this.activePath();
|
|
177
|
+
try {
|
|
178
|
+
await this.Fs.append(path, batch.join(os_1.EOL) + os_1.EOL);
|
|
179
|
+
this.HasError = false;
|
|
180
|
+
this.Error = null;
|
|
181
|
+
// batch appended successfully - allow the next overflow episode to warn again
|
|
182
|
+
this.Overflowed = false;
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
this.HasError = true;
|
|
186
|
+
this.Error = err;
|
|
187
|
+
this.Log.error(err, `Cannot write log messages to file target at path ${path}`);
|
|
188
|
+
// restore the batch in front of anything queued meanwhile - never drop.
|
|
189
|
+
// the queue caps at maxQueue, dropping the oldest if the sink stays down.
|
|
190
|
+
this.Queue.requeueFront(batch);
|
|
209
191
|
}
|
|
210
|
-
}
|
|
211
|
-
// now move log files that are above limited file size or old
|
|
212
|
-
const filesToArchive = lFiles.filter((x) => {
|
|
213
|
-
return x.stat.size > this.Options.options.maxSize || lFiles.indexOf(x) <= lFiles.length - 2;
|
|
214
192
|
});
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
this.Log.info(`Succesyfully compressed archive log at path ${zippedPath}`);
|
|
250
|
-
fs_1.default.unlink(archPath, (err) => {
|
|
251
|
-
if (err) {
|
|
252
|
-
this.Log.error(err, `Cannot delete archived log after compression at path ${archPath}`);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
this.ArchiveStatus = FileTargetStatus.IDLE;
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
this.ArchiveStatus = FileTargetStatus.IDLE;
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
}
|
|
193
|
+
}
|
|
194
|
+
async dispose() {
|
|
195
|
+
this.Disposed = true;
|
|
196
|
+
// stops the flush timer and performs a final flush of anything buffered
|
|
197
|
+
await this.Queue.shutdown();
|
|
198
|
+
this.ArchiveService?.stop();
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Runs `fn` under the shared write-lock. Flush and rotation both go through
|
|
202
|
+
* here, so a rename can never overlap an append.
|
|
203
|
+
*/
|
|
204
|
+
withWriteLock(fn) {
|
|
205
|
+
const run = this.WriteLock.then(() => fn());
|
|
206
|
+
// keep the chain alive on failure so the lock never deadlocks
|
|
207
|
+
this.WriteLock = run.catch(() => undefined);
|
|
208
|
+
return run;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Active log path relative to the fs provider base path. Recomputed each call
|
|
212
|
+
* so dynamic ( eg. date-based ) paths work.
|
|
213
|
+
*/
|
|
214
|
+
activePath() {
|
|
215
|
+
const p = (0, configuration_1.format)({ logger: this.Options.name }, this.Options.options.path);
|
|
216
|
+
return this.normalize(p);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Normalizes a configured path to forward slashes and strips a leading
|
|
220
|
+
* separator. Paths are interpreted relative to the fs provider base path -
|
|
221
|
+
* the provider itself sandboxes and resolves them, so we only canonicalize
|
|
222
|
+
* separators here.
|
|
223
|
+
*/
|
|
224
|
+
normalize(p) {
|
|
225
|
+
return p.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
263
226
|
}
|
|
264
227
|
};
|
|
265
228
|
exports.FileTarget = FileTarget;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileTarget.js","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileTarget.js","sourceRoot":"","sources":["../../../src/targets/FileTarget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ILogEntry } from "@spinajs/log-common";
|
|
2
|
+
import { FileTarget } from "./FileTarget.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emits newline-delimited JSON ( NDJSON ) to a file through the FileTarget
|
|
5
|
+
* pipeline ( batched append, write-lock, rotation, retention, zip ): one
|
|
6
|
+
* structured JSON object per log entry so log collectors ( Loki, Elastic,
|
|
7
|
+
* Datadog ) can index fields directly rather than regex-parsing a layout.
|
|
8
|
+
*
|
|
9
|
+
* It subclasses the concrete FileTarget and overrides ONLY the per-entry
|
|
10
|
+
* serialization, reusing IFileTargetOptions unchanged. The inherited `layout`
|
|
11
|
+
* option is intentionally IGNORED ( JSON, not a string layout ). `time` is
|
|
12
|
+
* event-time: it is stamped in formatEntry, which runs in write() before the
|
|
13
|
+
* entry is buffered, so it reflects when the event was logged, not when the
|
|
14
|
+
* batch is flushed to disk.
|
|
15
|
+
*/
|
|
16
|
+
export declare class JsonFileTarget extends FileTarget {
|
|
17
|
+
protected formatEntry(data: ILogEntry): string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=JsonFileTarget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonFileTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/JsonFileTarget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA2C,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,qBAEa,cAAe,SAAQ,UAAU;IAC5C,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;CAW/C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.JsonFileTarget = void 0;
|
|
10
|
+
const di_1 = require("@spinajs/di");
|
|
11
|
+
const log_common_1 = require("@spinajs/log-common");
|
|
12
|
+
const FileTarget_js_1 = require("./FileTarget.js");
|
|
13
|
+
/**
|
|
14
|
+
* Emits newline-delimited JSON ( NDJSON ) to a file through the FileTarget
|
|
15
|
+
* pipeline ( batched append, write-lock, rotation, retention, zip ): one
|
|
16
|
+
* structured JSON object per log entry so log collectors ( Loki, Elastic,
|
|
17
|
+
* Datadog ) can index fields directly rather than regex-parsing a layout.
|
|
18
|
+
*
|
|
19
|
+
* It subclasses the concrete FileTarget and overrides ONLY the per-entry
|
|
20
|
+
* serialization, reusing IFileTargetOptions unchanged. The inherited `layout`
|
|
21
|
+
* option is intentionally IGNORED ( JSON, not a string layout ). `time` is
|
|
22
|
+
* event-time: it is stamped in formatEntry, which runs in write() before the
|
|
23
|
+
* entry is buffered, so it reflects when the event was logged, not when the
|
|
24
|
+
* batch is flushed to disk.
|
|
25
|
+
*/
|
|
26
|
+
let JsonFileTarget = class JsonFileTarget extends FileTarget_js_1.FileTarget {
|
|
27
|
+
formatEntry(data) {
|
|
28
|
+
// data.Variables already carries level ( uppercase string ), logger,
|
|
29
|
+
// message, a structured error ( from the serializer registry ) and any
|
|
30
|
+
// merged fields. safeStringify / JSON.stringify naturally omit undefined
|
|
31
|
+
// ( eg. error when absent ).
|
|
32
|
+
return (0, log_common_1.safeStringify)({
|
|
33
|
+
time: new Date().toISOString(),
|
|
34
|
+
severityNumber: log_common_1.LogLevelToSeverityNumber[data.Level],
|
|
35
|
+
...data.Variables,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.JsonFileTarget = JsonFileTarget;
|
|
40
|
+
exports.JsonFileTarget = JsonFileTarget = __decorate([
|
|
41
|
+
(0, di_1.PerInstanceCheck)(),
|
|
42
|
+
(0, di_1.Injectable)("JsonFileTarget")
|
|
43
|
+
], JsonFileTarget);
|
|
44
|
+
//# sourceMappingURL=JsonFileTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonFileTarget.js","sourceRoot":"","sources":["../../../src/targets/JsonFileTarget.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oCAA2D;AAC3D,oDAAyF;AAEzF,mDAA6C;AAE7C;;;;;;;;;;;;GAYG;AAGI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,0BAAU;IAClC,WAAW,CAAC,IAAe;QACnC,qEAAqE;QACrE,uEAAuE;QACvE,yEAAyE;QACzE,6BAA6B;QAC7B,OAAO,IAAA,0BAAa,EAAC;YACnB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,cAAc,EAAE,qCAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;YACpD,GAAG,IAAI,CAAC,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAZY,wCAAc;yBAAd,cAAc;IAF1B,IAAA,qBAAgB,GAAE;IAClB,IAAA,eAAU,EAAC,gBAAgB,CAAC;GAChB,cAAc,CAY1B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ICommonTargetOptions, ILogEntry, LogTarget } from "@spinajs/log-common";
|
|
2
|
+
/**
|
|
3
|
+
* Emits NDJSON ( newline-delimited JSON ) to stdout for machine ingestion:
|
|
4
|
+
* one structured JSON object per log entry instead of a formatted string, so
|
|
5
|
+
* log collectors ( Loki, Elastic, Datadog, container stdout ) can index fields
|
|
6
|
+
* directly rather than regex-parsing a layout.
|
|
7
|
+
*
|
|
8
|
+
* The inherited `layout` option is intentionally IGNORED - JSON is not a string
|
|
9
|
+
* layout. `time` is stamped at write; because this target is synchronous /
|
|
10
|
+
* unbuffered that is ~event time. An event-time-stamped, file-backed variant
|
|
11
|
+
* will come with the batching base in a later phase.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Options for {@link JsonTarget}.
|
|
15
|
+
*/
|
|
16
|
+
export interface IJsonTargetOptions extends ICommonTargetOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Which stream to write to. A single stream is the 12-factor norm for machine
|
|
19
|
+
* logs. Default is "stdout".
|
|
20
|
+
*/
|
|
21
|
+
stream?: "stdout" | "stderr";
|
|
22
|
+
}
|
|
23
|
+
export declare class JsonTarget extends LogTarget<IJsonTargetOptions> {
|
|
24
|
+
constructor(options: IJsonTargetOptions);
|
|
25
|
+
write(data: ILogEntry): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=JsonTarget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonTarget.d.ts","sourceRoot":"","sources":["../../../src/targets/JsonTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAA4B,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAG1H;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC9B;AAED,qBAEa,UAAW,SAAQ,SAAS,CAAC,kBAAkB,CAAC;gBAC/C,OAAO,EAAE,kBAAkB;IAMhC,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;CAoBpC"}
|