@smb-tech/logger-node 1.0.0
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 +30 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.js +71 -0
- package/dist/context.js.map +1 -0
- package/dist/dispatcher.d.ts +22 -0
- package/dist/dispatcher.js +78 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/express.d.ts +2 -0
- package/dist/express.js +10 -0
- package/dist/express.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.js +22 -0
- package/dist/logger.js.map +1 -0
- package/package.json +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# @smb-tech/logger-node
|
|
2
|
+
|
|
3
|
+
Node.js adapter for structured logging with AsyncLocalStorage.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Request context (MDC)
|
|
8
|
+
- TraceId / SpanId propagation
|
|
9
|
+
- AsyncLocalStorage support
|
|
10
|
+
- Express / Next / Nest compatible
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @smb-tech/logger-node
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { runWithNodeContext, Logger } from '@smb-tech/logger-node';
|
|
22
|
+
|
|
23
|
+
runWithNodeContext(() => {
|
|
24
|
+
const logger = Logger.get('App');
|
|
25
|
+
|
|
26
|
+
logger.info((event) => {
|
|
27
|
+
event.message('Request started');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface RequestTraceContext {
|
|
2
|
+
mdc: Record<string, string>;
|
|
3
|
+
}
|
|
4
|
+
export interface NodeContextOptions {
|
|
5
|
+
traceId?: string;
|
|
6
|
+
requestId?: string;
|
|
7
|
+
spanId?: string;
|
|
8
|
+
mdc?: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export declare class TraceContextFactory {
|
|
11
|
+
static create(options?: NodeContextOptions): RequestTraceContext;
|
|
12
|
+
private static resolveTraceId;
|
|
13
|
+
private static isValidTraceId;
|
|
14
|
+
private static createHexId;
|
|
15
|
+
}
|
|
16
|
+
export declare class RequestContextStore {
|
|
17
|
+
private static readonly storage;
|
|
18
|
+
static run<T>(context: RequestTraceContext, callback: () => T): T;
|
|
19
|
+
static get(): RequestTraceContext | undefined;
|
|
20
|
+
static getOrThrow(): RequestTraceContext;
|
|
21
|
+
static getMdc(): Record<string, string>;
|
|
22
|
+
static setMdc(key: string, value: string): void;
|
|
23
|
+
static setManyMdc(values: Record<string, string>): void;
|
|
24
|
+
static getMdcValue(key: string): string | undefined;
|
|
25
|
+
static removeMdc(key: string): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function runWithNodeContext<T>(callback: () => T, options?: NodeContextOptions): T;
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { randomBytes, randomUUID } from 'node:crypto';
|
|
3
|
+
export class TraceContextFactory {
|
|
4
|
+
static create(options) {
|
|
5
|
+
const requestId = options?.requestId ?? randomUUID();
|
|
6
|
+
const traceId = this.resolveTraceId(options?.traceId);
|
|
7
|
+
const spanId = options?.spanId ?? this.createHexId(8);
|
|
8
|
+
return {
|
|
9
|
+
mdc: {
|
|
10
|
+
requestId,
|
|
11
|
+
traceId,
|
|
12
|
+
spanId,
|
|
13
|
+
...(options?.mdc ?? {})
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
static resolveTraceId(incomingTraceId) {
|
|
18
|
+
if (incomingTraceId && this.isValidTraceId(incomingTraceId)) {
|
|
19
|
+
return incomingTraceId.toLowerCase();
|
|
20
|
+
}
|
|
21
|
+
return this.createHexId(16);
|
|
22
|
+
}
|
|
23
|
+
static isValidTraceId(value) {
|
|
24
|
+
return /^[0-9a-fA-F]{16}$|^[0-9a-fA-F]{32}$/.test(value);
|
|
25
|
+
}
|
|
26
|
+
static createHexId(bytes) {
|
|
27
|
+
return randomBytes(bytes).toString('hex');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class RequestContextStore {
|
|
31
|
+
static storage = new AsyncLocalStorage();
|
|
32
|
+
static run(context, callback) {
|
|
33
|
+
return this.storage.run(context, callback);
|
|
34
|
+
}
|
|
35
|
+
static get() {
|
|
36
|
+
return this.storage.getStore();
|
|
37
|
+
}
|
|
38
|
+
static getOrThrow() {
|
|
39
|
+
const context = this.get();
|
|
40
|
+
if (!context) {
|
|
41
|
+
throw new Error('Request context is not available');
|
|
42
|
+
}
|
|
43
|
+
return context;
|
|
44
|
+
}
|
|
45
|
+
static getMdc() {
|
|
46
|
+
return this.get()?.mdc ?? {};
|
|
47
|
+
}
|
|
48
|
+
static setMdc(key, value) {
|
|
49
|
+
const context = this.getOrThrow();
|
|
50
|
+
context.mdc[key] = value;
|
|
51
|
+
}
|
|
52
|
+
static setManyMdc(values) {
|
|
53
|
+
const context = this.getOrThrow();
|
|
54
|
+
Object.assign(context.mdc, values);
|
|
55
|
+
}
|
|
56
|
+
static getMdcValue(key) {
|
|
57
|
+
return this.get()?.mdc[key];
|
|
58
|
+
}
|
|
59
|
+
static removeMdc(key) {
|
|
60
|
+
if (key === 'requestId' || key === 'traceId' || key === 'spanId') {
|
|
61
|
+
throw new Error(`Cannot remove protected MDC key: ${key}`);
|
|
62
|
+
}
|
|
63
|
+
const context = this.getOrThrow();
|
|
64
|
+
delete context.mdc[key];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function runWithNodeContext(callback, options) {
|
|
68
|
+
const context = TraceContextFactory.create(options);
|
|
69
|
+
return RequestContextStore.run(context, callback);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LogLevel, LogSink } from '@smb-tech/logger-core';
|
|
2
|
+
export type LoggerMode = 'sync' | 'async';
|
|
3
|
+
export interface LoggerConfig {
|
|
4
|
+
mode: LoggerMode;
|
|
5
|
+
flushIntervalMs?: number;
|
|
6
|
+
maxQueueSize?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class NodeLogSink implements LogSink {
|
|
9
|
+
private static initialized;
|
|
10
|
+
private static mode;
|
|
11
|
+
private static flushIntervalMs;
|
|
12
|
+
private static maxQueueSize;
|
|
13
|
+
private static queue;
|
|
14
|
+
private static timer?;
|
|
15
|
+
private static flushing;
|
|
16
|
+
static initialize(config: LoggerConfig): void;
|
|
17
|
+
static isInitialized(): boolean;
|
|
18
|
+
static shutdown(): Promise<void>;
|
|
19
|
+
dispatch(line: string, level: LogLevel): void;
|
|
20
|
+
private static flush;
|
|
21
|
+
private static write;
|
|
22
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export class NodeLogSink {
|
|
2
|
+
static initialized = false;
|
|
3
|
+
static mode = 'sync';
|
|
4
|
+
static flushIntervalMs = 10;
|
|
5
|
+
static maxQueueSize = 10000;
|
|
6
|
+
static queue = [];
|
|
7
|
+
static timer;
|
|
8
|
+
static flushing = false;
|
|
9
|
+
static initialize(config) {
|
|
10
|
+
if (this.initialized) {
|
|
11
|
+
throw new Error('NodeLogSink has already been initialized');
|
|
12
|
+
}
|
|
13
|
+
this.mode = config.mode;
|
|
14
|
+
this.flushIntervalMs = config.flushIntervalMs ?? 10;
|
|
15
|
+
this.maxQueueSize = config.maxQueueSize ?? 10000;
|
|
16
|
+
if (this.mode === 'async') {
|
|
17
|
+
this.timer = setInterval(() => {
|
|
18
|
+
void this.flush();
|
|
19
|
+
}, this.flushIntervalMs);
|
|
20
|
+
this.timer.unref?.();
|
|
21
|
+
}
|
|
22
|
+
this.initialized = true;
|
|
23
|
+
}
|
|
24
|
+
static isInitialized() {
|
|
25
|
+
return this.initialized;
|
|
26
|
+
}
|
|
27
|
+
static async shutdown() {
|
|
28
|
+
if (!this.initialized) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (this.timer) {
|
|
32
|
+
clearInterval(this.timer);
|
|
33
|
+
this.timer = undefined;
|
|
34
|
+
}
|
|
35
|
+
await this.flush();
|
|
36
|
+
}
|
|
37
|
+
dispatch(line, level) {
|
|
38
|
+
if (!NodeLogSink.initialized) {
|
|
39
|
+
throw new Error('NodeLogSink is not initialized');
|
|
40
|
+
}
|
|
41
|
+
const stream = level === 'ERROR' || level === 'WARN' ? 'stderr' : 'stdout';
|
|
42
|
+
if (NodeLogSink.mode === 'sync') {
|
|
43
|
+
NodeLogSink.write(line, stream);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (NodeLogSink.queue.length >= NodeLogSink.maxQueueSize) {
|
|
47
|
+
NodeLogSink.write(line, stream);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
NodeLogSink.queue.push({ line, stream });
|
|
51
|
+
}
|
|
52
|
+
static async flush() {
|
|
53
|
+
if (this.flushing || this.queue.length === 0) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.flushing = true;
|
|
57
|
+
try {
|
|
58
|
+
while (this.queue.length > 0) {
|
|
59
|
+
const entry = this.queue.shift();
|
|
60
|
+
if (entry) {
|
|
61
|
+
this.write(entry.line, entry.stream);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
this.flushing = false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
static write(line, stream) {
|
|
70
|
+
const output = `${line}\n`;
|
|
71
|
+
if (stream === 'stderr') {
|
|
72
|
+
process.stderr.write(output);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
process.stdout.write(output);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/express.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RequestContextStore, TraceContextFactory } from './context.js';
|
|
2
|
+
export function requestTraceMiddleware(req, res, next) {
|
|
3
|
+
const incomingTraceId = req.header('X-B3-TraceId') ?? undefined;
|
|
4
|
+
const context = TraceContextFactory.create({ traceId: incomingTraceId });
|
|
5
|
+
res.setHeader('x-request-id', context.mdc.requestId);
|
|
6
|
+
res.setHeader('X-B3-TraceId', context.mdc.traceId);
|
|
7
|
+
res.setHeader('X-B3-SpanId', context.mdc.spanId);
|
|
8
|
+
RequestContextStore.run(context, () => next());
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACpF,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAEzE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjD,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
package/dist/logger.d.ts
ADDED
package/dist/logger.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import { Logger } from '@smb-tech/logger-core';
|
|
3
|
+
import { RequestContextStore } from './context.js';
|
|
4
|
+
import { NodeLogSink } from './dispatcher.js';
|
|
5
|
+
class NodeRuntimeDetailsProvider {
|
|
6
|
+
getThreadLabel() {
|
|
7
|
+
return `pid-${process.pid}@${os.hostname()}`;
|
|
8
|
+
}
|
|
9
|
+
fallbackId() {
|
|
10
|
+
return Math.random().toString(16).slice(2, 18).padEnd(16, '0');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const runtimeDetailsProvider = new NodeRuntimeDetailsProvider();
|
|
14
|
+
const sink = new NodeLogSink();
|
|
15
|
+
export class NodeLogger {
|
|
16
|
+
static get(contextName) {
|
|
17
|
+
return new Logger(contextName, {
|
|
18
|
+
getMdc: () => RequestContextStore.getMdc()
|
|
19
|
+
}, sink, runtimeDetailsProvider);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,0BAA0B;IAC9B,cAAc;QACZ,OAAO,OAAO,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;CACF;AAED,MAAM,sBAAsB,GAAG,IAAI,0BAA0B,EAAE,CAAC;AAChE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,GAAG,CAAC,WAAmB;QAC5B,OAAO,IAAI,MAAM,CACf,WAAW,EACX;YACE,MAAM,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE;SAC3C,EACD,IAAI,EACJ,sBAAsB,CACvB,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@smb-tech/logger-node",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Node.js adapter for structured logging with AsyncLocalStorage context propagation",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -p tsconfig.json"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@smb-tech/logger-core": "1.0.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/express": "^5.0.1",
|
|
27
|
+
"typescript": "^5.8.2"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
}
|
|
32
|
+
}
|