@contractspec/lib.logger 1.56.1 → 1.58.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/dist/context.browser.d.ts +44 -0
- package/dist/context.browser.d.ts.map +1 -0
- package/dist/context.browser.js +77 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1 -0
- package/dist/context.node.d.ts +43 -0
- package/dist/context.node.d.ts.map +1 -0
- package/dist/context.node.js +62 -0
- package/dist/elysia-plugin.d.ts +58 -0
- package/dist/elysia-plugin.d.ts.map +1 -0
- package/dist/elysia-plugin.js +793 -0
- package/dist/formatters.d.ts +25 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +232 -0
- package/dist/index.browser.d.ts +8 -0
- package/dist/index.browser.d.ts.map +1 -0
- package/dist/index.browser.js +728 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +800 -0
- package/dist/logger.browser.d.ts +48 -0
- package/dist/logger.browser.d.ts.map +1 -0
- package/dist/logger.browser.js +722 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +707 -0
- package/dist/logger.node.d.ts +48 -0
- package/dist/logger.node.d.ts.map +1 -0
- package/dist/logger.node.js +707 -0
- package/dist/node/context.js +0 -0
- package/dist/node/context.node.js +61 -0
- package/dist/node/elysia-plugin.js +792 -0
- package/dist/node/formatters.js +231 -0
- package/dist/node/index.js +799 -0
- package/dist/node/logger.js +706 -0
- package/dist/node/logger.node.js +706 -0
- package/dist/node/timer.js +122 -0
- package/dist/node/tracer.js +274 -0
- package/dist/node/tracer.node.js +274 -0
- package/dist/node/types.js +13 -0
- package/dist/timer.d.ts +99 -0
- package/dist/timer.d.ts.map +1 -0
- package/dist/timer.js +123 -0
- package/dist/tracer.browser.d.ts +47 -0
- package/dist/tracer.browser.d.ts.map +1 -0
- package/dist/tracer.browser.js +290 -0
- package/dist/tracer.d.ts +2 -0
- package/dist/tracer.d.ts.map +1 -0
- package/dist/tracer.js +275 -0
- package/dist/tracer.node.d.ts +47 -0
- package/dist/tracer.node.d.ts.map +1 -0
- package/dist/tracer.node.js +275 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/package.json +112 -42
- package/dist/context.browser.d.mts +0 -49
- package/dist/context.browser.d.mts.map +0 -1
- package/dist/context.browser.mjs +0 -89
- package/dist/context.browser.mjs.map +0 -1
- package/dist/context.d.mts +0 -17
- package/dist/context.d.mts.map +0 -1
- package/dist/context.mjs +0 -1
- package/dist/context.node.d.mts +0 -48
- package/dist/context.node.d.mts.map +0 -1
- package/dist/context.node.mjs +0 -79
- package/dist/context.node.mjs.map +0 -1
- package/dist/elysia-plugin.d.mts +0 -63
- package/dist/elysia-plugin.d.mts.map +0 -1
- package/dist/elysia-plugin.mjs +0 -84
- package/dist/elysia-plugin.mjs.map +0 -1
- package/dist/formatters.d.mts +0 -29
- package/dist/formatters.d.mts.map +0 -1
- package/dist/formatters.mjs +0 -180
- package/dist/formatters.mjs.map +0 -1
- package/dist/index.browser.d.mts +0 -7
- package/dist/index.browser.mjs +0 -8
- package/dist/index.d.mts +0 -8
- package/dist/index.mjs +0 -9
- package/dist/logger.browser.d.mts +0 -51
- package/dist/logger.browser.d.mts.map +0 -1
- package/dist/logger.browser.mjs +0 -190
- package/dist/logger.browser.mjs.map +0 -1
- package/dist/logger.d.mts +0 -2
- package/dist/logger.mjs +0 -3
- package/dist/logger.node.d.mts +0 -51
- package/dist/logger.node.d.mts.map +0 -1
- package/dist/logger.node.mjs +0 -190
- package/dist/logger.node.mjs.map +0 -1
- package/dist/timer.d.mts +0 -103
- package/dist/timer.d.mts.map +0 -1
- package/dist/timer.mjs +0 -165
- package/dist/timer.mjs.map +0 -1
- package/dist/tracer.browser.d.mts +0 -51
- package/dist/tracer.browser.d.mts.map +0 -1
- package/dist/tracer.browser.mjs +0 -116
- package/dist/tracer.browser.mjs.map +0 -1
- package/dist/tracer.d.mts +0 -2
- package/dist/tracer.mjs +0 -3
- package/dist/tracer.node.d.mts +0 -51
- package/dist/tracer.node.d.mts.map +0 -1
- package/dist/tracer.node.mjs +0 -116
- package/dist/tracer.node.mjs.map +0 -1
- package/dist/types.d.mts +0 -71
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs +0 -14
- package/dist/types.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"elysia-plugin.mjs","names":[],"sources":["../src/elysia-plugin.ts"],"sourcesContent":["import { Logger } from './logger.node';\nimport { LogContext } from './context.node';\nimport type { ContextData } from './types';\nimport { Elysia } from 'elysia';\n\nexport interface ElysiaLoggerConfig {\n logger?: Logger;\n logRequests?: boolean;\n logResponses?: boolean;\n excludePaths?: string[];\n}\n\n/**\n * Simple ElysiaJS Logger Plugin\n * Provides automatic request logging and tracing\n */\nexport function elysiaLogger<T extends Elysia>(\n config: ElysiaLoggerConfig = {}\n) {\n const {\n logger = new Logger(),\n logRequests = true,\n logResponses = true,\n excludePaths = ['/health', '/metrics'],\n } = config;\n\n const context = LogContext.getInstance();\n\n // For type compatibility, we use a factory function\n return function (app: T) {\n return app\n .derive((ctx) => {\n const { request, path } = ctx;\n\n // Skip excluded paths\n if (excludePaths.some((excludePath) => path.startsWith(excludePath))) {\n return { logger };\n }\n\n // Create request context\n const url = new URL(request.url);\n const requestContext: ContextData = {\n requestId: context.generateId(),\n method: request.method,\n url: request.url,\n path: url.pathname,\n userAgent: request.headers.get('user-agent') || undefined,\n timestamp: new Date().toISOString(),\n };\n\n const startTime = performance.now();\n\n // Run in context\n context.run(requestContext, () => {\n // Log request\n if (logRequests) {\n logger.info(`→ ${request.method} ${path}`, {\n method: request.method,\n path,\n userAgent: requestContext.userAgent,\n requestId: requestContext.requestId,\n });\n }\n });\n\n return {\n logger,\n requestContext,\n startTime,\n };\n })\n .onAfterHandle((ctx) => {\n const { request, startTime, requestContext, logger } = ctx;\n\n if (!startTime || !requestContext) return;\n\n const duration = performance.now() - startTime;\n const path = new URL(request.url).pathname;\n\n if (logResponses) {\n logger.info(`← 200 ${request.method} ${path}`, {\n method: request.method,\n path,\n duration: `${duration.toFixed(2)}ms`,\n requestId: requestContext.requestId,\n });\n }\n })\n .onError((ctx) => {\n const { request, error, code, startTime, requestContext, logger } = ctx;\n\n if (!startTime || !requestContext) return;\n\n const duration = performance.now() - startTime;\n const path = new URL(request.url).pathname;\n\n logger?.error(`✖ ${code} ${request.method} ${path}`, {\n method: request.method,\n path,\n error: error?.toString?.() || 'Unknown error',\n code,\n duration: `${duration.toFixed(2)}ms`,\n requestId: requestContext.requestId,\n });\n })\n .derive(() => ({\n // Helper functions available in route handlers\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logInfo: (message: string, metadata?: Record<string, any>) => {\n logger.info(message, metadata);\n },\n logError: (\n message: string,\n error?: Error,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n metadata?: Record<string, any>\n ) => {\n logger.error(message, metadata, error);\n },\n traceOperation: async <T>(\n operationName: string,\n operation: () => T | Promise<T>\n ): Promise<T> => {\n return logger.trace(\n {\n operationType: 'custom',\n operationName,\n autoTiming: true,\n },\n operation\n );\n },\n }));\n };\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,aACd,SAA6B,EAAE,EAC/B;CACA,MAAM,EACJ,SAAS,IAAI,QAAQ,EACrB,cAAc,MACd,eAAe,MACf,eAAe,CAAC,WAAW,WAAW,KACpC;CAEJ,MAAM,UAAU,WAAW,aAAa;AAGxC,QAAO,SAAU,KAAQ;AACvB,SAAO,IACJ,QAAQ,QAAQ;GACf,MAAM,EAAE,SAAS,SAAS;AAG1B,OAAI,aAAa,MAAM,gBAAgB,KAAK,WAAW,YAAY,CAAC,CAClE,QAAO,EAAE,QAAQ;GAInB,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;GAChC,MAAM,iBAA8B;IAClC,WAAW,QAAQ,YAAY;IAC/B,QAAQ,QAAQ;IAChB,KAAK,QAAQ;IACb,MAAM,IAAI;IACV,WAAW,QAAQ,QAAQ,IAAI,aAAa,IAAI;IAChD,4BAAW,IAAI,MAAM,EAAC,aAAa;IACpC;GAED,MAAM,YAAY,YAAY,KAAK;AAGnC,WAAQ,IAAI,sBAAsB;AAEhC,QAAI,YACF,QAAO,KAAK,KAAK,QAAQ,OAAO,GAAG,QAAQ;KACzC,QAAQ,QAAQ;KAChB;KACA,WAAW,eAAe;KAC1B,WAAW,eAAe;KAC3B,CAAC;KAEJ;AAEF,UAAO;IACL;IACA;IACA;IACD;IACD,CACD,eAAe,QAAQ;GACtB,MAAM,EAAE,SAAS,WAAW,gBAAgB,qBAAW;AAEvD,OAAI,CAAC,aAAa,CAAC,eAAgB;GAEnC,MAAM,WAAW,YAAY,KAAK,GAAG;GACrC,MAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,CAAC;AAElC,OAAI,aACF,UAAO,KAAK,SAAS,QAAQ,OAAO,GAAG,QAAQ;IAC7C,QAAQ,QAAQ;IAChB;IACA,UAAU,GAAG,SAAS,QAAQ,EAAE,CAAC;IACjC,WAAW,eAAe;IAC3B,CAAC;IAEJ,CACD,SAAS,QAAQ;GAChB,MAAM,EAAE,SAAS,OAAO,MAAM,WAAW,gBAAgB,qBAAW;AAEpE,OAAI,CAAC,aAAa,CAAC,eAAgB;GAEnC,MAAM,WAAW,YAAY,KAAK,GAAG;GACrC,MAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,CAAC;AAElC,aAAQ,MAAM,KAAK,KAAK,GAAG,QAAQ,OAAO,GAAG,QAAQ;IACnD,QAAQ,QAAQ;IAChB;IACA,OAAO,OAAO,YAAY,IAAI;IAC9B;IACA,UAAU,GAAG,SAAS,QAAQ,EAAE,CAAC;IACjC,WAAW,eAAe;IAC3B,CAAC;IACF,CACD,cAAc;GAGb,UAAU,SAAiB,aAAmC;AAC5D,WAAO,KAAK,SAAS,SAAS;;GAEhC,WACE,SACA,OAEA,aACG;AACH,WAAO,MAAM,SAAS,UAAU,MAAM;;GAExC,gBAAgB,OACd,eACA,cACe;AACf,WAAO,OAAO,MACZ;KACE,eAAe;KACf;KACA,YAAY;KACb,EACD,UACD;;GAEJ,EAAE"}
|
package/dist/formatters.d.mts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Formatter, LogEntry } from "./types.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/formatters.d.ts
|
|
4
|
-
declare class DevFormatter implements Formatter {
|
|
5
|
-
private enableColors;
|
|
6
|
-
constructor(enableColors?: boolean);
|
|
7
|
-
format(entry: LogEntry): string;
|
|
8
|
-
private formatTimestamp;
|
|
9
|
-
private formatTraceInfo;
|
|
10
|
-
private formatDuration;
|
|
11
|
-
private formatContext;
|
|
12
|
-
private formatMetadata;
|
|
13
|
-
private formatError;
|
|
14
|
-
private formatObject;
|
|
15
|
-
private formatValue;
|
|
16
|
-
private colorize;
|
|
17
|
-
}
|
|
18
|
-
declare class ProductionFormatter implements Formatter {
|
|
19
|
-
format(entry: LogEntry): string;
|
|
20
|
-
}
|
|
21
|
-
declare class CustomFormatter implements Formatter {
|
|
22
|
-
private template;
|
|
23
|
-
private dateFormat;
|
|
24
|
-
constructor(template?: string, dateFormat?: (date: Date) => string);
|
|
25
|
-
format(entry: LogEntry): string;
|
|
26
|
-
}
|
|
27
|
-
//#endregion
|
|
28
|
-
export { CustomFormatter, DevFormatter, ProductionFormatter };
|
|
29
|
-
//# sourceMappingURL=formatters.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.d.mts","names":[],"sources":["../src/formatters.ts"],"sourcesContent":[],"mappings":";;;cAkCa,YAAA,YAAwB;;EAAxB,WAAA,CAAA,YAOG,CAPU,EAOV,OAAA;EAkJH,MAAA,CAAA,KAAA,EAlJG,QAkJiB,CAAA,EAAA,MAAA;EAkDpB,QAAA,eAAgB;EAML,QAAA,eAAA;EAMR,QAAA,cAAA;EAZwB,QAAA,aAAA;EAAS,QAAA,cAAA;;;;;;cAlDpC,mBAAA,YAA+B;gBAC5B;;cAiDH,eAAA,YAA2B;;;qDAMhB;gBAMR"}
|
package/dist/formatters.mjs
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { LogLevel } from "./types.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/formatters.ts
|
|
4
|
-
const colors = {
|
|
5
|
-
reset: "\x1B[0m",
|
|
6
|
-
bright: "\x1B[1m",
|
|
7
|
-
dim: "\x1B[2m",
|
|
8
|
-
red: "\x1B[31m",
|
|
9
|
-
green: "\x1B[32m",
|
|
10
|
-
yellow: "\x1B[33m",
|
|
11
|
-
blue: "\x1B[34m",
|
|
12
|
-
magenta: "\x1B[35m",
|
|
13
|
-
cyan: "\x1B[36m",
|
|
14
|
-
white: "\x1B[37m",
|
|
15
|
-
gray: "\x1B[90m",
|
|
16
|
-
bgRed: "\x1B[41m",
|
|
17
|
-
bgYellow: "\x1B[43m"
|
|
18
|
-
};
|
|
19
|
-
const levelConfig = {
|
|
20
|
-
[LogLevel.TRACE]: {
|
|
21
|
-
color: colors.gray,
|
|
22
|
-
symbol: "○",
|
|
23
|
-
name: "TRACE"
|
|
24
|
-
},
|
|
25
|
-
[LogLevel.DEBUG]: {
|
|
26
|
-
color: colors.blue,
|
|
27
|
-
symbol: "●",
|
|
28
|
-
name: "DEBUG"
|
|
29
|
-
},
|
|
30
|
-
[LogLevel.INFO]: {
|
|
31
|
-
color: colors.green,
|
|
32
|
-
symbol: "●",
|
|
33
|
-
name: "INFO "
|
|
34
|
-
},
|
|
35
|
-
[LogLevel.WARN]: {
|
|
36
|
-
color: colors.yellow,
|
|
37
|
-
symbol: "▲",
|
|
38
|
-
name: "WARN "
|
|
39
|
-
},
|
|
40
|
-
[LogLevel.ERROR]: {
|
|
41
|
-
color: colors.red,
|
|
42
|
-
symbol: "✖",
|
|
43
|
-
name: "ERROR"
|
|
44
|
-
},
|
|
45
|
-
[LogLevel.FATAL]: {
|
|
46
|
-
color: colors.bgRed + colors.white,
|
|
47
|
-
symbol: "💀",
|
|
48
|
-
name: "FATAL"
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
var DevFormatter = class {
|
|
52
|
-
enableColors;
|
|
53
|
-
constructor(enableColors = true) {
|
|
54
|
-
this.enableColors = enableColors;
|
|
55
|
-
}
|
|
56
|
-
format(entry) {
|
|
57
|
-
const parts = [];
|
|
58
|
-
const config = levelConfig[entry.level];
|
|
59
|
-
const timestamp = this.formatTimestamp(entry.timestamp);
|
|
60
|
-
parts.push(this.colorize(timestamp, colors.gray));
|
|
61
|
-
const levelText = `${config.symbol} ${config.name}`;
|
|
62
|
-
parts.push(this.colorize(levelText, config.color));
|
|
63
|
-
if (entry.traceId) {
|
|
64
|
-
const traceInfo = this.formatTraceInfo(entry);
|
|
65
|
-
parts.push(this.colorize(traceInfo, colors.cyan));
|
|
66
|
-
}
|
|
67
|
-
parts.push(this.colorize(entry.message, colors.white));
|
|
68
|
-
if (entry.duration !== void 0) {
|
|
69
|
-
const durationText = `(${this.formatDuration(entry.duration)})`;
|
|
70
|
-
parts.push(this.colorize(durationText, colors.magenta));
|
|
71
|
-
}
|
|
72
|
-
let output = parts.join(" ");
|
|
73
|
-
if (entry.context && Object.keys(entry.context).length > 0) output += "\n" + this.formatContext(entry.context);
|
|
74
|
-
if (entry.metadata && Object.keys(entry.metadata).length > 0) output += "\n" + this.formatMetadata(entry.metadata);
|
|
75
|
-
if (entry.error) output += "\n" + this.formatError(entry.error);
|
|
76
|
-
if (entry.tags && entry.tags.length > 0) {
|
|
77
|
-
const tagsText = entry.tags.map((tag) => `#${tag}`).join(" ");
|
|
78
|
-
output += "\n" + this.colorize(`Tags: ${tagsText}`, colors.blue);
|
|
79
|
-
}
|
|
80
|
-
return output;
|
|
81
|
-
}
|
|
82
|
-
formatTimestamp(timestamp) {
|
|
83
|
-
return timestamp.toISOString().substring(11, 23);
|
|
84
|
-
}
|
|
85
|
-
formatTraceInfo(entry) {
|
|
86
|
-
const parts = [`trace:${entry.traceId?.substring(0, 8) || "unknown"}`];
|
|
87
|
-
if (entry.spanId && entry.spanId.length >= 8) parts.push(`span:${entry.spanId.substring(0, 8)}`);
|
|
88
|
-
if (entry.parentId && entry.parentId.length >= 8) parts.push(`parent:${entry.parentId.substring(0, 8)}`);
|
|
89
|
-
return `[${parts.join("|")}]`;
|
|
90
|
-
}
|
|
91
|
-
formatDuration(duration) {
|
|
92
|
-
if (duration < 1) return `${(duration * 1e3).toFixed(0)}μs`;
|
|
93
|
-
else if (duration < 1e3) return `${duration.toFixed(2)}ms`;
|
|
94
|
-
else return `${(duration / 1e3).toFixed(2)}s`;
|
|
95
|
-
}
|
|
96
|
-
formatContext(context) {
|
|
97
|
-
const formatted = this.formatObject(context, 2);
|
|
98
|
-
return this.colorize(`Context: ${formatted}`, colors.cyan);
|
|
99
|
-
}
|
|
100
|
-
formatMetadata(metadata) {
|
|
101
|
-
const formatted = this.formatObject(metadata, 2);
|
|
102
|
-
return this.colorize(`Metadata: ${formatted}`, colors.blue);
|
|
103
|
-
}
|
|
104
|
-
formatError(error) {
|
|
105
|
-
let output = this.colorize(`Error: ${error.name}: ${error.message}`, colors.red);
|
|
106
|
-
if (error.stack) {
|
|
107
|
-
const indentedStack = error.stack.split("\n").slice(1, 6).map((line) => ` ${line}`).join("\n");
|
|
108
|
-
output += "\n" + this.colorize(indentedStack, colors.gray);
|
|
109
|
-
}
|
|
110
|
-
return output;
|
|
111
|
-
}
|
|
112
|
-
formatObject(obj, indent = 0) {
|
|
113
|
-
const spaces = " ".repeat(indent);
|
|
114
|
-
const entries = Object.entries(obj);
|
|
115
|
-
if (entries.length === 0) return "{}";
|
|
116
|
-
if (entries[0] && typeof entries[0][1] !== "object") return `{ ${entries[0][0]}: ${this.formatValue(entries[0][1])} }`;
|
|
117
|
-
return `{\n${entries.map(([key, value]) => {
|
|
118
|
-
return `${spaces} ${key}: ${this.formatValue(value, indent + 2)}`;
|
|
119
|
-
}).join("\n")}\n${spaces}}`;
|
|
120
|
-
}
|
|
121
|
-
formatValue(value, indent = 0) {
|
|
122
|
-
if (value === null) return "null";
|
|
123
|
-
if (value === void 0) return "undefined";
|
|
124
|
-
if (typeof value === "string") return `"${value}"`;
|
|
125
|
-
if (typeof value === "boolean" || typeof value === "number") return String(value);
|
|
126
|
-
if (value instanceof Date) return value.toISOString();
|
|
127
|
-
if (Array.isArray(value)) {
|
|
128
|
-
if (value.length === 0) return "[]";
|
|
129
|
-
return `[${value.map((v) => this.formatValue(v)).join(", ")}]`;
|
|
130
|
-
}
|
|
131
|
-
if (typeof value === "object") return this.formatObject(value, indent);
|
|
132
|
-
return String(value);
|
|
133
|
-
}
|
|
134
|
-
colorize(text, color) {
|
|
135
|
-
if (!this.enableColors) return text;
|
|
136
|
-
return `${color}${text}${colors.reset}`;
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
var ProductionFormatter = class {
|
|
140
|
-
format(entry) {
|
|
141
|
-
const logObject = {
|
|
142
|
-
timestamp: entry.timestamp,
|
|
143
|
-
level: entry.level,
|
|
144
|
-
message: entry.message
|
|
145
|
-
};
|
|
146
|
-
if (entry.traceId) logObject.traceId = entry.traceId;
|
|
147
|
-
if (entry.spanId) logObject.spanId = entry.spanId;
|
|
148
|
-
if (entry.parentId) logObject.parentId = entry.parentId;
|
|
149
|
-
if (entry.duration !== void 0) logObject.duration = entry.duration;
|
|
150
|
-
if (entry.context && Object.keys(entry.context).length > 0) logObject.context = entry.context;
|
|
151
|
-
if (entry.metadata && Object.keys(entry.metadata).length > 0) logObject.metadata = entry.metadata;
|
|
152
|
-
if (entry.error) logObject.error = {
|
|
153
|
-
name: entry.error.name,
|
|
154
|
-
message: entry.error.message,
|
|
155
|
-
stack: entry.error.stack
|
|
156
|
-
};
|
|
157
|
-
if (entry.tags && entry.tags.length > 0) logObject.tags = entry.tags;
|
|
158
|
-
return JSON.stringify(logObject);
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
var CustomFormatter = class {
|
|
162
|
-
template;
|
|
163
|
-
dateFormat;
|
|
164
|
-
constructor(template = "{timestamp} [{level}] {message}", dateFormat) {
|
|
165
|
-
this.template = template;
|
|
166
|
-
this.dateFormat = dateFormat || ((date) => date.toISOString());
|
|
167
|
-
}
|
|
168
|
-
format(entry) {
|
|
169
|
-
const levelName = LogLevel[entry.level];
|
|
170
|
-
const timestamp = this.dateFormat(entry.timestamp);
|
|
171
|
-
let formatted = this.template.replace("{timestamp}", timestamp).replace("{level}", levelName).replace("{message}", entry.message).replace("{traceId}", entry.traceId || "").replace("{spanId}", entry.spanId || "").replace("{duration}", entry.duration?.toString() || "");
|
|
172
|
-
if (entry.context) formatted = formatted.replace("{context}", JSON.stringify(entry.context));
|
|
173
|
-
if (entry.metadata) formatted = formatted.replace("{metadata}", JSON.stringify(entry.metadata));
|
|
174
|
-
return formatted;
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
//#endregion
|
|
179
|
-
export { CustomFormatter, DevFormatter, ProductionFormatter };
|
|
180
|
-
//# sourceMappingURL=formatters.mjs.map
|
package/dist/formatters.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.mjs","names":[],"sources":["../src/formatters.ts"],"sourcesContent":["import type { Formatter, LogEntry } from './types';\nimport { LogLevel } from './types';\n\n// ANSI color codes for terminal output\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n bgRed: '\\x1b[41m',\n bgYellow: '\\x1b[43m',\n};\n\n// Log level colors and symbols\nconst levelConfig = {\n [LogLevel.TRACE]: { color: colors.gray, symbol: '○', name: 'TRACE' },\n [LogLevel.DEBUG]: { color: colors.blue, symbol: '●', name: 'DEBUG' },\n [LogLevel.INFO]: { color: colors.green, symbol: '●', name: 'INFO ' },\n [LogLevel.WARN]: { color: colors.yellow, symbol: '▲', name: 'WARN ' },\n [LogLevel.ERROR]: { color: colors.red, symbol: '✖', name: 'ERROR' },\n [LogLevel.FATAL]: {\n color: colors.bgRed + colors.white,\n symbol: '💀',\n name: 'FATAL',\n },\n};\n\nexport class DevFormatter implements Formatter {\n private enableColors: boolean;\n\n constructor(enableColors = true) {\n this.enableColors = enableColors;\n }\n\n format(entry: LogEntry): string {\n const parts: string[] = [];\n const config = levelConfig[entry.level];\n\n // Timestamp\n const timestamp = this.formatTimestamp(entry.timestamp);\n parts.push(this.colorize(timestamp, colors.gray));\n\n // Log level with symbol\n const levelText = `${config.symbol} ${config.name}`;\n parts.push(this.colorize(levelText, config.color));\n\n // Trace information\n if (entry.traceId) {\n const traceInfo = this.formatTraceInfo(entry);\n parts.push(this.colorize(traceInfo, colors.cyan));\n }\n\n // Main message\n parts.push(this.colorize(entry.message, colors.white));\n\n // Duration (if present)\n if (entry.duration !== undefined) {\n const durationText = `(${this.formatDuration(entry.duration)})`;\n parts.push(this.colorize(durationText, colors.magenta));\n }\n\n let output = parts.join(' ');\n\n // Context and metadata (on new lines for readability)\n if (entry.context && Object.keys(entry.context).length > 0) {\n output += '\\n' + this.formatContext(entry.context);\n }\n\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n output += '\\n' + this.formatMetadata(entry.metadata);\n }\n\n // Error details\n if (entry.error) {\n output += '\\n' + this.formatError(entry.error);\n }\n\n // Tags\n if (entry.tags && entry.tags.length > 0) {\n const tagsText = entry.tags.map((tag) => `#${tag}`).join(' ');\n output += '\\n' + this.colorize(`Tags: ${tagsText}`, colors.blue);\n }\n\n return output;\n }\n\n private formatTimestamp(timestamp: Date): string {\n return timestamp.toISOString().substring(11, 23); // Just time with milliseconds\n }\n\n private formatTraceInfo(entry: LogEntry): string {\n const parts = [`trace:${entry.traceId?.substring(0, 8) || 'unknown'}`];\n if (entry.spanId && entry.spanId.length >= 8) {\n parts.push(`span:${entry.spanId.substring(0, 8)}`);\n }\n if (entry.parentId && entry.parentId.length >= 8) {\n parts.push(`parent:${entry.parentId.substring(0, 8)}`);\n }\n return `[${parts.join('|')}]`;\n }\n\n private formatDuration(duration: number): string {\n if (duration < 1) {\n return `${(duration * 1000).toFixed(0)}μs`;\n } else if (duration < 1000) {\n return `${duration.toFixed(2)}ms`;\n } else {\n return `${(duration / 1000).toFixed(2)}s`;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatContext(context: Record<string, any>): string {\n const formatted = this.formatObject(context, 2);\n return this.colorize(`Context: ${formatted}`, colors.cyan);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatMetadata(metadata: Record<string, any>): string {\n const formatted = this.formatObject(metadata, 2);\n return this.colorize(`Metadata: ${formatted}`, colors.blue);\n }\n\n private formatError(error: Error): string {\n let output = this.colorize(\n `Error: ${error.name}: ${error.message}`,\n colors.red\n );\n if (error.stack) {\n const stackLines = error.stack.split('\\n').slice(1, 6); // First 5 stack frames\n const indentedStack = stackLines.map((line) => ` ${line}`).join('\\n');\n output += '\\n' + this.colorize(indentedStack, colors.gray);\n }\n return output;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatObject(obj: Record<string, any>, indent = 0): string {\n const spaces = ' '.repeat(indent);\n const entries = Object.entries(obj);\n\n if (entries.length === 0) return '{}';\n\n if (entries[0] && typeof entries[0][1] !== 'object') {\n return `{ ${entries[0][0]}: ${this.formatValue(entries[0][1])} }`;\n }\n\n const formatted = entries\n .map(([key, value]) => {\n return `${spaces} ${key}: ${this.formatValue(value, indent + 2)}`;\n })\n .join('\\n');\n\n return `{\\n${formatted}\\n${spaces}}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatValue(value: any, indent = 0): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n if (typeof value === 'boolean' || typeof value === 'number')\n return String(value);\n if (value instanceof Date) return value.toISOString();\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]';\n return `[${value.map((v) => this.formatValue(v)).join(', ')}]`;\n }\n if (typeof value === 'object') {\n return this.formatObject(value, indent);\n }\n return String(value);\n }\n\n private colorize(text: string, color: string): string {\n if (!this.enableColors) return text;\n return `${color}${text}${colors.reset}`;\n }\n}\n\nexport class ProductionFormatter implements Formatter {\n format(entry: LogEntry): string {\n const logObject: LogEntry = {\n timestamp: entry.timestamp,\n level: entry.level,\n message: entry.message,\n };\n\n // Add trace information\n if (entry.traceId) {\n logObject.traceId = entry.traceId;\n }\n if (entry.spanId) {\n logObject.spanId = entry.spanId;\n }\n if (entry.parentId) {\n logObject.parentId = entry.parentId;\n }\n\n // Add timing information\n if (entry.duration !== undefined) {\n logObject.duration = entry.duration;\n }\n\n // Add context and metadata\n if (entry.context && Object.keys(entry.context).length > 0) {\n logObject.context = entry.context;\n }\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n logObject.metadata = entry.metadata;\n }\n\n // Add error information\n if (entry.error) {\n logObject.error = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n // Add tags\n if (entry.tags && entry.tags.length > 0) {\n logObject.tags = entry.tags;\n }\n\n return JSON.stringify(logObject);\n }\n}\n\nexport class CustomFormatter implements Formatter {\n private template: string;\n private dateFormat: (date: Date) => string;\n\n constructor(\n template = '{timestamp} [{level}] {message}',\n dateFormat?: (date: Date) => string\n ) {\n this.template = template;\n this.dateFormat = dateFormat || ((date: Date) => date.toISOString());\n }\n\n format(entry: LogEntry): string {\n const levelName = LogLevel[entry.level];\n const timestamp = this.dateFormat(entry.timestamp);\n\n let formatted = this.template\n .replace('{timestamp}', timestamp)\n .replace('{level}', levelName)\n .replace('{message}', entry.message)\n .replace('{traceId}', entry.traceId || '')\n .replace('{spanId}', entry.spanId || '')\n .replace('{duration}', entry.duration?.toString() || '');\n\n // Handle context and metadata placeholders\n if (entry.context) {\n formatted = formatted.replace('{context}', JSON.stringify(entry.context));\n }\n if (entry.metadata) {\n formatted = formatted.replace(\n '{metadata}',\n JSON.stringify(entry.metadata)\n );\n }\n\n return formatted;\n }\n}\n"],"mappings":"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"}
|
package/dist/index.browser.d.mts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { LogEntry, LogLevel, TraceContext, TracingOptions } from "./types.mjs";
|
|
2
|
-
import { LogContext } from "./context.browser.mjs";
|
|
3
|
-
import { Timer } from "./timer.mjs";
|
|
4
|
-
import { DevFormatter, ProductionFormatter } from "./formatters.mjs";
|
|
5
|
-
import { Logger } from "./logger.browser.mjs";
|
|
6
|
-
import { Tracer } from "./tracer.browser.mjs";
|
|
7
|
-
export { DevFormatter, LogContext, type LogEntry, LogLevel, Logger, ProductionFormatter, Timer, type TraceContext, Tracer, type TracingOptions };
|
package/dist/index.browser.mjs
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { LogContext } from "./context.browser.mjs";
|
|
2
|
-
import { LogLevel } from "./types.mjs";
|
|
3
|
-
import { Timer } from "./timer.mjs";
|
|
4
|
-
import { DevFormatter, ProductionFormatter } from "./formatters.mjs";
|
|
5
|
-
import { Tracer } from "./tracer.browser.mjs";
|
|
6
|
-
import { Logger } from "./logger.browser.mjs";
|
|
7
|
-
|
|
8
|
-
export { DevFormatter, LogContext, LogLevel, Logger, ProductionFormatter, Timer, Tracer };
|
package/dist/index.d.mts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { LogEntry, LogLevel, TraceContext, TracingOptions } from "./types.mjs";
|
|
2
|
-
import { LogContext } from "./context.node.mjs";
|
|
3
|
-
import { Timer } from "./timer.mjs";
|
|
4
|
-
import { Logger } from "./logger.node.mjs";
|
|
5
|
-
import { elysiaLogger } from "./elysia-plugin.mjs";
|
|
6
|
-
import { DevFormatter, ProductionFormatter } from "./formatters.mjs";
|
|
7
|
-
import { Tracer } from "./tracer.node.mjs";
|
|
8
|
-
export { DevFormatter, LogContext, type LogEntry, LogLevel, Logger, ProductionFormatter, Timer, type TraceContext, Tracer, type TracingOptions, elysiaLogger };
|
package/dist/index.mjs
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { LogContext } from "./context.node.mjs";
|
|
2
|
-
import { LogLevel } from "./types.mjs";
|
|
3
|
-
import { Timer } from "./timer.mjs";
|
|
4
|
-
import { Tracer } from "./tracer.node.mjs";
|
|
5
|
-
import { DevFormatter, ProductionFormatter } from "./formatters.mjs";
|
|
6
|
-
import { Logger } from "./logger.node.mjs";
|
|
7
|
-
import { elysiaLogger } from "./elysia-plugin.mjs";
|
|
8
|
-
|
|
9
|
-
export { DevFormatter, LogContext, LogLevel, Logger, ProductionFormatter, Timer, Tracer, elysiaLogger };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { ContextData, Formatter, LogLevel, LoggerConfig, TraceContext, TraceMethod, TracingOptions } from "./types.mjs";
|
|
2
|
-
import { Timer } from "./timer.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/logger.browser.d.ts
|
|
5
|
-
declare class Logger {
|
|
6
|
-
private config;
|
|
7
|
-
private formatter;
|
|
8
|
-
private context;
|
|
9
|
-
private tracer;
|
|
10
|
-
private timerManager;
|
|
11
|
-
constructor(config?: Partial<LoggerConfig>);
|
|
12
|
-
traceLog(message: string, metadata?: Record<string, unknown>): void;
|
|
13
|
-
debug(message: string, metadata?: Record<string, unknown>): void;
|
|
14
|
-
info(message: string, metadata?: Record<string, unknown>): void;
|
|
15
|
-
warn(message: string, metadata?: Record<string, unknown>): void;
|
|
16
|
-
error(message: string, metadata?: Record<string, unknown>, error?: Error): void;
|
|
17
|
-
fatal(message: string, metadata?: Record<string, unknown>, error?: Error): void;
|
|
18
|
-
withContext<T>(context: ContextData, fn: () => T): T;
|
|
19
|
-
extendContext<T>(additionalContext: Partial<ContextData>, fn: () => T): T;
|
|
20
|
-
setContext(key: string, value: unknown): void;
|
|
21
|
-
getContext(): ContextData;
|
|
22
|
-
trace: TraceMethod;
|
|
23
|
-
getTraceId(): string | undefined;
|
|
24
|
-
startSpan(options: TracingOptions): TraceContext | null;
|
|
25
|
-
finishSpan(spanId: string): number | undefined;
|
|
26
|
-
addTraceMetadata(key: string, value: unknown): void;
|
|
27
|
-
addTraceTags(...tags: string[]): void;
|
|
28
|
-
startTimer(id?: string): Timer | null;
|
|
29
|
-
stopTimer(id: string): number | undefined;
|
|
30
|
-
getTimer(id: string): Timer | undefined;
|
|
31
|
-
child(context: Partial<ContextData>): Logger;
|
|
32
|
-
setLevel(level: LogLevel): void;
|
|
33
|
-
setFormatter(formatter: Formatter): void;
|
|
34
|
-
profile<T>(operationName: string, fn: () => T | Promise<T>, options?: {
|
|
35
|
-
logResult?: boolean;
|
|
36
|
-
logLevel?: LogLevel;
|
|
37
|
-
}): Promise<T>;
|
|
38
|
-
logRequest(method: string, url: string, statusCode?: number, duration?: number): void;
|
|
39
|
-
flush(): Promise<void>;
|
|
40
|
-
getStats(): {
|
|
41
|
-
activeTimers: number;
|
|
42
|
-
activeSpans: number;
|
|
43
|
-
config: LoggerConfig;
|
|
44
|
-
};
|
|
45
|
-
protected output(message: string, level: LogLevel): void;
|
|
46
|
-
private log;
|
|
47
|
-
private getHttpLogLevel;
|
|
48
|
-
}
|
|
49
|
-
//#endregion
|
|
50
|
-
export { Logger };
|
|
51
|
-
//# sourceMappingURL=logger.browser.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.browser.d.mts","names":[],"sources":["../src/logger.browser.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/logger.browser.mjs
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { LogContext } from "./context.browser.mjs";
|
|
2
|
-
import { LogLevel } from "./types.mjs";
|
|
3
|
-
import { TimerManager } from "./timer.mjs";
|
|
4
|
-
import { DevFormatter, ProductionFormatter } from "./formatters.mjs";
|
|
5
|
-
import { Tracer } from "./tracer.browser.mjs";
|
|
6
|
-
|
|
7
|
-
//#region src/logger.browser.ts
|
|
8
|
-
var Logger = class Logger {
|
|
9
|
-
config;
|
|
10
|
-
formatter;
|
|
11
|
-
context;
|
|
12
|
-
tracer;
|
|
13
|
-
timerManager;
|
|
14
|
-
constructor(config) {
|
|
15
|
-
this.config = {
|
|
16
|
-
level: LogLevel.INFO,
|
|
17
|
-
environment: process.env.NODE_ENV || "development",
|
|
18
|
-
enableTracing: true,
|
|
19
|
-
enableTiming: true,
|
|
20
|
-
enableContext: true,
|
|
21
|
-
enableColors: true,
|
|
22
|
-
maxContextDepth: 10,
|
|
23
|
-
timestampFormat: "iso",
|
|
24
|
-
...config
|
|
25
|
-
};
|
|
26
|
-
this.context = LogContext.getInstance();
|
|
27
|
-
this.tracer = new Tracer();
|
|
28
|
-
this.timerManager = new TimerManager();
|
|
29
|
-
this.formatter = this.config.environment === "production" ? new ProductionFormatter() : new DevFormatter(this.config.enableColors);
|
|
30
|
-
}
|
|
31
|
-
traceLog(message, metadata) {
|
|
32
|
-
this.log(LogLevel.TRACE, message, metadata);
|
|
33
|
-
}
|
|
34
|
-
debug(message, metadata) {
|
|
35
|
-
this.log(LogLevel.DEBUG, message, metadata);
|
|
36
|
-
}
|
|
37
|
-
info(message, metadata) {
|
|
38
|
-
this.log(LogLevel.INFO, message, metadata);
|
|
39
|
-
}
|
|
40
|
-
warn(message, metadata) {
|
|
41
|
-
this.log(LogLevel.WARN, message, metadata);
|
|
42
|
-
}
|
|
43
|
-
error(message, metadata, error) {
|
|
44
|
-
this.log(LogLevel.ERROR, message, metadata, error);
|
|
45
|
-
}
|
|
46
|
-
fatal(message, metadata, error) {
|
|
47
|
-
this.log(LogLevel.FATAL, message, metadata, error);
|
|
48
|
-
}
|
|
49
|
-
withContext(context, fn) {
|
|
50
|
-
return this.context.run(context, fn);
|
|
51
|
-
}
|
|
52
|
-
extendContext(additionalContext, fn) {
|
|
53
|
-
return this.context.extend(additionalContext, fn);
|
|
54
|
-
}
|
|
55
|
-
setContext(key, value) {
|
|
56
|
-
this.context.set(key, value);
|
|
57
|
-
}
|
|
58
|
-
getContext() {
|
|
59
|
-
return this.context.getContext();
|
|
60
|
-
}
|
|
61
|
-
trace = async (options, fn) => {
|
|
62
|
-
if (!this.config.enableTracing) return await fn();
|
|
63
|
-
return this.tracer.trace(options, fn);
|
|
64
|
-
};
|
|
65
|
-
getTraceId() {
|
|
66
|
-
return this.tracer.getCurrentTrace()?.traceId;
|
|
67
|
-
}
|
|
68
|
-
startSpan(options) {
|
|
69
|
-
if (!this.config.enableTracing) return null;
|
|
70
|
-
return this.tracer.startSpan(options);
|
|
71
|
-
}
|
|
72
|
-
finishSpan(spanId) {
|
|
73
|
-
if (!this.config.enableTracing) return;
|
|
74
|
-
return this.tracer.finishSpan(spanId);
|
|
75
|
-
}
|
|
76
|
-
addTraceMetadata(key, value) {
|
|
77
|
-
if (this.config.enableTracing) this.tracer.addMetadata(key, value);
|
|
78
|
-
}
|
|
79
|
-
addTraceTags(...tags) {
|
|
80
|
-
if (this.config.enableTracing) this.tracer.addTags(...tags);
|
|
81
|
-
}
|
|
82
|
-
startTimer(id) {
|
|
83
|
-
if (!this.config.enableTiming) return null;
|
|
84
|
-
return this.timerManager.start(id);
|
|
85
|
-
}
|
|
86
|
-
stopTimer(id) {
|
|
87
|
-
if (!this.config.enableTiming) return;
|
|
88
|
-
return this.timerManager.stop(id);
|
|
89
|
-
}
|
|
90
|
-
getTimer(id) {
|
|
91
|
-
return this.timerManager.get(id);
|
|
92
|
-
}
|
|
93
|
-
child(context) {
|
|
94
|
-
const childLogger = new Logger(this.config);
|
|
95
|
-
Object.entries(context).forEach(([key, value]) => {
|
|
96
|
-
childLogger.setContext(key, value);
|
|
97
|
-
});
|
|
98
|
-
return childLogger;
|
|
99
|
-
}
|
|
100
|
-
setLevel(level) {
|
|
101
|
-
this.config.level = level;
|
|
102
|
-
}
|
|
103
|
-
setFormatter(formatter) {
|
|
104
|
-
this.formatter = formatter;
|
|
105
|
-
}
|
|
106
|
-
async profile(operationName, fn, options) {
|
|
107
|
-
const timer = this.startTimer(`profile-${operationName}`);
|
|
108
|
-
const startTime = performance.now();
|
|
109
|
-
try {
|
|
110
|
-
const result = await this.tracer.trace({
|
|
111
|
-
operationType: "custom",
|
|
112
|
-
operationName: `profile:${operationName}`,
|
|
113
|
-
autoTiming: true
|
|
114
|
-
}, fn);
|
|
115
|
-
const duration = performance.now() - startTime;
|
|
116
|
-
timer?.stop();
|
|
117
|
-
const logLevel = options?.logLevel || LogLevel.DEBUG;
|
|
118
|
-
this.log(logLevel, `Profile: ${operationName} completed`, {
|
|
119
|
-
operation: operationName,
|
|
120
|
-
duration: `${duration.toFixed(2)}ms`,
|
|
121
|
-
result: options?.logResult ? result : "[result hidden]"
|
|
122
|
-
});
|
|
123
|
-
return result;
|
|
124
|
-
} catch (error) {
|
|
125
|
-
const duration = performance.now() - startTime;
|
|
126
|
-
timer?.stop();
|
|
127
|
-
this.error(`Profile: ${operationName} failed`, {
|
|
128
|
-
operation: operationName,
|
|
129
|
-
duration: `${duration.toFixed(2)}ms`,
|
|
130
|
-
error: error.message
|
|
131
|
-
}, error);
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
logRequest(method, url, statusCode, duration) {
|
|
136
|
-
const level = this.getHttpLogLevel(statusCode);
|
|
137
|
-
const message = `${method.toUpperCase()} ${url}${statusCode ? ` ${statusCode}` : ""}`;
|
|
138
|
-
this.log(level, message, {
|
|
139
|
-
method,
|
|
140
|
-
url,
|
|
141
|
-
statusCode,
|
|
142
|
-
duration: duration ? `${duration.toFixed(2)}ms` : void 0,
|
|
143
|
-
type: "http_request"
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
async flush() {
|
|
147
|
-
this.timerManager.clear();
|
|
148
|
-
}
|
|
149
|
-
getStats() {
|
|
150
|
-
return {
|
|
151
|
-
activeTimers: this.timerManager.getActive().length,
|
|
152
|
-
activeSpans: this.tracer.getActiveSpans().length,
|
|
153
|
-
config: { ...this.config }
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
output(message, level) {
|
|
157
|
-
if (level >= LogLevel.ERROR) console.error(message);
|
|
158
|
-
else console.log(message);
|
|
159
|
-
}
|
|
160
|
-
log(level, message, metadata, error) {
|
|
161
|
-
if (level < this.config.level) return;
|
|
162
|
-
const currentTrace = this.config.enableTracing ? this.tracer.getCurrentTrace() : void 0;
|
|
163
|
-
const contextData = this.config.enableContext ? this.context.getContext() : void 0;
|
|
164
|
-
const entry = {
|
|
165
|
-
level,
|
|
166
|
-
message,
|
|
167
|
-
timestamp: /* @__PURE__ */ new Date(),
|
|
168
|
-
traceId: currentTrace?.traceId,
|
|
169
|
-
parentId: currentTrace?.parentId,
|
|
170
|
-
spanId: currentTrace?.spanId,
|
|
171
|
-
context: contextData,
|
|
172
|
-
metadata,
|
|
173
|
-
error,
|
|
174
|
-
tags: currentTrace?.tags
|
|
175
|
-
};
|
|
176
|
-
if (currentTrace?.metadata?.duration) entry.duration = currentTrace.metadata.duration;
|
|
177
|
-
const formatted = this.formatter.format(entry);
|
|
178
|
-
this.output(formatted, level);
|
|
179
|
-
}
|
|
180
|
-
getHttpLogLevel(statusCode) {
|
|
181
|
-
if (!statusCode) return LogLevel.INFO;
|
|
182
|
-
if (statusCode >= 500) return LogLevel.ERROR;
|
|
183
|
-
if (statusCode >= 400) return LogLevel.WARN;
|
|
184
|
-
return LogLevel.INFO;
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
//#endregion
|
|
189
|
-
export { Logger };
|
|
190
|
-
//# sourceMappingURL=logger.browser.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.browser.mjs","names":[],"sources":["../src/logger.browser.ts"],"sourcesContent":["import type {\n ContextData,\n Formatter,\n LogEntry,\n LoggerConfig,\n TraceMethod,\n TracingOptions,\n} from './types';\nimport { LogLevel } from './types';\nimport { LogContext } from './context.browser';\nimport { Tracer } from './tracer.browser';\nimport { Timer, TimerManager } from './timer';\nimport { DevFormatter, ProductionFormatter } from './formatters';\n\nexport class Logger {\n private config: LoggerConfig;\n private formatter: Formatter;\n private context: LogContext;\n private tracer: Tracer;\n private timerManager: TimerManager;\n\n constructor(config?: Partial<LoggerConfig>) {\n this.config = {\n level: LogLevel.INFO,\n environment:\n (process.env.NODE_ENV as LoggerConfig['environment']) || 'development',\n enableTracing: true,\n enableTiming: true,\n enableContext: true,\n enableColors: true,\n maxContextDepth: 10,\n timestampFormat: 'iso',\n ...config,\n };\n\n this.context = LogContext.getInstance();\n this.tracer = new Tracer();\n this.timerManager = new TimerManager();\n\n // Set up formatter based on environment\n this.formatter =\n this.config.environment === 'production'\n ? new ProductionFormatter()\n : new DevFormatter(this.config.enableColors);\n }\n\n // Core logging methods\n traceLog(message: string, metadata?: Record<string, unknown>): void {\n this.log(LogLevel.TRACE, message, metadata);\n }\n\n debug(message: string, metadata?: Record<string, unknown>): void {\n this.log(LogLevel.DEBUG, message, metadata);\n }\n\n info(message: string, metadata?: Record<string, unknown>): void {\n this.log(LogLevel.INFO, message, metadata);\n }\n\n warn(message: string, metadata?: Record<string, unknown>): void {\n this.log(LogLevel.WARN, message, metadata);\n }\n\n error(\n message: string,\n metadata?: Record<string, unknown>,\n error?: Error\n ): void {\n this.log(LogLevel.ERROR, message, metadata, error);\n }\n\n fatal(\n message: string,\n metadata?: Record<string, unknown>,\n error?: Error\n ): void {\n this.log(LogLevel.FATAL, message, metadata, error);\n }\n\n // Context management\n withContext<T>(context: ContextData, fn: () => T): T {\n return this.context.run(context, fn);\n }\n\n extendContext<T>(additionalContext: Partial<ContextData>, fn: () => T): T {\n return this.context.extend(additionalContext, fn) as T;\n }\n\n setContext(key: string, value: unknown): void {\n this.context.set(key, value);\n }\n\n getContext(): ContextData {\n return this.context.getContext();\n }\n\n // Tracing functionality\n trace: TraceMethod = async <T>(\n options: TracingOptions,\n fn: () => T | Promise<T>\n ): Promise<T> => {\n if (!this.config.enableTracing) {\n return await fn();\n }\n\n return this.tracer.trace(options, fn);\n };\n\n getTraceId(): string | undefined {\n return this.tracer.getCurrentTrace()?.traceId;\n }\n\n startSpan(options: TracingOptions) {\n if (!this.config.enableTracing) {\n return null;\n }\n return this.tracer.startSpan(options);\n }\n\n finishSpan(spanId: string): number | undefined {\n if (!this.config.enableTracing) {\n return undefined;\n }\n return this.tracer.finishSpan(spanId);\n }\n\n addTraceMetadata(key: string, value: unknown): void {\n if (this.config.enableTracing) {\n this.tracer.addMetadata(key, value);\n }\n }\n\n addTraceTags(...tags: string[]): void {\n if (this.config.enableTracing) {\n this.tracer.addTags(...tags);\n }\n }\n\n // Timer functionality\n startTimer(id?: string): Timer | null {\n if (!this.config.enableTiming) {\n return null;\n }\n return this.timerManager.start(id);\n }\n\n stopTimer(id: string): number | undefined {\n if (!this.config.enableTiming) {\n return undefined;\n }\n return this.timerManager.stop(id);\n }\n\n getTimer(id: string): Timer | undefined {\n return this.timerManager.get(id);\n }\n\n // Utility methods\n child(context: Partial<ContextData>): Logger {\n const childLogger = new Logger(this.config);\n Object.entries(context).forEach(([key, value]) => {\n childLogger.setContext(key, value);\n });\n return childLogger;\n }\n\n setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n setFormatter(formatter: Formatter): void {\n this.formatter = formatter;\n }\n\n // Performance profiling\n async profile<T>(\n operationName: string,\n fn: () => T | Promise<T>,\n options?: { logResult?: boolean; logLevel?: LogLevel }\n ): Promise<T> {\n const timer = this.startTimer(`profile-${operationName}`);\n const startTime = performance.now();\n\n try {\n const result = await this.tracer.trace(\n {\n operationType: 'custom',\n operationName: `profile:${operationName}`,\n autoTiming: true,\n },\n fn\n );\n\n const duration = performance.now() - startTime;\n timer?.stop();\n\n const logLevel = options?.logLevel || LogLevel.DEBUG;\n this.log(logLevel, `Profile: ${operationName} completed`, {\n operation: operationName,\n duration: `${duration.toFixed(2)}ms`,\n result: options?.logResult ? result : '[result hidden]',\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n timer?.stop();\n\n this.error(\n `Profile: ${operationName} failed`,\n {\n operation: operationName,\n duration: `${duration.toFixed(2)}ms`,\n error: (error as Error).message,\n },\n error as Error\n );\n\n throw error;\n }\n }\n\n // HTTP request logging helper\n logRequest(\n method: string,\n url: string,\n statusCode?: number,\n duration?: number\n ): void {\n const level = this.getHttpLogLevel(statusCode);\n const message = `${method.toUpperCase()} ${url}${statusCode ? ` ${statusCode}` : ''}`;\n\n this.log(level, message, {\n method,\n url,\n statusCode,\n duration: duration ? `${duration.toFixed(2)}ms` : undefined,\n type: 'http_request',\n });\n }\n\n // Flush any pending logs (useful for graceful shutdown)\n async flush(): Promise<void> {\n this.timerManager.clear();\n }\n\n // Get logger statistics\n getStats(): {\n activeTimers: number;\n activeSpans: number;\n config: LoggerConfig;\n } {\n return {\n activeTimers: this.timerManager.getActive().length,\n activeSpans: this.tracer.getActiveSpans().length,\n config: { ...this.config },\n };\n }\n\n // Output method (can be overridden for custom outputs)\n protected output(message: string, level: LogLevel): void {\n if (level >= LogLevel.ERROR) {\n console.error(message);\n } else {\n console.log(message);\n }\n }\n\n // Core log method\n private log(\n level: LogLevel,\n message: string,\n metadata?: Record<string, unknown>,\n error?: Error\n ): void {\n if (level < this.config.level) {\n return; // Skip logs below configured level\n }\n\n const currentTrace = this.config.enableTracing\n ? this.tracer.getCurrentTrace()\n : undefined;\n const contextData = this.config.enableContext\n ? this.context.getContext()\n : undefined;\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n traceId: currentTrace?.traceId,\n parentId: currentTrace?.parentId,\n spanId: currentTrace?.spanId,\n context: contextData,\n metadata,\n error,\n tags: currentTrace?.tags,\n };\n\n // Add duration if we're in a traced operation\n if (currentTrace?.metadata?.duration) {\n entry.duration = currentTrace.metadata.duration as number;\n }\n\n const formatted = this.formatter.format(entry);\n this.output(formatted, level);\n }\n\n private getHttpLogLevel(statusCode?: number): LogLevel {\n if (!statusCode) return LogLevel.INFO;\n if (statusCode >= 500) return LogLevel.ERROR;\n if (statusCode >= 400) return LogLevel.WARN;\n return LogLevel.INFO;\n }\n}\n"],"mappings":"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"}
|
package/dist/logger.d.mts
DELETED
package/dist/logger.mjs
DELETED
package/dist/logger.node.d.mts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { ContextData, Formatter, LogLevel, LoggerConfig, TraceContext, TraceMethod, TracingOptions } from "./types.mjs";
|
|
2
|
-
import { Timer } from "./timer.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/logger.node.d.ts
|
|
5
|
-
declare class Logger {
|
|
6
|
-
private config;
|
|
7
|
-
private formatter;
|
|
8
|
-
private context;
|
|
9
|
-
private tracer;
|
|
10
|
-
private timerManager;
|
|
11
|
-
constructor(config?: Partial<LoggerConfig>);
|
|
12
|
-
traceLog(message: string, metadata?: Record<string, unknown>): void;
|
|
13
|
-
debug(message: string, metadata?: Record<string, unknown>): void;
|
|
14
|
-
info(message: string, metadata?: Record<string, unknown>): void;
|
|
15
|
-
warn(message: string, metadata?: Record<string, unknown>): void;
|
|
16
|
-
error(message: string, metadata?: Record<string, unknown>, error?: Error): void;
|
|
17
|
-
fatal(message: string, metadata?: Record<string, unknown>, error?: Error): void;
|
|
18
|
-
withContext<T>(context: ContextData, fn: () => T): T;
|
|
19
|
-
extendContext<T>(additionalContext: Partial<ContextData>, fn: () => T): T;
|
|
20
|
-
setContext(key: string, value: unknown): void;
|
|
21
|
-
getContext(): ContextData;
|
|
22
|
-
trace: TraceMethod;
|
|
23
|
-
getTraceId(): string | undefined;
|
|
24
|
-
startSpan(options: TracingOptions): TraceContext | null;
|
|
25
|
-
finishSpan(spanId: string): number | undefined;
|
|
26
|
-
addTraceMetadata(key: string, value: unknown): void;
|
|
27
|
-
addTraceTags(...tags: string[]): void;
|
|
28
|
-
startTimer(id?: string): Timer | null;
|
|
29
|
-
stopTimer(id: string): number | undefined;
|
|
30
|
-
getTimer(id: string): Timer | undefined;
|
|
31
|
-
child(context: Partial<ContextData>): Logger;
|
|
32
|
-
setLevel(level: LogLevel): void;
|
|
33
|
-
setFormatter(formatter: Formatter): void;
|
|
34
|
-
profile<T>(operationName: string, fn: () => T | Promise<T>, options?: {
|
|
35
|
-
logResult?: boolean;
|
|
36
|
-
logLevel?: LogLevel;
|
|
37
|
-
}): Promise<T>;
|
|
38
|
-
logRequest(method: string, url: string, statusCode?: number, duration?: number): void;
|
|
39
|
-
flush(): Promise<void>;
|
|
40
|
-
getStats(): {
|
|
41
|
-
activeTimers: number;
|
|
42
|
-
activeSpans: number;
|
|
43
|
-
config: LoggerConfig;
|
|
44
|
-
};
|
|
45
|
-
protected output(message: string, level: LogLevel): void;
|
|
46
|
-
private log;
|
|
47
|
-
private getHttpLogLevel;
|
|
48
|
-
}
|
|
49
|
-
//#endregion
|
|
50
|
-
export { Logger };
|
|
51
|
-
//# sourceMappingURL=logger.node.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.node.d.mts","names":[],"sources":["../src/logger.node.ts"],"sourcesContent":[],"mappings":"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"}
|