logixia 1.13.3 → 2.0.4
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 +117 -44
- package/dist/async-context-B05ArHgM.mjs +134 -0
- package/dist/async-context-B05ArHgM.mjs.map +1 -0
- package/dist/async-context-DTQgi8f7.js +150 -0
- package/dist/async-context-DTQgi8f7.js.map +1 -0
- package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-BPbgjATu.mjs} +27 -15
- package/dist/azure-monitor.transport-BPbgjATu.mjs.map +1 -0
- package/dist/{azure-monitor.transport-BDFO4F-i.d.ts → azure-monitor.transport-C7kYyZUW.d.mts} +3 -6
- package/dist/azure-monitor.transport-C7kYyZUW.d.mts.map +1 -0
- package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-CwbOLZHB.js} +32 -20
- package/dist/azure-monitor.transport-CwbOLZHB.js.map +1 -0
- package/dist/{azure-monitor.transport-D5wQEH04.d.mts → azure-monitor.transport-DV03Z5P4.d.ts} +3 -6
- package/dist/azure-monitor.transport-DV03Z5P4.d.ts.map +1 -0
- package/dist/azure.d.mts +1 -2
- package/dist/azure.d.ts +1 -2
- package/dist/azure.js +3 -6
- package/dist/azure.mjs +1 -6
- package/dist/{batch-buffer-PGvSgbmd.mjs → batch-buffer-0fgLmIPn.mjs} +21 -7
- package/dist/batch-buffer-0fgLmIPn.mjs.map +1 -0
- package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-DT4gdXmf.js} +53 -40
- package/dist/batch-buffer-DT4gdXmf.js.map +1 -0
- package/dist/browser.d.mts +52 -23
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +52 -23
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +460 -62
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +461 -65
- package/dist/browser.mjs.map +1 -1
- package/dist/{nestjs-extras-ImbuDhs1.mjs → builder-D70z6kjj.mjs} +279 -965
- package/dist/builder-D70z6kjj.mjs.map +1 -0
- package/dist/{nestjs-extras-DnJ6vrIC.js → builder-M7NoaugM.js} +421 -1177
- package/dist/builder-M7NoaugM.js.map +1 -0
- package/dist/cli/index.js +86 -67
- package/dist/cloudwatch.d.mts +1 -2
- package/dist/cloudwatch.d.ts +1 -2
- package/dist/cloudwatch.js +3 -7
- package/dist/cloudwatch.mjs +1 -7
- package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-B2wKQFF7.js} +61 -36
- package/dist/cloudwatch.transport-B2wKQFF7.js.map +1 -0
- package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-BTvYfLs9.mjs} +54 -28
- package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +1 -0
- package/dist/{cloudwatch.transport-B00st6Xv.d.ts → cloudwatch.transport-Bf7L4I59.d.ts} +2 -6
- package/dist/cloudwatch.transport-Bf7L4I59.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-Blc7Gtxt.d.mts → cloudwatch.transport-Rj4yTpRn.d.mts} +2 -6
- package/dist/cloudwatch.transport-Rj4yTpRn.d.mts.map +1 -0
- package/dist/{coerce.utils-Cu6IUTgX.mjs → coerce.utils-B_rEudCn.mjs} +3 -4
- package/dist/{coerce.utils-Cu6IUTgX.mjs.map → coerce.utils-B_rEudCn.mjs.map} +1 -1
- package/dist/{coerce.utils-B-LilukN.js → coerce.utils-C1C5sIX0.js} +8 -10
- package/dist/{coerce.utils-B-LilukN.js.map → coerce.utils-C1C5sIX0.js.map} +1 -1
- package/dist/correlation.d.mts +13 -16
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +13 -16
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +58 -9
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +56 -6
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-CGuvT2R0.mjs} +5 -6
- package/dist/entry-fields-CGuvT2R0.mjs.map +1 -0
- package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-RLd1jCoR.js} +10 -12
- package/dist/entry-fields-RLd1jCoR.js.map +1 -0
- package/dist/gcp.d.mts +1 -2
- package/dist/gcp.d.ts +1 -2
- package/dist/gcp.js +3 -7
- package/dist/gcp.mjs +1 -7
- package/dist/{gcp.transport-m4fVw0b1.d.ts → gcp.transport-C5D72b1g.d.mts} +3 -6
- package/dist/gcp.transport-C5D72b1g.d.mts.map +1 -0
- package/dist/{gcp.transport-zzNyIoih.d.mts → gcp.transport-CFQfdAOK.d.ts} +3 -6
- package/dist/gcp.transport-CFQfdAOK.d.ts.map +1 -0
- package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-CGKopAhQ.mjs} +55 -16
- package/dist/gcp.transport-CGKopAhQ.mjs.map +1 -0
- package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-KZe9hCAR.js} +60 -22
- package/dist/gcp.transport-KZe9hCAR.js.map +1 -0
- package/dist/{index-nZEeCr3X.d.ts → index-DwozbmB4.d.ts} +3 -8
- package/dist/index-DwozbmB4.d.ts.map +1 -0
- package/dist/{index-BPwEisy4.d.mts → index-xqaJtAZn.d.mts} +3 -8
- package/dist/index-xqaJtAZn.d.mts.map +1 -0
- package/dist/index.d.mts +141 -203
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +140 -202
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +196 -381
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +145 -294
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-b0Vp4qrB.js +183 -0
- package/dist/internal-log-b0Vp4qrB.js.map +1 -0
- package/dist/internal-log-uCSd1PMc.mjs +142 -0
- package/dist/internal-log-uCSd1PMc.mjs.map +1 -0
- package/dist/logitron-logger-D2B75Oc7.d.ts +365 -0
- package/dist/logitron-logger-D2B75Oc7.d.ts.map +1 -0
- package/dist/logitron-logger-oEd6wNhf.d.mts +365 -0
- package/dist/logitron-logger-oEd6wNhf.d.mts.map +1 -0
- package/dist/middleware.d.mts +10 -12
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +10 -12
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +16 -47
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +13 -45
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +467 -10
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +467 -10
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +889 -43
- package/dist/nest.js.map +1 -0
- package/dist/nest.mjs +850 -9
- package/dist/nest.mjs.map +1 -0
- package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-C_fvIDv4.mjs} +44 -9
- package/dist/request-trace-C_fvIDv4.mjs.map +1 -0
- package/dist/{trace.utils-DpBOLDtq.js → request-trace-wTJdKp6-.js} +121 -77
- package/dist/request-trace-wTJdKp6-.js.map +1 -0
- package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
- package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-BMRl3EX3.mjs} +3 -4
- package/dist/safe-stringify-BMRl3EX3.mjs.map +1 -0
- package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-DLz1Kz3o.js} +23 -25
- package/dist/safe-stringify-DLz1Kz3o.js.map +1 -0
- package/dist/{search-CHUZPl0h.d.ts → search-BH33XhuU.d.mts} +2 -22
- package/dist/search-BH33XhuU.d.mts.map +1 -0
- package/dist/{search-DjXSn6v5.mjs → search-CWMVYC-R.mjs} +34 -41
- package/dist/search-CWMVYC-R.mjs.map +1 -0
- package/dist/{search-BfBzDIT9.d.mts → search-CazwyX5Z.d.ts} +2 -22
- package/dist/search-CazwyX5Z.d.ts.map +1 -0
- package/dist/{search-B0MH1SJJ.js → search-DUfWuzFP.js} +64 -71
- package/dist/search-DUfWuzFP.js.map +1 -0
- package/dist/search.d.mts +2 -4
- package/dist/search.d.ts +2 -4
- package/dist/search.js +3 -4
- package/dist/search.mjs +1 -4
- package/dist/secret-config-BegMLkYl.mjs +209 -0
- package/dist/secret-config-BegMLkYl.mjs.map +1 -0
- package/dist/secret-config-CBZBs0p1.js +271 -0
- package/dist/secret-config-CBZBs0p1.js.map +1 -0
- package/dist/slack.transport-Ce96JBDk.mjs +824 -0
- package/dist/slack.transport-Ce96JBDk.mjs.map +1 -0
- package/dist/slack.transport-Dlx3xvb7.js +847 -0
- package/dist/slack.transport-Dlx3xvb7.js.map +1 -0
- package/dist/slack.transport-DrirgDNy.d.ts +159 -0
- package/dist/slack.transport-DrirgDNy.d.ts.map +1 -0
- package/dist/slack.transport-DxHOXlLu.d.mts +159 -0
- package/dist/slack.transport-DxHOXlLu.d.mts.map +1 -0
- package/dist/testing.d.mts +3 -8
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +3 -8
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +3 -4
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +2 -3
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.manager-Crau3Rle.js → transport.manager-DkcEOlqV.js} +331 -234
- package/dist/transport.manager-DkcEOlqV.js.map +1 -0
- package/dist/{transport.manager-CpdVHEGP.mjs → transport.manager-eZ_EeC00.mjs} +274 -178
- package/dist/transport.manager-eZ_EeC00.mjs.map +1 -0
- package/dist/{transport.types-CtNr3D7S.d.mts → transport.types-BJVL1QQl.d.mts} +5 -4
- package/dist/transport.types-BJVL1QQl.d.mts.map +1 -0
- package/dist/{transport.types-DqVLZTyf.d.ts → transport.types-BJVL1QQl.d.ts} +5 -4
- package/dist/transport.types-BJVL1QQl.d.ts.map +1 -0
- package/dist/transports.d.mts +32 -41
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +32 -41
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +12 -12
- package/dist/transports.mjs +7 -12
- package/dist/worker-entry.js +337 -87
- package/dist/worker.d.mts +1 -2
- package/dist/worker.d.ts +1 -2
- package/dist/worker.js +3 -4
- package/dist/worker.mjs +1 -4
- package/dist/{worker.transport-Bj-i0P9V.d.ts → worker.transport-BuPwBi3d.d.ts} +2 -6
- package/dist/worker.transport-BuPwBi3d.d.ts.map +1 -0
- package/dist/{worker.transport-JP8YHBuU.js → worker.transport-C6GNl_r2.js} +44 -14
- package/dist/worker.transport-C6GNl_r2.js.map +1 -0
- package/dist/{worker.transport-otwhJ_Et.mjs → worker.transport-DLVA4y2e.mjs} +39 -9
- package/dist/worker.transport-DLVA4y2e.mjs.map +1 -0
- package/dist/{worker.transport-Bgv9heDI.d.mts → worker.transport-hJay1wxA.d.mts} +2 -6
- package/dist/worker.transport-hJay1wxA.d.mts.map +1 -0
- package/package.json +36 -19
- package/dist/async-context-BzJrbfQs.mjs +0 -72
- package/dist/async-context-BzJrbfQs.mjs.map +0 -1
- package/dist/async-context-DyQQYq3I.js +0 -92
- package/dist/async-context-DyQQYq3I.js.map +0 -1
- package/dist/azure-monitor.transport-BDFO4F-i.d.ts.map +0 -1
- package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
- package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
- package/dist/azure-monitor.transport-D5wQEH04.d.mts.map +0 -1
- package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
- package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
- package/dist/chunk-DLSkYcPk.mjs +0 -7
- package/dist/chunk-nOFOJqeH.js +0 -30
- package/dist/cloudwatch.transport-B00st6Xv.d.ts.map +0 -1
- package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
- package/dist/cloudwatch.transport-Blc7Gtxt.d.mts.map +0 -1
- package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
- package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
- package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
- package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
- package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
- package/dist/gcp.transport-m4fVw0b1.d.ts.map +0 -1
- package/dist/gcp.transport-zzNyIoih.d.mts.map +0 -1
- package/dist/index-BPwEisy4.d.mts.map +0 -1
- package/dist/index-nZEeCr3X.d.ts.map +0 -1
- package/dist/internal-log-BUJYMZbE.js +0 -70
- package/dist/internal-log-BUJYMZbE.js.map +0 -1
- package/dist/internal-log-Cm8SOWSV.mjs +0 -52
- package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
- package/dist/nestjs-extras-DnJ6vrIC.js.map +0 -1
- package/dist/nestjs-extras-ImbuDhs1.mjs.map +0 -1
- package/dist/nestjs-extras-OkC796py.d.mts +0 -725
- package/dist/nestjs-extras-OkC796py.d.mts.map +0 -1
- package/dist/nestjs-extras-mKrHE9S6.d.ts +0 -725
- package/dist/nestjs-extras-mKrHE9S6.d.ts.map +0 -1
- package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
- package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
- package/dist/search-B0MH1SJJ.js.map +0 -1
- package/dist/search-BfBzDIT9.d.mts.map +0 -1
- package/dist/search-CHUZPl0h.d.ts.map +0 -1
- package/dist/search-DjXSn6v5.mjs.map +0 -1
- package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
- package/dist/trace.utils-DpBOLDtq.js.map +0 -1
- package/dist/transport.manager-CpdVHEGP.mjs.map +0 -1
- package/dist/transport.manager-Crau3Rle.js.map +0 -1
- package/dist/transport.types-CtNr3D7S.d.mts.map +0 -1
- package/dist/transport.types-DqVLZTyf.d.ts.map +0 -1
- package/dist/worker.transport-Bgv9heDI.d.mts.map +0 -1
- package/dist/worker.transport-Bj-i0P9V.d.ts.map +0 -1
- package/dist/worker.transport-JP8YHBuU.js.map +0 -1
- package/dist/worker.transport-otwhJ_Et.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { n as
|
|
2
|
-
import { i as
|
|
3
|
-
import {
|
|
4
|
-
import "./
|
|
5
|
-
import {
|
|
6
|
-
import { n as
|
|
7
|
-
import {
|
|
8
|
-
import { t as
|
|
9
|
-
import {
|
|
10
|
-
import { a as BasicSearchEngine, i as CorrelationEngine, n as PatternRecognitionEngine, o as BasicLogIndexer, r as NLPSearchEngine, t as SearchManager } from "./search-DjXSn6v5.mjs";
|
|
1
|
+
import { C as globalPluginRegistry, D as DEFAULT_LOG_LEVELS, E as DEFAULT_LOG_COLORS, O as LogLevel, S as PluginRegistry, T as DEFAULT_CONFIG, _ as getOtelMetaFields, a as isLogixiaException, b as normalizeError, c as _shutdownRegistrySize, d as registerForShutdown, f as resetShutdownHandlers, g as getActiveOtelContext, h as disableOtelBridge, i as LogixiaException, l as deregisterFromShutdown, m as redactObject, n as generateRequestId, o as LogixiaLogger, p as applyRedaction, r as generateTraceId, s as createLogger$1, t as ErrorResponseBuilder, u as flushOnExit, v as initOtelBridge, w as usePlugin, x as serializeError, y as isError } from "./builder-D70z6kjj.mjs";
|
|
2
|
+
import { a as TRACE_CONTEXT_KEY, c as createTraceMiddleware, d as getTraceContextKey, f as runWithTraceId, h as traceStorage, i as MAX_INCOMING_ID_LENGTH, l as extractTraceId, m as setTraceId, o as TraceContext, p as sanitizeIncomingId, r as DEFAULT_TRACE_HEADERS, s as _setActiveContextKey, u as getCurrentTraceId } from "./request-trace-C_fvIDv4.mjs";
|
|
3
|
+
import { n as createExpressContextMiddleware, r as createFastifyContextHook, t as LogixiaContext } from "./async-context-B05ArHgM.mjs";
|
|
4
|
+
import { n as internalLog, r as internalWarn } from "./internal-log-uCSd1PMc.mjs";
|
|
5
|
+
import { t as safeToString } from "./coerce.utils-B_rEudCn.mjs";
|
|
6
|
+
import { i as stringifyForLog, n as retrocycle, r as safeStringify, t as decycleValue } from "./safe-stringify-BMRl3EX3.mjs";
|
|
7
|
+
import { d as stripControlChars } from "./transport.manager-eZ_EeC00.mjs";
|
|
8
|
+
import { i as toOtelSeverity, n as DiscordTransport, r as OtlpLogTransport, t as SlackTransport } from "./slack.transport-Ce96JBDk.mjs";
|
|
9
|
+
import { a as BasicSearchEngine, i as CorrelationEngine, n as PatternRecognitionEngine, o as BasicLogIndexer, r as NLPSearchEngine, t as SearchManager } from "./search-CWMVYC-R.mjs";
|
|
11
10
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
12
|
-
|
|
13
|
-
//#region src/formatters/json.formatter.ts
|
|
11
|
+
// src/formatters/json.formatter.ts
|
|
14
12
|
/**
|
|
15
13
|
* Build a JSON.stringify replacer that replaces circular references with the
|
|
16
14
|
* string '[Circular]' instead of throwing. A fresh replacer must be created per
|
|
@@ -74,9 +72,7 @@ var JsonFormatter = class {
|
|
|
74
72
|
return serialized;
|
|
75
73
|
}
|
|
76
74
|
};
|
|
77
|
-
|
|
78
|
-
//#endregion
|
|
79
|
-
//#region src/formatters/text.formatter.ts
|
|
75
|
+
// src/formatters/text.formatter.ts
|
|
80
76
|
const stripControls = (value) => stripControlChars(safeToString(value));
|
|
81
77
|
var TextFormatter = class TextFormatter {
|
|
82
78
|
constructor(options = {}) {
|
|
@@ -138,7 +134,6 @@ var TextFormatter = class TextFormatter {
|
|
|
138
134
|
switch (this.timestampFormat) {
|
|
139
135
|
case "iso": return date.toISOString();
|
|
140
136
|
case "short": return date.toLocaleTimeString();
|
|
141
|
-
case "locale":
|
|
142
137
|
default: return date.toLocaleString();
|
|
143
138
|
}
|
|
144
139
|
}
|
|
@@ -196,9 +191,7 @@ var TextFormatter = class TextFormatter {
|
|
|
196
191
|
});
|
|
197
192
|
}
|
|
198
193
|
};
|
|
199
|
-
|
|
200
|
-
//#endregion
|
|
201
|
-
//#region src/utils/runtime-control.ts
|
|
194
|
+
// src/utils/runtime-control.ts
|
|
202
195
|
const DEFAULT_CYCLE = [
|
|
203
196
|
"error",
|
|
204
197
|
"warn",
|
|
@@ -215,13 +208,14 @@ const DEFAULT_CYCLE = [
|
|
|
215
208
|
* memorizable command (`kill -USR2 <pid>`) is enough to ratchet verbosity up
|
|
216
209
|
* while chasing a bug and back down again — no value to remember.
|
|
217
210
|
*/
|
|
218
|
-
function registerLevelSignal(logger
|
|
211
|
+
function registerLevelSignal(logger, options = {}) {
|
|
219
212
|
const signal = options.signal ?? "SIGUSR2";
|
|
220
213
|
const cycle = options.cycle && options.cycle.length > 0 ? options.cycle : [...DEFAULT_CYCLE];
|
|
221
214
|
const handler = () => {
|
|
222
|
-
const current = logger
|
|
223
|
-
const
|
|
224
|
-
|
|
215
|
+
const current = logger.getLevel();
|
|
216
|
+
const idx = cycle.indexOf(current);
|
|
217
|
+
const next = cycle[(idx + 1) % cycle.length];
|
|
218
|
+
logger.setLevel(next);
|
|
225
219
|
internalLog(`runtime level changed via ${signal}: ${current} → ${next}`);
|
|
226
220
|
};
|
|
227
221
|
process.on(signal, handler);
|
|
@@ -230,7 +224,7 @@ function registerLevelSignal(logger$1, options = {}) {
|
|
|
230
224
|
};
|
|
231
225
|
}
|
|
232
226
|
/** Maximum accepted request body size for the level control handler. */
|
|
233
|
-
const MAX_BODY_BYTES =
|
|
227
|
+
const MAX_BODY_BYTES = 16384;
|
|
234
228
|
function isJsonContentType(req) {
|
|
235
229
|
var _req$headers;
|
|
236
230
|
const raw = (_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers["content-type"];
|
|
@@ -238,7 +232,7 @@ function isJsonContentType(req) {
|
|
|
238
232
|
if (typeof value !== "string") return false;
|
|
239
233
|
return value.split(";")[0].trim().toLowerCase() === "application/json";
|
|
240
234
|
}
|
|
241
|
-
const VALID_LEVELS = new Set([
|
|
235
|
+
const VALID_LEVELS = /* @__PURE__ */ new Set([
|
|
242
236
|
"error",
|
|
243
237
|
"warn",
|
|
244
238
|
"info",
|
|
@@ -267,13 +261,13 @@ const VALID_LEVELS = new Set([
|
|
|
267
261
|
* which also keeps cross-site form posts out) and a body of at most 16 KB
|
|
268
262
|
* (otherwise 413).
|
|
269
263
|
*/
|
|
270
|
-
function createLevelControlHandler(logger
|
|
264
|
+
function createLevelControlHandler(logger, options = {}) {
|
|
271
265
|
const allowed = options.allowedLevels && options.allowedLevels.length > 0 ? new Set(options.allowedLevels.map((l) => l.toLowerCase())) : VALID_LEVELS;
|
|
272
266
|
const snapshot = () => {
|
|
273
267
|
var _logger$getNamespaceL;
|
|
274
268
|
return {
|
|
275
|
-
level: logger
|
|
276
|
-
namespaceLevels: ((_logger$getNamespaceL = logger
|
|
269
|
+
level: logger.getLevel(),
|
|
270
|
+
namespaceLevels: ((_logger$getNamespaceL = logger.getNamespaceLevels) === null || _logger$getNamespaceL === void 0 ? void 0 : _logger$getNamespaceL.call(logger)) ?? {}
|
|
277
271
|
};
|
|
278
272
|
};
|
|
279
273
|
const send = (res, status, body) => {
|
|
@@ -299,7 +293,7 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
299
293
|
});
|
|
300
294
|
return;
|
|
301
295
|
}
|
|
302
|
-
logger
|
|
296
|
+
logger.setLevel(lvl);
|
|
303
297
|
}
|
|
304
298
|
if (parsed.namespaceLevels !== void 0) {
|
|
305
299
|
if (typeof parsed.namespaceLevels !== "object" || parsed.namespaceLevels === null || Array.isArray(parsed.namespaceLevels)) {
|
|
@@ -311,9 +305,9 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
311
305
|
send(res, 400, { error: `unknown level "${String(lvl)}" for namespace "${pat}"` });
|
|
312
306
|
return;
|
|
313
307
|
}
|
|
314
|
-
if (logger
|
|
308
|
+
if (logger.setNamespaceLevels) {
|
|
315
309
|
const coerced = Object.fromEntries(Object.entries(nl).map(([pat, lvl]) => [pat, String(lvl).toLowerCase()]));
|
|
316
|
-
logger
|
|
310
|
+
logger.setNamespaceLevels(coerced);
|
|
317
311
|
} else internalWarn("level control: logger does not support setNamespaceLevels — ignored");
|
|
318
312
|
}
|
|
319
313
|
send(res, 200, snapshot());
|
|
@@ -375,9 +369,54 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
375
369
|
send(res, 405, { error: `method ${method} not allowed` });
|
|
376
370
|
};
|
|
377
371
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
372
|
+
// src/utils/typed-logger.ts
|
|
373
|
+
/**
|
|
374
|
+
* logixia — TypeScript typed log fields
|
|
375
|
+
*
|
|
376
|
+
* Solves the type-safety gap: standard `Record<string, unknown>` metadata gives
|
|
377
|
+
* zero IDE autocomplete and lets typos slip silently into production logs.
|
|
378
|
+
*
|
|
379
|
+
* Two complementary utilities:
|
|
380
|
+
*
|
|
381
|
+
* 1. `createTypedLogger<TFields>()` — wraps any IBaseLogger so that the second
|
|
382
|
+
* argument of every log method is constrained to `TFields` (a typed object).
|
|
383
|
+
* Compile-time safety, zero runtime overhead.
|
|
384
|
+
*
|
|
385
|
+
* 2. `defineLogSchema<TFields>(schema)` — declares expected fields with optional
|
|
386
|
+
* validators. In development (NODE_ENV !== 'production') every log call is
|
|
387
|
+
* validated against the schema and a warning is emitted for missing required
|
|
388
|
+
* fields or type mismatches.
|
|
389
|
+
*
|
|
390
|
+
* @example
|
|
391
|
+
* ```ts
|
|
392
|
+
* import { createTypedLogger, defineLogSchema } from 'logixia';
|
|
393
|
+
*
|
|
394
|
+
* interface OrderFields {
|
|
395
|
+
* orderId: string;
|
|
396
|
+
* userId: string;
|
|
397
|
+
* amount?: number;
|
|
398
|
+
* currency?: string;
|
|
399
|
+
* }
|
|
400
|
+
*
|
|
401
|
+
* const schema = defineLogSchema<OrderFields>({
|
|
402
|
+
* orderId: { type: 'string', required: true },
|
|
403
|
+
* userId: { type: 'string', required: true },
|
|
404
|
+
* amount: { type: 'number' },
|
|
405
|
+
* currency: { type: 'string' },
|
|
406
|
+
* });
|
|
407
|
+
*
|
|
408
|
+
* const orderLogger = createTypedLogger<OrderFields>(baseLogger, schema);
|
|
409
|
+
* await orderLogger.info('Order created', { orderId: 'ord_123', userId: 'usr_456', amount: 99.99 });
|
|
410
|
+
* // ^^^^ fully typed autocomplete ^^^^
|
|
411
|
+
* ```
|
|
412
|
+
*/
|
|
413
|
+
function isProduction() {
|
|
414
|
+
try {
|
|
415
|
+
return process.env.NODE_ENV === "production";
|
|
416
|
+
} catch {
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
381
420
|
/**
|
|
382
421
|
* Define a typed schema for a category of log entries.
|
|
383
422
|
*
|
|
@@ -388,7 +427,7 @@ function defineLogSchema(fields) {
|
|
|
388
427
|
return {
|
|
389
428
|
fields,
|
|
390
429
|
validate(payload) {
|
|
391
|
-
if (
|
|
430
|
+
if (isProduction()) return [];
|
|
392
431
|
const warnings = [];
|
|
393
432
|
for (const [key, def] of Object.entries(fields)) {
|
|
394
433
|
const value = payload[key];
|
|
@@ -415,7 +454,7 @@ function defineLogSchema(fields) {
|
|
|
415
454
|
* @param logger Any object that implements `IBaseLogger` (e.g. the result of `createLogger()`)
|
|
416
455
|
* @param schema Optional schema for dev-time validation. Created with `defineLogSchema()`.
|
|
417
456
|
*/
|
|
418
|
-
function createTypedLogger(logger
|
|
457
|
+
function createTypedLogger(logger, schema) {
|
|
419
458
|
function withValidation(level, fn, message, data) {
|
|
420
459
|
if (schema && data) {
|
|
421
460
|
const warnings = schema.validate(data);
|
|
@@ -424,25 +463,56 @@ function createTypedLogger(logger$1, schema) {
|
|
|
424
463
|
return fn(message, data);
|
|
425
464
|
}
|
|
426
465
|
return {
|
|
427
|
-
raw: logger
|
|
466
|
+
raw: logger,
|
|
428
467
|
error(messageOrError, data) {
|
|
429
468
|
if (schema && data) {
|
|
430
469
|
const warnings = schema.validate(data);
|
|
431
470
|
const display = messageOrError instanceof Error ? messageOrError.message : messageOrError;
|
|
432
471
|
for (const w of warnings) internalWarn(`[logixia/schema] ${w} — level=error message="${display}"`);
|
|
433
472
|
}
|
|
434
|
-
return logger
|
|
473
|
+
return logger.error(messageOrError, data);
|
|
435
474
|
},
|
|
436
|
-
warn: (m, d) => withValidation("warn", logger
|
|
437
|
-
info: (m, d) => withValidation("info", logger
|
|
438
|
-
debug: (m, d) => withValidation("debug", logger
|
|
439
|
-
verbose: (m, d) => withValidation("verbose", (logger
|
|
440
|
-
trace: (m, d) => withValidation("trace", (logger
|
|
475
|
+
warn: (m, d) => withValidation("warn", logger.warn.bind(logger), m, d),
|
|
476
|
+
info: (m, d) => withValidation("info", logger.info.bind(logger), m, d),
|
|
477
|
+
debug: (m, d) => withValidation("debug", logger.debug.bind(logger), m, d),
|
|
478
|
+
verbose: (m, d) => withValidation("verbose", (logger.verbose ?? logger.debug).bind(logger), m, d),
|
|
479
|
+
trace: (m, d) => withValidation("trace", (logger.trace ?? logger.debug).bind(logger), m, d)
|
|
441
480
|
};
|
|
442
481
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
482
|
+
// src/wide-events.ts
|
|
483
|
+
/**
|
|
484
|
+
* logixia — Canonical Log Lines / Wide Events.
|
|
485
|
+
*
|
|
486
|
+
* Emit ONE dense, structured event per unit of work (usually a request) instead
|
|
487
|
+
* of scattering details across many narrow log lines. Fields are accumulated as
|
|
488
|
+
* the request flows through middleware and business logic, then the whole event
|
|
489
|
+
* is emitted ONCE — in a `finally`/teardown path so it fires even on errors.
|
|
490
|
+
*
|
|
491
|
+
* This is the "canonical log line" pattern (Stripe) / "wide events" /
|
|
492
|
+
* "Observability 2.0" (Honeycomb): one pre-joined, queryable record per request,
|
|
493
|
+
* so operators never JOIN across log lines during an incident. It composes with
|
|
494
|
+
* logixia's existing trace correlation — when a trace is active, the event
|
|
495
|
+
* carries `traceId`/`spanId`, making it OTel-friendly.
|
|
496
|
+
*
|
|
497
|
+
* @example Manual scope
|
|
498
|
+
* ```ts
|
|
499
|
+
* import { withWideEvent, addEventFields } from 'logixia';
|
|
500
|
+
*
|
|
501
|
+
* await withWideEvent(logger, { route: '/checkout' }, async () => {
|
|
502
|
+
* addEventFields({ userId, planTier }); // from anywhere in the call tree
|
|
503
|
+
* addEventFields({ dbQueries: 4, cacheHit });
|
|
504
|
+
* // ...one wide event is emitted automatically when this callback settles,
|
|
505
|
+
* // even if it throws.
|
|
506
|
+
* });
|
|
507
|
+
* ```
|
|
508
|
+
*
|
|
509
|
+
* @example Express middleware (auto-emit on response finish/close)
|
|
510
|
+
* ```ts
|
|
511
|
+
* import { wideEventMiddleware } from 'logixia';
|
|
512
|
+
* app.use(wideEventMiddleware(logger));
|
|
513
|
+
* app.get('/x', (req, res) => { addEventFields({ handled: 'x' }); res.json({}); });
|
|
514
|
+
* ```
|
|
515
|
+
*/
|
|
446
516
|
const _storage = new AsyncLocalStorage();
|
|
447
517
|
/**
|
|
448
518
|
* Merge fields into the wide event for the current async scope. No-op (with no
|
|
@@ -463,7 +533,7 @@ function getEventFields() {
|
|
|
463
533
|
const state = _storage.getStore();
|
|
464
534
|
return state ? { ...state.fields } : void 0;
|
|
465
535
|
}
|
|
466
|
-
function emit(logger
|
|
536
|
+
function emit(logger, state, options, extra) {
|
|
467
537
|
if (state.emitted) return;
|
|
468
538
|
state.emitted = true;
|
|
469
539
|
const level = options.level ?? "info";
|
|
@@ -477,7 +547,7 @@ function emit(logger$1, state, options, extra) {
|
|
|
477
547
|
const traceId = getCurrentTraceId();
|
|
478
548
|
if (traceId !== void 0 && payload["traceId"] === void 0) payload["traceId"] = traceId;
|
|
479
549
|
}
|
|
480
|
-
const p = logger
|
|
550
|
+
const p = logger.logLevel(level, message, payload);
|
|
481
551
|
if (p && typeof p.catch === "function") p.catch(() => {});
|
|
482
552
|
}
|
|
483
553
|
/**
|
|
@@ -486,7 +556,7 @@ function emit(logger$1, state, options, extra) {
|
|
|
486
556
|
* when the callback settles — on success OR error (the canonical "emit in
|
|
487
557
|
* finally" guarantee). On error, `error` + `errorMessage` fields are added.
|
|
488
558
|
*/
|
|
489
|
-
async function withWideEvent(logger
|
|
559
|
+
async function withWideEvent(logger, initialFields, callback, options = {}) {
|
|
490
560
|
const state = {
|
|
491
561
|
fields: { ...initialFields },
|
|
492
562
|
startMs: Date.now(),
|
|
@@ -495,10 +565,10 @@ async function withWideEvent(logger$1, initialFields, callback, options = {}) {
|
|
|
495
565
|
return _storage.run(state, async () => {
|
|
496
566
|
try {
|
|
497
567
|
const result = await callback();
|
|
498
|
-
emit(logger
|
|
568
|
+
emit(logger, state, options);
|
|
499
569
|
return result;
|
|
500
570
|
} catch (error) {
|
|
501
|
-
emit(logger
|
|
571
|
+
emit(logger, state, options, {
|
|
502
572
|
error: true,
|
|
503
573
|
errorMessage: error instanceof Error ? error.message : String(error)
|
|
504
574
|
});
|
|
@@ -513,7 +583,7 @@ async function withWideEvent(logger$1, initialFields, callback, options = {}) {
|
|
|
513
583
|
* more via `addEventFields`. The completion event includes `statusCode` and the
|
|
514
584
|
* request duration.
|
|
515
585
|
*/
|
|
516
|
-
function wideEventMiddleware(logger
|
|
586
|
+
function wideEventMiddleware(logger, options = {}) {
|
|
517
587
|
return function logixiaWideEventMiddleware(req, res, next) {
|
|
518
588
|
var _options$skip, _req$socket, _res$once, _res$once2;
|
|
519
589
|
if ((_options$skip = options.skip) === null || _options$skip === void 0 ? void 0 : _options$skip.call(options, req)) {
|
|
@@ -531,192 +601,14 @@ function wideEventMiddleware(logger$1, options = {}) {
|
|
|
531
601
|
emitted: false
|
|
532
602
|
};
|
|
533
603
|
const finalize = () => {
|
|
534
|
-
emit(logger
|
|
604
|
+
emit(logger, state, options, { statusCode: res.statusCode ?? 0 });
|
|
535
605
|
};
|
|
536
606
|
(_res$once = res.once) === null || _res$once === void 0 || _res$once.call(res, "finish", finalize);
|
|
537
607
|
(_res$once2 = res.once) === null || _res$once2 === void 0 || _res$once2.call(res, "close", finalize);
|
|
538
608
|
_storage.run(state, () => next());
|
|
539
609
|
};
|
|
540
610
|
}
|
|
541
|
-
|
|
542
|
-
//#endregion
|
|
543
|
-
//#region src/transports/otlp.transport.ts
|
|
544
|
-
const HEX_32 = /^[0-9a-f]{32}$/;
|
|
545
|
-
/**
|
|
546
|
-
* OTLP JSON wants a 32-char lowercase hex trace id. Dashed UUIDs are
|
|
547
|
-
* normalised; anything else (or all zeros) returns undefined.
|
|
548
|
-
*/
|
|
549
|
-
function toOtlpTraceId(id) {
|
|
550
|
-
const hex = id.replace(/-/g, "").toLowerCase();
|
|
551
|
-
return HEX_32.test(hex) && hex !== "0".repeat(32) ? hex : void 0;
|
|
552
|
-
}
|
|
553
|
-
/**
|
|
554
|
-
* Map a logixia level name to an OTel SeverityNumber (1–24) and text.
|
|
555
|
-
* Per the OTel logs SDK spec: TRACE=1, DEBUG=5, INFO=9, WARN=13, ERROR=17,
|
|
556
|
-
* FATAL=21. Custom/unknown levels fall back to INFO (9).
|
|
557
|
-
*/
|
|
558
|
-
function toOtelSeverity(level) {
|
|
559
|
-
switch (level.toLowerCase()) {
|
|
560
|
-
case "trace": return {
|
|
561
|
-
number: 1,
|
|
562
|
-
text: "TRACE"
|
|
563
|
-
};
|
|
564
|
-
case "verbose": return {
|
|
565
|
-
number: 5,
|
|
566
|
-
text: "DEBUG"
|
|
567
|
-
};
|
|
568
|
-
case "debug": return {
|
|
569
|
-
number: 5,
|
|
570
|
-
text: "DEBUG"
|
|
571
|
-
};
|
|
572
|
-
case "info": return {
|
|
573
|
-
number: 9,
|
|
574
|
-
text: "INFO"
|
|
575
|
-
};
|
|
576
|
-
case "warn":
|
|
577
|
-
case "warning": return {
|
|
578
|
-
number: 13,
|
|
579
|
-
text: "WARN"
|
|
580
|
-
};
|
|
581
|
-
case "error": return {
|
|
582
|
-
number: 17,
|
|
583
|
-
text: "ERROR"
|
|
584
|
-
};
|
|
585
|
-
case "fatal": return {
|
|
586
|
-
number: 21,
|
|
587
|
-
text: "FATAL"
|
|
588
|
-
};
|
|
589
|
-
default: return {
|
|
590
|
-
number: 9,
|
|
591
|
-
text: "INFO"
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
/** Coerce a JS value into an OTLP AnyValue. */
|
|
596
|
-
function toAnyValue(value) {
|
|
597
|
-
if (typeof value === "string") return { stringValue: value };
|
|
598
|
-
if (typeof value === "boolean") return { boolValue: value };
|
|
599
|
-
if (typeof value === "number") return Number.isInteger(value) ? { intValue: value } : { doubleValue: value };
|
|
600
|
-
if (typeof value === "bigint") return { stringValue: value.toString() };
|
|
601
|
-
if (value === null || value === void 0) return { stringValue: "" };
|
|
602
|
-
try {
|
|
603
|
-
return { stringValue: stringifyForLog(value) };
|
|
604
|
-
} catch {
|
|
605
|
-
return { stringValue: String(value) };
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
/** Build the OTLP KeyValue attribute list from a flat record. */
|
|
609
|
-
function toAttributes(rec) {
|
|
610
|
-
return Object.entries(rec).map(([key, value]) => ({
|
|
611
|
-
key,
|
|
612
|
-
value: toAnyValue(value)
|
|
613
|
-
}));
|
|
614
|
-
}
|
|
615
|
-
var OtlpLogTransport = class {
|
|
616
|
-
constructor(config) {
|
|
617
|
-
this.name = "otlp";
|
|
618
|
-
this.flushTimer = null;
|
|
619
|
-
this.url = config.url;
|
|
620
|
-
this.headers = config.headers ?? {};
|
|
621
|
-
this.batchSize = config.batchSize ?? 100;
|
|
622
|
-
this.flushIntervalMs = config.flushIntervalMs ?? 5e3;
|
|
623
|
-
this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
624
|
-
this.level = config.level;
|
|
625
|
-
this.buffer = new BatchBuffer({
|
|
626
|
-
name: "OtlpLogTransport",
|
|
627
|
-
batchSize: this.batchSize,
|
|
628
|
-
maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,
|
|
629
|
-
send: (entries) => this.send(entries)
|
|
630
|
-
});
|
|
631
|
-
this.resourceAttrs = toAttributes({
|
|
632
|
-
"service.name": config.serviceName ?? "logixia",
|
|
633
|
-
...config.serviceVersion ? { "service.version": config.serviceVersion } : {},
|
|
634
|
-
...config.environment ? { "deployment.environment": config.environment } : {},
|
|
635
|
-
...config.resourceAttributes ?? {}
|
|
636
|
-
});
|
|
637
|
-
this.flushTimer = setInterval(() => {
|
|
638
|
-
this.flush().catch(() => {});
|
|
639
|
-
}, this.flushIntervalMs);
|
|
640
|
-
if (this.flushTimer.unref) this.flushTimer.unref();
|
|
641
|
-
}
|
|
642
|
-
write(entry) {
|
|
643
|
-
this.buffer.push(entry);
|
|
644
|
-
this.buffer.flushIfFull();
|
|
645
|
-
}
|
|
646
|
-
/** Convert one entry into an OTLP LogRecord. */
|
|
647
|
-
toLogRecord(entry) {
|
|
648
|
-
const sev = toOtelSeverity(entry.level);
|
|
649
|
-
const tsNanos = String(entry.timestamp.getTime() * 1e6);
|
|
650
|
-
const attrs = { ...entry.data ?? {} };
|
|
651
|
-
if (entry.context !== void 0) attrs["context"] = entry.context;
|
|
652
|
-
if (entry.appName !== void 0) attrs["app.name"] = entry.appName;
|
|
653
|
-
if (entry.environment !== void 0) attrs["deployment.environment"] = entry.environment;
|
|
654
|
-
const record = {
|
|
655
|
-
timeUnixNano: tsNanos,
|
|
656
|
-
observedTimeUnixNano: tsNanos,
|
|
657
|
-
severityNumber: sev.number,
|
|
658
|
-
severityText: sev.text,
|
|
659
|
-
body: { stringValue: entry.message },
|
|
660
|
-
attributes: toAttributes(attrs)
|
|
661
|
-
};
|
|
662
|
-
if (entry.traceId) {
|
|
663
|
-
const traceId = toOtlpTraceId(entry.traceId);
|
|
664
|
-
if (traceId) record["traceId"] = traceId;
|
|
665
|
-
else record["attributes"].push({
|
|
666
|
-
key: "trace_id",
|
|
667
|
-
value: { stringValue: entry.traceId }
|
|
668
|
-
});
|
|
669
|
-
}
|
|
670
|
-
return record;
|
|
671
|
-
}
|
|
672
|
-
buildPayload(entries) {
|
|
673
|
-
return stringifyForLog({ resourceLogs: [{
|
|
674
|
-
resource: { attributes: this.resourceAttrs },
|
|
675
|
-
scopeLogs: [{
|
|
676
|
-
scope: { name: "logixia" },
|
|
677
|
-
logRecords: entries.map((e) => this.toLogRecord(e))
|
|
678
|
-
}]
|
|
679
|
-
}] });
|
|
680
|
-
}
|
|
681
|
-
flush() {
|
|
682
|
-
return this.buffer.flush();
|
|
683
|
-
}
|
|
684
|
-
async send(entries) {
|
|
685
|
-
if (typeof fetch !== "function") {
|
|
686
|
-
internalWarn("OtlpLogTransport: global fetch unavailable — cannot export logs");
|
|
687
|
-
return;
|
|
688
|
-
}
|
|
689
|
-
const controller = new AbortController();
|
|
690
|
-
const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);
|
|
691
|
-
try {
|
|
692
|
-
const res = await fetch(this.url, {
|
|
693
|
-
method: "POST",
|
|
694
|
-
headers: {
|
|
695
|
-
"Content-Type": "application/json",
|
|
696
|
-
...this.headers
|
|
697
|
-
},
|
|
698
|
-
body: this.buildPayload(entries),
|
|
699
|
-
signal: controller.signal
|
|
700
|
-
});
|
|
701
|
-
if (!res.ok) throw new HttpError(res.status, "", "OTLP export");
|
|
702
|
-
} catch (err) {
|
|
703
|
-
if (controller.signal.aborted) throw new Error(`OTLP export timed out after ${this.requestTimeoutMs}ms`, { cause: err });
|
|
704
|
-
throw err;
|
|
705
|
-
} finally {
|
|
706
|
-
clearTimeout(timer);
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
async close() {
|
|
710
|
-
if (this.flushTimer) {
|
|
711
|
-
clearInterval(this.flushTimer);
|
|
712
|
-
this.flushTimer = null;
|
|
713
|
-
}
|
|
714
|
-
await this.buffer.close();
|
|
715
|
-
}
|
|
716
|
-
};
|
|
717
|
-
|
|
718
|
-
//#endregion
|
|
719
|
-
//#region src/metrics.ts
|
|
611
|
+
// src/metrics.ts
|
|
720
612
|
const DEFAULT_BUCKETS = [
|
|
721
613
|
1,
|
|
722
614
|
5,
|
|
@@ -858,9 +750,10 @@ var MetricsPlugin = class {
|
|
|
858
750
|
const helpText = config.help ?? rawName.replace(/_/g, " ");
|
|
859
751
|
lines.push(`# HELP ${metricName} ${helpText}`);
|
|
860
752
|
lines.push(`# TYPE ${metricName} ${config.type}`);
|
|
861
|
-
if (state.type === "counter")
|
|
862
|
-
|
|
863
|
-
|
|
753
|
+
if (state.type === "counter") {
|
|
754
|
+
if (state.values.size === 0) lines.push(`${metricName} 0`);
|
|
755
|
+
else for (const [labelKey, count] of state.values) lines.push(`${metricName}${renderLabels(labelKey)} ${count}`);
|
|
756
|
+
} else if (state.type === "histogram") for (const [labelKey, bucketCounts] of state.counts) {
|
|
864
757
|
const labelSuffix = renderLabels(labelKey);
|
|
865
758
|
const baseObj = labelKey === "{}" ? {} : JSON.parse(labelKey);
|
|
866
759
|
for (let i = 0; i < state.buckets.length; i++) {
|
|
@@ -878,8 +771,10 @@ var MetricsPlugin = class {
|
|
|
878
771
|
lines.push(`${metricName}_sum${labelSuffix} ${state.sums.get(labelKey) ?? 0}`);
|
|
879
772
|
lines.push(`${metricName}_count${labelSuffix} ${state.observations.get(labelKey) ?? 0}`);
|
|
880
773
|
}
|
|
881
|
-
else if (state.type === "gauge")
|
|
882
|
-
|
|
774
|
+
else if (state.type === "gauge") {
|
|
775
|
+
if (state.values.size === 0) lines.push(`${metricName} 0`);
|
|
776
|
+
else for (const [labelKey, val] of state.values) lines.push(`${metricName}${renderLabels(labelKey)} ${val}`);
|
|
777
|
+
}
|
|
883
778
|
}
|
|
884
779
|
return `${lines.join("\n")}\n`;
|
|
885
780
|
}
|
|
@@ -996,52 +891,20 @@ var MetricsPlugin = class {
|
|
|
996
891
|
function createMetricsPlugin(map, options) {
|
|
997
892
|
return new MetricsPlugin(map, options);
|
|
998
893
|
}
|
|
999
|
-
|
|
1000
|
-
//#endregion
|
|
1001
|
-
//#region src/index.ts
|
|
894
|
+
// src/index.ts
|
|
1002
895
|
/**
|
|
1003
|
-
*
|
|
896
|
+
* Logixia - Advanced TypeScript Logger
|
|
897
|
+
*
|
|
898
|
+
* A comprehensive logging library with support for:
|
|
899
|
+
* - Multiple output formats (console, file, JSON)
|
|
900
|
+
* - Trace ID tracking
|
|
901
|
+
* - Performance monitoring
|
|
902
|
+
* - NestJS integration
|
|
903
|
+
* - Customizable log levels and colors
|
|
904
|
+
* - Intelligent log search and aggregation
|
|
905
|
+
* - Natural language query processing
|
|
906
|
+
* - Pattern recognition and anomaly detection
|
|
1004
907
|
*/
|
|
1005
|
-
const DEFAULT_CONFIG = {
|
|
1006
|
-
appName: "App",
|
|
1007
|
-
environment: "development",
|
|
1008
|
-
traceId: true,
|
|
1009
|
-
format: {
|
|
1010
|
-
timestamp: true,
|
|
1011
|
-
colorize: true,
|
|
1012
|
-
json: false
|
|
1013
|
-
},
|
|
1014
|
-
silent: false,
|
|
1015
|
-
levelOptions: {
|
|
1016
|
-
level: LogLevel.INFO,
|
|
1017
|
-
levels: {
|
|
1018
|
-
[LogLevel.ERROR]: 0,
|
|
1019
|
-
[LogLevel.WARN]: 1,
|
|
1020
|
-
[LogLevel.INFO]: 2,
|
|
1021
|
-
[LogLevel.DEBUG]: 3,
|
|
1022
|
-
[LogLevel.TRACE]: 4,
|
|
1023
|
-
[LogLevel.VERBOSE]: 5
|
|
1024
|
-
},
|
|
1025
|
-
colors: {
|
|
1026
|
-
[LogLevel.ERROR]: "red",
|
|
1027
|
-
[LogLevel.WARN]: "yellow",
|
|
1028
|
-
[LogLevel.INFO]: "blue",
|
|
1029
|
-
[LogLevel.DEBUG]: "green",
|
|
1030
|
-
[LogLevel.TRACE]: "gray",
|
|
1031
|
-
[LogLevel.VERBOSE]: "cyan"
|
|
1032
|
-
}
|
|
1033
|
-
},
|
|
1034
|
-
fields: {
|
|
1035
|
-
timestamp: true,
|
|
1036
|
-
level: true,
|
|
1037
|
-
appName: true,
|
|
1038
|
-
traceId: true,
|
|
1039
|
-
message: true,
|
|
1040
|
-
payload: true,
|
|
1041
|
-
timeTaken: true
|
|
1042
|
-
},
|
|
1043
|
-
outputs: ["console"]
|
|
1044
|
-
};
|
|
1045
908
|
/**
|
|
1046
909
|
* Create a new Logixia logger instance with TypeScript support for custom levels
|
|
1047
910
|
* @param config - Logger configuration
|
|
@@ -1049,24 +912,12 @@ const DEFAULT_CONFIG = {
|
|
|
1049
912
|
*/
|
|
1050
913
|
const createLogger = createLogger$1;
|
|
1051
914
|
/**
|
|
1052
|
-
* Create a new Logixia logger service for NestJS
|
|
1053
|
-
* @param config - Logger configuration
|
|
1054
|
-
* @returns LogixiaLoggerService instance
|
|
1055
|
-
*/
|
|
1056
|
-
function createLoggerService(config) {
|
|
1057
|
-
return new LogixiaLoggerService({
|
|
1058
|
-
...DEFAULT_CONFIG,
|
|
1059
|
-
...config
|
|
1060
|
-
});
|
|
1061
|
-
}
|
|
1062
|
-
/**
|
|
1063
915
|
* Default logger instance
|
|
1064
916
|
*/
|
|
1065
917
|
const logger = new LogixiaLogger(DEFAULT_CONFIG);
|
|
1066
918
|
/**
|
|
1067
919
|
* Export default configuration for reference
|
|
1068
920
|
*/
|
|
921
|
+
export { BasicLogIndexer, BasicSearchEngine, CorrelationEngine, DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, DiscordTransport, ErrorResponseBuilder, JsonFormatter, LogLevel, LogixiaContext, LogixiaException, LogixiaLogger, MAX_INCOMING_ID_LENGTH, MetricsPlugin, NLPSearchEngine, OVERFLOW_LABEL_VALUE, OtlpLogTransport, PatternRecognitionEngine, PluginRegistry, SearchManager, SlackTransport, TRACE_CONTEXT_KEY, TextFormatter, TraceContext, _setActiveContextKey, _shutdownRegistrySize, addEventFields, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLevelControlHandler, createLogger, createMetricsPlugin, createTraceMiddleware, createTypedLogger, decycleValue, defineLogSchema, deregisterFromShutdown, disableOtelBridge, extractTraceId, flushOnExit, generateRequestId, generateTraceId, getActiveOtelContext, getCurrentTraceId, getEventFields, getOtelMetaFields, getTraceContextKey, globalPluginRegistry, initOtelBridge, isError, isLogixiaException, logger, normalizeError, redactObject, registerForShutdown, registerLevelSignal, resetShutdownHandlers, retrocycle, runWithTraceId, safeStringify, sanitizeIncomingId, serializeError, setEventField, setTraceId, stringifyForLog, toOtelSeverity, traceStorage, usePlugin, wideEventMiddleware, withWideEvent };
|
|
1069
922
|
|
|
1070
|
-
//#endregion
|
|
1071
|
-
export { BasicLogIndexer, BasicSearchEngine, CorrelationEngine, DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, ErrorResponseBuilder, InjectLogger, JsonFormatter, KafkaTraceInterceptor, LOGIXIA_EXCEPTION_FILTER_OPTIONS, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, LOGIXIA_TRACE_CONFIG, LogLevel, LogMethod, LogixiaContext, LogixiaException, LogixiaExceptionFilter, LogixiaLogger, LogixiaLoggerModule, LogixiaLoggerService, MAX_INCOMING_ID_LENGTH, MetricsPlugin, NLPSearchEngine, OVERFLOW_LABEL_VALUE, OtlpLogTransport, PatternRecognitionEngine, PluginRegistry, SearchManager, TRACE_CONTEXT_KEY, TextFormatter, TraceContext, WebSocketTraceInterceptor, _setActiveContextKey, _shutdownRegistrySize, addEventFields, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLevelControlHandler, createLogger, createLoggerService, createMetricsPlugin, createTraceMiddleware, createTypedLogger, decycleValue, defineLogSchema, deregisterFromShutdown, disableOtelBridge, extractTraceId, flushOnExit, generateRequestId, generateTraceId, getActiveOtelContext, getCurrentTraceId, getEventFields, getOtelMetaFields, getTraceContextKey, globalPluginRegistry, initOtelBridge, isError, isLogixiaException, logger, normalizeError, redactObject, registerForShutdown, registerLevelSignal, resetShutdownHandlers, retrocycle, runWithTraceId, safeStringify, sanitizeIncomingId, serializeError, setEventField, setTraceId, stringifyForLog, toOtelSeverity, traceStorage, usePlugin, wideEventMiddleware, withWideEvent };
|
|
1072
923
|
//# sourceMappingURL=index.mjs.map
|