@point3/observability 0.2.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 +383 -0
- package/dist/index.cjs +346 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/dist/nest/index.cjs +274 -0
- package/dist/nest/index.cjs.map +1 -0
- package/dist/nest/index.d.cts +19 -0
- package/dist/nest/index.d.ts +19 -0
- package/dist/nest/index.js +272 -0
- package/dist/nest/index.js.map +1 -0
- package/dist/register.cjs +345 -0
- package/dist/register.cjs.map +1 -0
- package/dist/register.d.cts +33 -0
- package/dist/register.d.ts +33 -0
- package/dist/register.js +343 -0
- package/dist/register.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/log/types.ts","../../src/log/stdout-formatter.ts","../../src/log/emit.ts","../../src/nest/point3-logger.ts","../../src/nest/point3-logger.module.ts"],"names":["SeverityNumber","logs","trace","utilFormat","Point3LoggerModule","Global","Module"],"mappings":"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","file":"index.cjs","sourcesContent":["import { SeverityNumber } from \"@opentelemetry/api-logs\";\n\nexport type LogLevel = \"fatal\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"verbose\";\n\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n fatal: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n verbose: 5,\n};\n\nexport const SEVERITY_NUMBER: Record<LogLevel, SeverityNumber> = {\n fatal: SeverityNumber.FATAL,\n error: SeverityNumber.ERROR,\n warn: SeverityNumber.WARN,\n info: SeverityNumber.INFO,\n debug: SeverityNumber.DEBUG,\n verbose: SeverityNumber.TRACE,\n};\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n traceId?: string;\n spanId?: string;\n attributes?: Record<string, unknown>;\n error?: Error;\n}\n","import type { LogEntry, LogLevel } from \"./types\";\n\nconst RESET = \"\\x1b[0m\";\nconst RED = \"\\x1b[31m\";\nconst YELLOW = \"\\x1b[33m\";\nconst GREEN = \"\\x1b[32m\";\nconst GRAY = \"\\x1b[90m\";\nconst MAGENTA = \"\\x1b[35m\";\nconst CYAN = \"\\x1b[36m\";\n\nconst LEVEL_COLOR: Record<LogLevel, string> = {\n fatal: MAGENTA,\n error: RED,\n warn: YELLOW,\n info: GREEN,\n debug: CYAN,\n verbose: GRAY,\n};\n\nfunction formatTimestamp(date: Date): string {\n return date.toISOString();\n}\n\nexport function formatPretty(entry: LogEntry): string {\n const color = LEVEL_COLOR[entry.level];\n const level = `${color}${entry.level.toUpperCase().padEnd(7)}${RESET}`;\n const timestamp = `${GRAY}${formatTimestamp(entry.timestamp)}${RESET}`;\n const message = entry.message;\n\n let line = `${level} ${timestamp} ${message}`;\n\n if (entry.traceId) {\n line += ` ${GRAY}trace_id=${entry.traceId}${RESET}`;\n }\n\n if (entry.error) {\n line += `\\n${RED}${entry.error.stack ?? entry.error.message}${RESET}`;\n }\n\n if (entry.attributes && Object.keys(entry.attributes).length > 0) {\n line += ` ${GRAY}${JSON.stringify(entry.attributes)}${RESET}`;\n }\n\n return line;\n}\n\nexport function formatJson(entry: LogEntry): string {\n const seen = new WeakSet<object>();\n\n const record: Record<string, unknown> = {\n level: entry.level,\n message: entry.message,\n timestamp: entry.timestamp.toISOString(),\n };\n\n if (entry.traceId) record.trace_id = entry.traceId;\n if (entry.spanId) record.span_id = entry.spanId;\n if (entry.attributes) record.attributes = entry.attributes;\n if (entry.error) {\n record.error = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n return JSON.stringify(record, (_key, value: unknown) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n }\n return value;\n });\n}\n\nexport function format(entry: LogEntry): string {\n if (process.env.NODE_ENV === \"production\") {\n return formatJson(entry);\n }\n return formatPretty(entry);\n}\n","import { format as utilFormat } from \"node:util\";\nimport { trace } from \"@opentelemetry/api\";\nimport { logs, SeverityNumber } from \"@opentelemetry/api-logs\";\nimport type { Logger } from \"@opentelemetry/api-logs\";\n\nimport type { LogEntry, LogLevel } from \"./types\";\nimport { LOG_LEVEL_PRIORITY, SEVERITY_NUMBER } from \"./types\";\nimport { format } from \"./stdout-formatter\";\n\nconst LIB_NAME = \"@point3/observability\";\n\nconst _originalConsole = {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n} as const;\n\nlet _isEmitting = false;\n\nlet _otelLogger: Logger | undefined;\n\nfunction getOtelLogger(): Logger {\n if (!_otelLogger) {\n _otelLogger = logs.getLogger(LIB_NAME);\n }\n return _otelLogger;\n}\n\nexport function getOriginalConsole(): typeof _originalConsole {\n return _originalConsole;\n}\n\nexport function getConfiguredLogLevel(): LogLevel {\n const env = process.env.LOG_LEVEL?.toLowerCase();\n if (env && env in LOG_LEVEL_PRIORITY) {\n return env as LogLevel;\n }\n return \"info\";\n}\n\nexport function shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[getConfiguredLogLevel()];\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n if (value instanceof Error) return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\nfunction extractActiveSpan(): { traceId?: string; spanId?: string } {\n const span = trace.getActiveSpan();\n if (!span) return {};\n\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nfunction buildMessage(args: unknown[]): { message: string; attributes?: Record<string, unknown>; error?: Error } {\n if (args.length === 0) return { message: \"\" };\n\n const first = args[0];\n\n if (isPlainObject(first)) {\n const { message, ...rest } = first;\n const msg = typeof message === \"string\" ? message : utilFormat(first);\n const attributes = Object.keys(rest).length > 0 ? rest : undefined;\n return { message: msg, attributes };\n }\n\n let error: Error | undefined;\n for (const arg of args) {\n if (arg instanceof Error) {\n error = arg;\n break;\n }\n }\n\n return { message: utilFormat(...args), error };\n}\n\nconst STDERR_LEVELS: ReadonlySet<LogLevel> = new Set([\"error\", \"fatal\"]);\n\nexport function emitLog(level: LogLevel, args: unknown[]): void {\n if (!shouldLog(level)) return;\n\n if (_isEmitting) {\n const consoleFn = STDERR_LEVELS.has(level) ? _originalConsole.error : _originalConsole.log;\n consoleFn(utilFormat(...args));\n return;\n }\n\n _isEmitting = true;\n try {\n const { message, attributes, error } = buildMessage(args);\n const { traceId, spanId } = extractActiveSpan();\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n traceId,\n spanId,\n attributes,\n error,\n };\n\n const output = format(entry);\n if (STDERR_LEVELS.has(level)) {\n process.stderr.write(output + \"\\n\");\n } else {\n process.stdout.write(output + \"\\n\");\n }\n\n const otelLogger = getOtelLogger();\n otelLogger.emit({\n severityNumber: SEVERITY_NUMBER[level],\n severityText: level.toUpperCase(),\n body: message,\n attributes: {\n ...attributes,\n ...(error && {\n \"exception.type\": error.name,\n \"exception.message\": error.message,\n \"exception.stacktrace\": error.stack,\n }),\n },\n });\n } finally {\n _isEmitting = false;\n }\n}\n","import type { LoggerService, LogLevel } from \"@nestjs/common\";\n\nimport { emitLog } from \"../log/emit\";\nimport type { LogLevel as Point3LogLevel } from \"../log/types\";\n\nconst NEST_LEVEL_MAP: Record<string, Point3LogLevel> = {\n log: \"info\",\n error: \"error\",\n warn: \"warn\",\n debug: \"debug\",\n verbose: \"verbose\",\n fatal: \"fatal\",\n};\n\nfunction isStackTrace(value: unknown): value is string {\n return typeof value === \"string\" && value.includes(\"\\n\") && value.includes(\"at \");\n}\n\nfunction extractContext(params: unknown[]): { context?: string; rest: unknown[] } {\n if (params.length === 0) return { rest: [] };\n\n const last = params[params.length - 1];\n if (typeof last === \"string\" && !isStackTrace(last)) {\n return { context: last, rest: params.slice(0, -1) };\n }\n\n return { rest: [...params] };\n}\n\nexport class Point3Logger implements LoggerService {\n private readonly defaultContext?: string;\n\n constructor(context?: string) {\n this.defaultContext = context;\n }\n\n log(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"log\", message, optionalParams);\n }\n\n error(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"error\", message, optionalParams);\n }\n\n warn(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"warn\", message, optionalParams);\n }\n\n debug?(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"debug\", message, optionalParams);\n }\n\n verbose?(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"verbose\", message, optionalParams);\n }\n\n fatal?(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"fatal\", message, optionalParams);\n }\n\n setLogLevels?(_levels: LogLevel[]): void {\n // no-op: log level is controlled by LOG_LEVEL env var\n }\n\n private emit(nestLevel: string, message: unknown, optionalParams: unknown[]): void {\n const { context, rest } = extractContext(optionalParams);\n const resolvedContext = context ?? this.defaultContext;\n\n const level = NEST_LEVEL_MAP[nestLevel] ?? \"info\";\n\n const args: unknown[] = [message, ...rest];\n\n if (resolvedContext) {\n const attrs = { \"nest.context\": resolvedContext };\n if (args.length === 1 && typeof args[0] === \"string\") {\n args[0] = { message: args[0], ...attrs };\n } else {\n args.push(attrs);\n }\n }\n\n emitLog(level, args);\n }\n}\n","import { Global, Module } from \"@nestjs/common\";\n\nimport { Point3Logger } from \"./point3-logger\";\n\n@Global()\n@Module({\n providers: [Point3Logger],\n exports: [Point3Logger],\n})\nexport class Point3LoggerModule {}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LoggerService, LogLevel } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
declare class Point3Logger implements LoggerService {
|
|
4
|
+
private readonly defaultContext?;
|
|
5
|
+
constructor(context?: string);
|
|
6
|
+
log(message: unknown, ...optionalParams: unknown[]): void;
|
|
7
|
+
error(message: unknown, ...optionalParams: unknown[]): void;
|
|
8
|
+
warn(message: unknown, ...optionalParams: unknown[]): void;
|
|
9
|
+
debug?(message: unknown, ...optionalParams: unknown[]): void;
|
|
10
|
+
verbose?(message: unknown, ...optionalParams: unknown[]): void;
|
|
11
|
+
fatal?(message: unknown, ...optionalParams: unknown[]): void;
|
|
12
|
+
setLogLevels?(_levels: LogLevel[]): void;
|
|
13
|
+
private emit;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare class Point3LoggerModule {
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { Point3Logger, Point3LoggerModule };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LoggerService, LogLevel } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
declare class Point3Logger implements LoggerService {
|
|
4
|
+
private readonly defaultContext?;
|
|
5
|
+
constructor(context?: string);
|
|
6
|
+
log(message: unknown, ...optionalParams: unknown[]): void;
|
|
7
|
+
error(message: unknown, ...optionalParams: unknown[]): void;
|
|
8
|
+
warn(message: unknown, ...optionalParams: unknown[]): void;
|
|
9
|
+
debug?(message: unknown, ...optionalParams: unknown[]): void;
|
|
10
|
+
verbose?(message: unknown, ...optionalParams: unknown[]): void;
|
|
11
|
+
fatal?(message: unknown, ...optionalParams: unknown[]): void;
|
|
12
|
+
setLogLevels?(_levels: LogLevel[]): void;
|
|
13
|
+
private emit;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare class Point3LoggerModule {
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { Point3Logger, Point3LoggerModule };
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { format as format$1 } from 'util';
|
|
2
|
+
import { trace } from '@opentelemetry/api';
|
|
3
|
+
import { SeverityNumber, logs } from '@opentelemetry/api-logs';
|
|
4
|
+
import { Global, Module } from '@nestjs/common';
|
|
5
|
+
|
|
6
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
8
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
9
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
10
|
+
if (decorator = decorators[i])
|
|
11
|
+
result = (decorator(result)) || result;
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
var LOG_LEVEL_PRIORITY = {
|
|
15
|
+
fatal: 0,
|
|
16
|
+
error: 1,
|
|
17
|
+
warn: 2,
|
|
18
|
+
info: 3,
|
|
19
|
+
debug: 4,
|
|
20
|
+
verbose: 5
|
|
21
|
+
};
|
|
22
|
+
var SEVERITY_NUMBER = {
|
|
23
|
+
fatal: SeverityNumber.FATAL,
|
|
24
|
+
error: SeverityNumber.ERROR,
|
|
25
|
+
warn: SeverityNumber.WARN,
|
|
26
|
+
info: SeverityNumber.INFO,
|
|
27
|
+
debug: SeverityNumber.DEBUG,
|
|
28
|
+
verbose: SeverityNumber.TRACE
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// src/log/stdout-formatter.ts
|
|
32
|
+
var RESET = "\x1B[0m";
|
|
33
|
+
var RED = "\x1B[31m";
|
|
34
|
+
var YELLOW = "\x1B[33m";
|
|
35
|
+
var GREEN = "\x1B[32m";
|
|
36
|
+
var GRAY = "\x1B[90m";
|
|
37
|
+
var MAGENTA = "\x1B[35m";
|
|
38
|
+
var CYAN = "\x1B[36m";
|
|
39
|
+
var LEVEL_COLOR = {
|
|
40
|
+
fatal: MAGENTA,
|
|
41
|
+
error: RED,
|
|
42
|
+
warn: YELLOW,
|
|
43
|
+
info: GREEN,
|
|
44
|
+
debug: CYAN,
|
|
45
|
+
verbose: GRAY
|
|
46
|
+
};
|
|
47
|
+
function formatTimestamp(date) {
|
|
48
|
+
return date.toISOString();
|
|
49
|
+
}
|
|
50
|
+
function formatPretty(entry) {
|
|
51
|
+
const color = LEVEL_COLOR[entry.level];
|
|
52
|
+
const level = `${color}${entry.level.toUpperCase().padEnd(7)}${RESET}`;
|
|
53
|
+
const timestamp = `${GRAY}${formatTimestamp(entry.timestamp)}${RESET}`;
|
|
54
|
+
const message = entry.message;
|
|
55
|
+
let line = `${level} ${timestamp} ${message}`;
|
|
56
|
+
if (entry.traceId) {
|
|
57
|
+
line += ` ${GRAY}trace_id=${entry.traceId}${RESET}`;
|
|
58
|
+
}
|
|
59
|
+
if (entry.error) {
|
|
60
|
+
line += `
|
|
61
|
+
${RED}${entry.error.stack ?? entry.error.message}${RESET}`;
|
|
62
|
+
}
|
|
63
|
+
if (entry.attributes && Object.keys(entry.attributes).length > 0) {
|
|
64
|
+
line += ` ${GRAY}${JSON.stringify(entry.attributes)}${RESET}`;
|
|
65
|
+
}
|
|
66
|
+
return line;
|
|
67
|
+
}
|
|
68
|
+
function formatJson(entry) {
|
|
69
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
70
|
+
const record = {
|
|
71
|
+
level: entry.level,
|
|
72
|
+
message: entry.message,
|
|
73
|
+
timestamp: entry.timestamp.toISOString()
|
|
74
|
+
};
|
|
75
|
+
if (entry.traceId) record.trace_id = entry.traceId;
|
|
76
|
+
if (entry.spanId) record.span_id = entry.spanId;
|
|
77
|
+
if (entry.attributes) record.attributes = entry.attributes;
|
|
78
|
+
if (entry.error) {
|
|
79
|
+
record.error = {
|
|
80
|
+
name: entry.error.name,
|
|
81
|
+
message: entry.error.message,
|
|
82
|
+
stack: entry.error.stack
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return JSON.stringify(record, (_key, value) => {
|
|
86
|
+
if (typeof value === "object" && value !== null) {
|
|
87
|
+
if (seen.has(value)) return "[Circular]";
|
|
88
|
+
seen.add(value);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function format(entry) {
|
|
94
|
+
if (process.env.NODE_ENV === "production") {
|
|
95
|
+
return formatJson(entry);
|
|
96
|
+
}
|
|
97
|
+
return formatPretty(entry);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// src/log/emit.ts
|
|
101
|
+
var LIB_NAME = "@point3/observability";
|
|
102
|
+
var _originalConsole = {
|
|
103
|
+
log: console.log,
|
|
104
|
+
error: console.error};
|
|
105
|
+
var _isEmitting = false;
|
|
106
|
+
var _otelLogger;
|
|
107
|
+
function getOtelLogger() {
|
|
108
|
+
if (!_otelLogger) {
|
|
109
|
+
_otelLogger = logs.getLogger(LIB_NAME);
|
|
110
|
+
}
|
|
111
|
+
return _otelLogger;
|
|
112
|
+
}
|
|
113
|
+
function getConfiguredLogLevel() {
|
|
114
|
+
const env = process.env.LOG_LEVEL?.toLowerCase();
|
|
115
|
+
if (env && env in LOG_LEVEL_PRIORITY) {
|
|
116
|
+
return env;
|
|
117
|
+
}
|
|
118
|
+
return "info";
|
|
119
|
+
}
|
|
120
|
+
function shouldLog(level) {
|
|
121
|
+
return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[getConfiguredLogLevel()];
|
|
122
|
+
}
|
|
123
|
+
function isPlainObject(value) {
|
|
124
|
+
if (value === null || typeof value !== "object") return false;
|
|
125
|
+
if (value instanceof Error) return false;
|
|
126
|
+
const proto = Object.getPrototypeOf(value);
|
|
127
|
+
return proto === Object.prototype || proto === null;
|
|
128
|
+
}
|
|
129
|
+
function extractActiveSpan() {
|
|
130
|
+
const span = trace.getActiveSpan();
|
|
131
|
+
if (!span) return {};
|
|
132
|
+
const ctx = span.spanContext();
|
|
133
|
+
return { traceId: ctx.traceId, spanId: ctx.spanId };
|
|
134
|
+
}
|
|
135
|
+
function buildMessage(args) {
|
|
136
|
+
if (args.length === 0) return { message: "" };
|
|
137
|
+
const first = args[0];
|
|
138
|
+
if (isPlainObject(first)) {
|
|
139
|
+
const { message, ...rest } = first;
|
|
140
|
+
const msg = typeof message === "string" ? message : format$1(first);
|
|
141
|
+
const attributes = Object.keys(rest).length > 0 ? rest : void 0;
|
|
142
|
+
return { message: msg, attributes };
|
|
143
|
+
}
|
|
144
|
+
let error;
|
|
145
|
+
for (const arg of args) {
|
|
146
|
+
if (arg instanceof Error) {
|
|
147
|
+
error = arg;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return { message: format$1(...args), error };
|
|
152
|
+
}
|
|
153
|
+
var STDERR_LEVELS = /* @__PURE__ */ new Set(["error", "fatal"]);
|
|
154
|
+
function emitLog(level, args) {
|
|
155
|
+
if (!shouldLog(level)) return;
|
|
156
|
+
if (_isEmitting) {
|
|
157
|
+
const consoleFn = STDERR_LEVELS.has(level) ? _originalConsole.error : _originalConsole.log;
|
|
158
|
+
consoleFn(format$1(...args));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
_isEmitting = true;
|
|
162
|
+
try {
|
|
163
|
+
const { message, attributes, error } = buildMessage(args);
|
|
164
|
+
const { traceId, spanId } = extractActiveSpan();
|
|
165
|
+
const entry = {
|
|
166
|
+
level,
|
|
167
|
+
message,
|
|
168
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
169
|
+
traceId,
|
|
170
|
+
spanId,
|
|
171
|
+
attributes,
|
|
172
|
+
error
|
|
173
|
+
};
|
|
174
|
+
const output = format(entry);
|
|
175
|
+
if (STDERR_LEVELS.has(level)) {
|
|
176
|
+
process.stderr.write(output + "\n");
|
|
177
|
+
} else {
|
|
178
|
+
process.stdout.write(output + "\n");
|
|
179
|
+
}
|
|
180
|
+
const otelLogger = getOtelLogger();
|
|
181
|
+
otelLogger.emit({
|
|
182
|
+
severityNumber: SEVERITY_NUMBER[level],
|
|
183
|
+
severityText: level.toUpperCase(),
|
|
184
|
+
body: message,
|
|
185
|
+
attributes: {
|
|
186
|
+
...attributes,
|
|
187
|
+
...error && {
|
|
188
|
+
"exception.type": error.name,
|
|
189
|
+
"exception.message": error.message,
|
|
190
|
+
"exception.stacktrace": error.stack
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
} finally {
|
|
195
|
+
_isEmitting = false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/nest/point3-logger.ts
|
|
200
|
+
var NEST_LEVEL_MAP = {
|
|
201
|
+
log: "info",
|
|
202
|
+
error: "error",
|
|
203
|
+
warn: "warn",
|
|
204
|
+
debug: "debug",
|
|
205
|
+
verbose: "verbose",
|
|
206
|
+
fatal: "fatal"
|
|
207
|
+
};
|
|
208
|
+
function isStackTrace(value) {
|
|
209
|
+
return typeof value === "string" && value.includes("\n") && value.includes("at ");
|
|
210
|
+
}
|
|
211
|
+
function extractContext(params) {
|
|
212
|
+
if (params.length === 0) return { rest: [] };
|
|
213
|
+
const last = params[params.length - 1];
|
|
214
|
+
if (typeof last === "string" && !isStackTrace(last)) {
|
|
215
|
+
return { context: last, rest: params.slice(0, -1) };
|
|
216
|
+
}
|
|
217
|
+
return { rest: [...params] };
|
|
218
|
+
}
|
|
219
|
+
var Point3Logger = class {
|
|
220
|
+
defaultContext;
|
|
221
|
+
constructor(context) {
|
|
222
|
+
this.defaultContext = context;
|
|
223
|
+
}
|
|
224
|
+
log(message, ...optionalParams) {
|
|
225
|
+
this.emit("log", message, optionalParams);
|
|
226
|
+
}
|
|
227
|
+
error(message, ...optionalParams) {
|
|
228
|
+
this.emit("error", message, optionalParams);
|
|
229
|
+
}
|
|
230
|
+
warn(message, ...optionalParams) {
|
|
231
|
+
this.emit("warn", message, optionalParams);
|
|
232
|
+
}
|
|
233
|
+
debug(message, ...optionalParams) {
|
|
234
|
+
this.emit("debug", message, optionalParams);
|
|
235
|
+
}
|
|
236
|
+
verbose(message, ...optionalParams) {
|
|
237
|
+
this.emit("verbose", message, optionalParams);
|
|
238
|
+
}
|
|
239
|
+
fatal(message, ...optionalParams) {
|
|
240
|
+
this.emit("fatal", message, optionalParams);
|
|
241
|
+
}
|
|
242
|
+
setLogLevels(_levels) {
|
|
243
|
+
}
|
|
244
|
+
emit(nestLevel, message, optionalParams) {
|
|
245
|
+
const { context, rest } = extractContext(optionalParams);
|
|
246
|
+
const resolvedContext = context ?? this.defaultContext;
|
|
247
|
+
const level = NEST_LEVEL_MAP[nestLevel] ?? "info";
|
|
248
|
+
const args = [message, ...rest];
|
|
249
|
+
if (resolvedContext) {
|
|
250
|
+
const attrs = { "nest.context": resolvedContext };
|
|
251
|
+
if (args.length === 1 && typeof args[0] === "string") {
|
|
252
|
+
args[0] = { message: args[0], ...attrs };
|
|
253
|
+
} else {
|
|
254
|
+
args.push(attrs);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
emitLog(level, args);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
var Point3LoggerModule = class {
|
|
261
|
+
};
|
|
262
|
+
Point3LoggerModule = __decorateClass([
|
|
263
|
+
Global(),
|
|
264
|
+
Module({
|
|
265
|
+
providers: [Point3Logger],
|
|
266
|
+
exports: [Point3Logger]
|
|
267
|
+
})
|
|
268
|
+
], Point3LoggerModule);
|
|
269
|
+
|
|
270
|
+
export { Point3Logger, Point3LoggerModule };
|
|
271
|
+
//# sourceMappingURL=index.js.map
|
|
272
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/log/types.ts","../../src/log/stdout-formatter.ts","../../src/log/emit.ts","../../src/nest/point3-logger.ts","../../src/nest/point3-logger.module.ts"],"names":["utilFormat"],"mappings":"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","file":"index.js","sourcesContent":["import { SeverityNumber } from \"@opentelemetry/api-logs\";\n\nexport type LogLevel = \"fatal\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"verbose\";\n\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n fatal: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n verbose: 5,\n};\n\nexport const SEVERITY_NUMBER: Record<LogLevel, SeverityNumber> = {\n fatal: SeverityNumber.FATAL,\n error: SeverityNumber.ERROR,\n warn: SeverityNumber.WARN,\n info: SeverityNumber.INFO,\n debug: SeverityNumber.DEBUG,\n verbose: SeverityNumber.TRACE,\n};\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n traceId?: string;\n spanId?: string;\n attributes?: Record<string, unknown>;\n error?: Error;\n}\n","import type { LogEntry, LogLevel } from \"./types\";\n\nconst RESET = \"\\x1b[0m\";\nconst RED = \"\\x1b[31m\";\nconst YELLOW = \"\\x1b[33m\";\nconst GREEN = \"\\x1b[32m\";\nconst GRAY = \"\\x1b[90m\";\nconst MAGENTA = \"\\x1b[35m\";\nconst CYAN = \"\\x1b[36m\";\n\nconst LEVEL_COLOR: Record<LogLevel, string> = {\n fatal: MAGENTA,\n error: RED,\n warn: YELLOW,\n info: GREEN,\n debug: CYAN,\n verbose: GRAY,\n};\n\nfunction formatTimestamp(date: Date): string {\n return date.toISOString();\n}\n\nexport function formatPretty(entry: LogEntry): string {\n const color = LEVEL_COLOR[entry.level];\n const level = `${color}${entry.level.toUpperCase().padEnd(7)}${RESET}`;\n const timestamp = `${GRAY}${formatTimestamp(entry.timestamp)}${RESET}`;\n const message = entry.message;\n\n let line = `${level} ${timestamp} ${message}`;\n\n if (entry.traceId) {\n line += ` ${GRAY}trace_id=${entry.traceId}${RESET}`;\n }\n\n if (entry.error) {\n line += `\\n${RED}${entry.error.stack ?? entry.error.message}${RESET}`;\n }\n\n if (entry.attributes && Object.keys(entry.attributes).length > 0) {\n line += ` ${GRAY}${JSON.stringify(entry.attributes)}${RESET}`;\n }\n\n return line;\n}\n\nexport function formatJson(entry: LogEntry): string {\n const seen = new WeakSet<object>();\n\n const record: Record<string, unknown> = {\n level: entry.level,\n message: entry.message,\n timestamp: entry.timestamp.toISOString(),\n };\n\n if (entry.traceId) record.trace_id = entry.traceId;\n if (entry.spanId) record.span_id = entry.spanId;\n if (entry.attributes) record.attributes = entry.attributes;\n if (entry.error) {\n record.error = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n return JSON.stringify(record, (_key, value: unknown) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n }\n return value;\n });\n}\n\nexport function format(entry: LogEntry): string {\n if (process.env.NODE_ENV === \"production\") {\n return formatJson(entry);\n }\n return formatPretty(entry);\n}\n","import { format as utilFormat } from \"node:util\";\nimport { trace } from \"@opentelemetry/api\";\nimport { logs, SeverityNumber } from \"@opentelemetry/api-logs\";\nimport type { Logger } from \"@opentelemetry/api-logs\";\n\nimport type { LogEntry, LogLevel } from \"./types\";\nimport { LOG_LEVEL_PRIORITY, SEVERITY_NUMBER } from \"./types\";\nimport { format } from \"./stdout-formatter\";\n\nconst LIB_NAME = \"@point3/observability\";\n\nconst _originalConsole = {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n} as const;\n\nlet _isEmitting = false;\n\nlet _otelLogger: Logger | undefined;\n\nfunction getOtelLogger(): Logger {\n if (!_otelLogger) {\n _otelLogger = logs.getLogger(LIB_NAME);\n }\n return _otelLogger;\n}\n\nexport function getOriginalConsole(): typeof _originalConsole {\n return _originalConsole;\n}\n\nexport function getConfiguredLogLevel(): LogLevel {\n const env = process.env.LOG_LEVEL?.toLowerCase();\n if (env && env in LOG_LEVEL_PRIORITY) {\n return env as LogLevel;\n }\n return \"info\";\n}\n\nexport function shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[getConfiguredLogLevel()];\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n if (value instanceof Error) return false;\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\nfunction extractActiveSpan(): { traceId?: string; spanId?: string } {\n const span = trace.getActiveSpan();\n if (!span) return {};\n\n const ctx = span.spanContext();\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nfunction buildMessage(args: unknown[]): { message: string; attributes?: Record<string, unknown>; error?: Error } {\n if (args.length === 0) return { message: \"\" };\n\n const first = args[0];\n\n if (isPlainObject(first)) {\n const { message, ...rest } = first;\n const msg = typeof message === \"string\" ? message : utilFormat(first);\n const attributes = Object.keys(rest).length > 0 ? rest : undefined;\n return { message: msg, attributes };\n }\n\n let error: Error | undefined;\n for (const arg of args) {\n if (arg instanceof Error) {\n error = arg;\n break;\n }\n }\n\n return { message: utilFormat(...args), error };\n}\n\nconst STDERR_LEVELS: ReadonlySet<LogLevel> = new Set([\"error\", \"fatal\"]);\n\nexport function emitLog(level: LogLevel, args: unknown[]): void {\n if (!shouldLog(level)) return;\n\n if (_isEmitting) {\n const consoleFn = STDERR_LEVELS.has(level) ? _originalConsole.error : _originalConsole.log;\n consoleFn(utilFormat(...args));\n return;\n }\n\n _isEmitting = true;\n try {\n const { message, attributes, error } = buildMessage(args);\n const { traceId, spanId } = extractActiveSpan();\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n traceId,\n spanId,\n attributes,\n error,\n };\n\n const output = format(entry);\n if (STDERR_LEVELS.has(level)) {\n process.stderr.write(output + \"\\n\");\n } else {\n process.stdout.write(output + \"\\n\");\n }\n\n const otelLogger = getOtelLogger();\n otelLogger.emit({\n severityNumber: SEVERITY_NUMBER[level],\n severityText: level.toUpperCase(),\n body: message,\n attributes: {\n ...attributes,\n ...(error && {\n \"exception.type\": error.name,\n \"exception.message\": error.message,\n \"exception.stacktrace\": error.stack,\n }),\n },\n });\n } finally {\n _isEmitting = false;\n }\n}\n","import type { LoggerService, LogLevel } from \"@nestjs/common\";\n\nimport { emitLog } from \"../log/emit\";\nimport type { LogLevel as Point3LogLevel } from \"../log/types\";\n\nconst NEST_LEVEL_MAP: Record<string, Point3LogLevel> = {\n log: \"info\",\n error: \"error\",\n warn: \"warn\",\n debug: \"debug\",\n verbose: \"verbose\",\n fatal: \"fatal\",\n};\n\nfunction isStackTrace(value: unknown): value is string {\n return typeof value === \"string\" && value.includes(\"\\n\") && value.includes(\"at \");\n}\n\nfunction extractContext(params: unknown[]): { context?: string; rest: unknown[] } {\n if (params.length === 0) return { rest: [] };\n\n const last = params[params.length - 1];\n if (typeof last === \"string\" && !isStackTrace(last)) {\n return { context: last, rest: params.slice(0, -1) };\n }\n\n return { rest: [...params] };\n}\n\nexport class Point3Logger implements LoggerService {\n private readonly defaultContext?: string;\n\n constructor(context?: string) {\n this.defaultContext = context;\n }\n\n log(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"log\", message, optionalParams);\n }\n\n error(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"error\", message, optionalParams);\n }\n\n warn(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"warn\", message, optionalParams);\n }\n\n debug?(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"debug\", message, optionalParams);\n }\n\n verbose?(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"verbose\", message, optionalParams);\n }\n\n fatal?(message: unknown, ...optionalParams: unknown[]): void {\n this.emit(\"fatal\", message, optionalParams);\n }\n\n setLogLevels?(_levels: LogLevel[]): void {\n // no-op: log level is controlled by LOG_LEVEL env var\n }\n\n private emit(nestLevel: string, message: unknown, optionalParams: unknown[]): void {\n const { context, rest } = extractContext(optionalParams);\n const resolvedContext = context ?? this.defaultContext;\n\n const level = NEST_LEVEL_MAP[nestLevel] ?? \"info\";\n\n const args: unknown[] = [message, ...rest];\n\n if (resolvedContext) {\n const attrs = { \"nest.context\": resolvedContext };\n if (args.length === 1 && typeof args[0] === \"string\") {\n args[0] = { message: args[0], ...attrs };\n } else {\n args.push(attrs);\n }\n }\n\n emitLog(level, args);\n }\n}\n","import { Global, Module } from \"@nestjs/common\";\n\nimport { Point3Logger } from \"./point3-logger\";\n\n@Global()\n@Module({\n providers: [Point3Logger],\n exports: [Point3Logger],\n})\nexport class Point3LoggerModule {}\n"]}
|