@lssm/lib.logger 1.42.0 → 1.42.2

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.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/context.browser.d.mts +49 -0
  4. package/dist/context.browser.d.mts.map +1 -0
  5. package/dist/context.browser.mjs +89 -1
  6. package/dist/context.browser.mjs.map +1 -0
  7. package/dist/context.d.mts +17 -0
  8. package/dist/context.d.mts.map +1 -0
  9. package/dist/context.mjs +1 -1
  10. package/dist/context.node.d.mts +48 -0
  11. package/dist/context.node.d.mts.map +1 -0
  12. package/dist/context.node.mjs +79 -1
  13. package/dist/context.node.mjs.map +1 -0
  14. package/dist/elysia-plugin.d.mts +64 -0
  15. package/dist/elysia-plugin.d.mts.map +1 -0
  16. package/dist/elysia-plugin.mjs +85 -1
  17. package/dist/elysia-plugin.mjs.map +1 -0
  18. package/dist/formatters.d.mts +29 -0
  19. package/dist/formatters.d.mts.map +1 -0
  20. package/dist/formatters.mjs +180 -9
  21. package/dist/formatters.mjs.map +1 -0
  22. package/dist/index.browser.d.mts +7 -0
  23. package/dist/index.browser.mjs +8 -1
  24. package/dist/index.d.mts +8 -0
  25. package/dist/index.mjs +9 -1
  26. package/dist/logger.browser.d.mts +51 -0
  27. package/dist/logger.browser.d.mts.map +1 -0
  28. package/dist/logger.browser.mjs +190 -1
  29. package/dist/logger.browser.mjs.map +1 -0
  30. package/dist/logger.d.mts +2 -0
  31. package/dist/logger.mjs +3 -1
  32. package/dist/logger.node.d.mts +51 -0
  33. package/dist/logger.node.d.mts.map +1 -0
  34. package/dist/logger.node.mjs +190 -1
  35. package/dist/logger.node.mjs.map +1 -0
  36. package/dist/timer.d.mts +103 -0
  37. package/dist/timer.d.mts.map +1 -0
  38. package/dist/timer.mjs +165 -1
  39. package/dist/timer.mjs.map +1 -0
  40. package/dist/tracer.browser.d.mts +51 -0
  41. package/dist/tracer.browser.d.mts.map +1 -0
  42. package/dist/tracer.browser.mjs +116 -1
  43. package/dist/tracer.browser.mjs.map +1 -0
  44. package/dist/tracer.d.mts +2 -0
  45. package/dist/tracer.mjs +3 -1
  46. package/dist/tracer.node.d.mts +51 -0
  47. package/dist/tracer.node.d.mts.map +1 -0
  48. package/dist/tracer.node.mjs +116 -1
  49. package/dist/tracer.node.mjs.map +1 -0
  50. package/dist/types.d.mts +71 -0
  51. package/dist/types.d.mts.map +1 -0
  52. package/dist/types.mjs +14 -1
  53. package/dist/types.mjs.map +1 -0
  54. package/package.json +29 -22
@@ -1,9 +1,180 @@
1
- import{LogLevel as e}from"./types.mjs";const t={reset:`\x1B[0m`,bright:`\x1B[1m`,dim:`\x1B[2m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,cyan:`\x1B[36m`,white:`\x1B[37m`,gray:`\x1B[90m`,bgRed:`\x1B[41m`,bgYellow:`\x1B[43m`},n={[e.TRACE]:{color:t.gray,symbol:`○`,name:`TRACE`},[e.DEBUG]:{color:t.blue,symbol:`●`,name:`DEBUG`},[e.INFO]:{color:t.green,symbol:`●`,name:`INFO `},[e.WARN]:{color:t.yellow,symbol:`▲`,name:`WARN `},[e.ERROR]:{color:t.red,symbol:`✖`,name:`ERROR`},[e.FATAL]:{color:t.bgRed+t.white,symbol:`💀`,name:`FATAL`}};var r=class{enableColors;constructor(e=!0){this.enableColors=e}format(e){let r=[],i=n[e.level],a=this.formatTimestamp(e.timestamp);r.push(this.colorize(a,t.gray));let o=`${i.symbol} ${i.name}`;if(r.push(this.colorize(o,i.color)),e.traceId){let n=this.formatTraceInfo(e);r.push(this.colorize(n,t.cyan))}if(r.push(this.colorize(e.message,t.white)),e.duration!==void 0){let n=`(${this.formatDuration(e.duration)})`;r.push(this.colorize(n,t.magenta))}let s=r.join(` `);if(e.context&&Object.keys(e.context).length>0&&(s+=`
2
- `+this.formatContext(e.context)),e.metadata&&Object.keys(e.metadata).length>0&&(s+=`
3
- `+this.formatMetadata(e.metadata)),e.error&&(s+=`
4
- `+this.formatError(e.error)),e.tags&&e.tags.length>0){let n=e.tags.map(e=>`#${e}`).join(` `);s+=`
5
- `+this.colorize(`Tags: ${n}`,t.blue)}return s}formatTimestamp(e){return e.toISOString().substring(11,23)}formatTraceInfo(e){let t=[`trace:${e.traceId?.substring(0,8)||`unknown`}`];return e.spanId&&e.spanId.length>=8&&t.push(`span:${e.spanId.substring(0,8)}`),e.parentId&&e.parentId.length>=8&&t.push(`parent:${e.parentId.substring(0,8)}`),`[${t.join(`|`)}]`}formatDuration(e){return e<1?`${(e*1e3).toFixed(0)}μs`:e<1e3?`${e.toFixed(2)}ms`:`${(e/1e3).toFixed(2)}s`}formatContext(e){let n=this.formatObject(e,2);return this.colorize(`Context: ${n}`,t.cyan)}formatMetadata(e){let n=this.formatObject(e,2);return this.colorize(`Metadata: ${n}`,t.blue)}formatError(e){let n=this.colorize(`Error: ${e.name}: ${e.message}`,t.red);if(e.stack){let r=e.stack.split(`
6
- `).slice(1,6).map(e=>` ${e}`).join(`
7
- `);n+=`
8
- `+this.colorize(r,t.gray)}return n}formatObject(e,t=0){let n=` `.repeat(t),r=Object.entries(e);return r.length===0?`{}`:r[0]&&typeof r[0][1]!=`object`?`{ ${r[0][0]}: ${this.formatValue(r[0][1])} }`:`{\n${r.map(([e,r])=>`${n} ${e}: ${this.formatValue(r,t+2)}`).join(`
9
- `)}\n${n}}`}formatValue(e,t=0){return e===null?`null`:e===void 0?`undefined`:typeof e==`string`?`"${e}"`:typeof e==`boolean`||typeof e==`number`?String(e):e instanceof Date?e.toISOString():Array.isArray(e)?e.length===0?`[]`:`[${e.map(e=>this.formatValue(e)).join(`, `)}]`:typeof e==`object`?this.formatObject(e,t):String(e)}colorize(e,n){return this.enableColors?`${n}${e}${t.reset}`:e}},i=class{format(e){let t={timestamp:e.timestamp,level:e.level,message:e.message};return e.traceId&&(t.traceId=e.traceId),e.spanId&&(t.spanId=e.spanId),e.parentId&&(t.parentId=e.parentId),e.duration!==void 0&&(t.duration=e.duration),e.context&&Object.keys(e.context).length>0&&(t.context=e.context),e.metadata&&Object.keys(e.metadata).length>0&&(t.metadata=e.metadata),e.error&&(t.error={name:e.error.name,message:e.error.message,stack:e.error.stack}),e.tags&&e.tags.length>0&&(t.tags=e.tags),JSON.stringify(t)}},a=class{template;dateFormat;constructor(e=`{timestamp} [{level}] {message}`,t){this.template=e,this.dateFormat=t||(e=>e.toISOString())}format(t){let n=e[t.level],r=this.dateFormat(t.timestamp),i=this.template.replace(`{timestamp}`,r).replace(`{level}`,n).replace(`{message}`,t.message).replace(`{traceId}`,t.traceId||``).replace(`{spanId}`,t.spanId||``).replace(`{duration}`,t.duration?.toString()||``);return t.context&&(i=i.replace(`{context}`,JSON.stringify(t.context))),t.metadata&&(i=i.replace(`{metadata}`,JSON.stringify(t.metadata))),i}};export{a as CustomFormatter,r as DevFormatter,i as ProductionFormatter};
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.mjs","names":["parts: string[]","logObject: LogEntry"],"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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"}
@@ -0,0 +1,7 @@
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 };
@@ -1 +1,8 @@
1
- import{LogContext as e}from"./context.browser.mjs";import{LogLevel as t}from"./types.mjs";import{Timer as n}from"./timer.mjs";import{DevFormatter as r,ProductionFormatter as i}from"./formatters.mjs";import{Tracer as a}from"./tracer.browser.mjs";import{Logger as o}from"./logger.browser.mjs";export{r as DevFormatter,e as LogContext,t as LogLevel,o as Logger,i as ProductionFormatter,n as Timer,a as Tracer};
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 };
@@ -0,0 +1,8 @@
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 { createElysiaLogger, 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, createElysiaLogger, elysiaLogger };
package/dist/index.mjs CHANGED
@@ -1 +1,9 @@
1
- import{LogContext as e}from"./context.node.mjs";import{LogLevel as t}from"./types.mjs";import{Timer as n}from"./timer.mjs";import{Tracer as r}from"./tracer.node.mjs";import{DevFormatter as i,ProductionFormatter as a}from"./formatters.mjs";import{Logger as o}from"./logger.node.mjs";import{createElysiaLogger as s,elysiaLogger as c}from"./elysia-plugin.mjs";export{i as DevFormatter,e as LogContext,t as LogLevel,o as Logger,a as ProductionFormatter,n as Timer,r as Tracer,s as createElysiaLogger,c as elysiaLogger};
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 { createElysiaLogger, elysiaLogger } from "./elysia-plugin.mjs";
8
+
9
+ export { DevFormatter, LogContext, LogLevel, Logger, ProductionFormatter, Timer, Tracer, createElysiaLogger, elysiaLogger };
@@ -0,0 +1,51 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.browser.d.mts","names":[],"sources":["../src/logger.browser.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +1,190 @@
1
- import{LogContext as e}from"./context.browser.mjs";import{LogLevel as t}from"./types.mjs";import{TimerManager as n}from"./timer.mjs";import{DevFormatter as r,ProductionFormatter as i}from"./formatters.mjs";import{Tracer as a}from"./tracer.browser.mjs";var o=class o{config;formatter;context;tracer;timerManager;constructor(o){this.config={level:t.INFO,environment:process.env.NODE_ENV||`development`,enableTracing:!0,enableTiming:!0,enableContext:!0,enableColors:!0,maxContextDepth:10,timestampFormat:`iso`,...o},this.context=e.getInstance(),this.tracer=new a,this.timerManager=new n,this.formatter=this.config.environment===`production`?new i:new r(this.config.enableColors)}traceLog(e,n){this.log(t.TRACE,e,n)}debug(e,n){this.log(t.DEBUG,e,n)}info(e,n){this.log(t.INFO,e,n)}warn(e,n){this.log(t.WARN,e,n)}error(e,n,r){this.log(t.ERROR,e,n,r)}fatal(e,n,r){this.log(t.FATAL,e,n,r)}withContext(e,t){return this.context.run(e,t)}extendContext(e,t){return this.context.extend(e,t)}setContext(e,t){this.context.set(e,t)}getContext(){return this.context.getContext()}trace=async(e,t)=>this.config.enableTracing?this.tracer.trace(e,t):await t();getTraceId(){return this.tracer.getCurrentTrace()?.traceId}startSpan(e){return this.config.enableTracing?this.tracer.startSpan(e):null}finishSpan(e){if(this.config.enableTracing)return this.tracer.finishSpan(e)}addTraceMetadata(e,t){this.config.enableTracing&&this.tracer.addMetadata(e,t)}addTraceTags(...e){this.config.enableTracing&&this.tracer.addTags(...e)}startTimer(e){return this.config.enableTiming?this.timerManager.start(e):null}stopTimer(e){if(this.config.enableTiming)return this.timerManager.stop(e)}getTimer(e){return this.timerManager.get(e)}child(e){let t=new o(this.config);return Object.entries(e).forEach(([e,n])=>{t.setContext(e,n)}),t}setLevel(e){this.config.level=e}setFormatter(e){this.formatter=e}async profile(e,n,r){let i=this.startTimer(`profile-${e}`),a=performance.now();try{let o=await this.tracer.trace({operationType:`custom`,operationName:`profile:${e}`,autoTiming:!0},n),s=performance.now()-a;return i?.stop(),r?.logLevel||t.DEBUG,this.log(t.DEBUG,`Profile: ${e} completed`,{operation:e,duration:`${s.toFixed(2)}ms`,result:r?.logResult?o:`[result hidden]`}),o}catch(t){let n=performance.now()-a;throw i?.stop(),this.error(`Profile: ${e} failed`,{operation:e,duration:`${n.toFixed(2)}ms`,error:t.message},t),t}}logRequest(e,t,n,r){let i=this.getHttpLogLevel(n),a=`${e.toUpperCase()} ${t}${n?` ${n}`:``}`;this.log(i,a,{method:e,url:t,statusCode:n,duration:r?`${r.toFixed(2)}ms`:void 0,type:`http_request`})}async flush(){this.timerManager.clear()}getStats(){return{activeTimers:this.timerManager.getActive().length,activeSpans:this.tracer.getActiveSpans().length,config:{...this.config}}}output(e,n){n>=t.ERROR?console.error(e):console.log(e)}log(e,t,n,r){if(e<this.config.level)return;let i=this.config.enableTracing?this.tracer.getCurrentTrace():void 0,a=this.config.enableContext?this.context.getContext():void 0,o={level:e,message:t,timestamp:new Date,traceId:i?.traceId,parentId:i?.parentId,spanId:i?.spanId,context:a,metadata:n,error:r,tags:i?.tags};i?.metadata?.duration&&(o.duration=i.metadata.duration);let s=this.formatter.format(o);this.output(s,e)}getHttpLogLevel(e){return e?e>=500?t.ERROR:e>=400?t.WARN:t.INFO:t.INFO}};export{o as Logger};
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.browser.mjs","names":["entry: LogEntry"],"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":";;;;;;;AAcA,IAAa,SAAb,MAAa,OAAO;CAClB,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,QAAgC;AAC1C,OAAK,SAAS;GACZ,OAAO,SAAS;GAChB,aACG,QAAQ,IAAI,YAA4C;GAC3D,eAAe;GACf,cAAc;GACd,eAAe;GACf,cAAc;GACd,iBAAiB;GACjB,iBAAiB;GACjB,GAAG;GACJ;AAED,OAAK,UAAU,WAAW,aAAa;AACvC,OAAK,SAAS,IAAI,QAAQ;AAC1B,OAAK,eAAe,IAAI,cAAc;AAGtC,OAAK,YACH,KAAK,OAAO,gBAAgB,eACxB,IAAI,qBAAqB,GACzB,IAAI,aAAa,KAAK,OAAO,aAAa;;CAIlD,SAAS,SAAiB,UAA0C;AAClE,OAAK,IAAI,SAAS,OAAO,SAAS,SAAS;;CAG7C,MAAM,SAAiB,UAA0C;AAC/D,OAAK,IAAI,SAAS,OAAO,SAAS,SAAS;;CAG7C,KAAK,SAAiB,UAA0C;AAC9D,OAAK,IAAI,SAAS,MAAM,SAAS,SAAS;;CAG5C,KAAK,SAAiB,UAA0C;AAC9D,OAAK,IAAI,SAAS,MAAM,SAAS,SAAS;;CAG5C,MACE,SACA,UACA,OACM;AACN,OAAK,IAAI,SAAS,OAAO,SAAS,UAAU,MAAM;;CAGpD,MACE,SACA,UACA,OACM;AACN,OAAK,IAAI,SAAS,OAAO,SAAS,UAAU,MAAM;;CAIpD,YAAe,SAAsB,IAAgB;AACnD,SAAO,KAAK,QAAQ,IAAI,SAAS,GAAG;;CAGtC,cAAiB,mBAAyC,IAAgB;AACxE,SAAO,KAAK,QAAQ,OAAO,mBAAmB,GAAG;;CAGnD,WAAW,KAAa,OAAsB;AAC5C,OAAK,QAAQ,IAAI,KAAK,MAAM;;CAG9B,aAA0B;AACxB,SAAO,KAAK,QAAQ,YAAY;;CAIlC,QAAqB,OACnB,SACA,OACe;AACf,MAAI,CAAC,KAAK,OAAO,cACf,QAAO,MAAM,IAAI;AAGnB,SAAO,KAAK,OAAO,MAAM,SAAS,GAAG;;CAGvC,aAAiC;AAC/B,SAAO,KAAK,OAAO,iBAAiB,EAAE;;CAGxC,UAAU,SAAyB;AACjC,MAAI,CAAC,KAAK,OAAO,cACf,QAAO;AAET,SAAO,KAAK,OAAO,UAAU,QAAQ;;CAGvC,WAAW,QAAoC;AAC7C,MAAI,CAAC,KAAK,OAAO,cACf;AAEF,SAAO,KAAK,OAAO,WAAW,OAAO;;CAGvC,iBAAiB,KAAa,OAAsB;AAClD,MAAI,KAAK,OAAO,cACd,MAAK,OAAO,YAAY,KAAK,MAAM;;CAIvC,aAAa,GAAG,MAAsB;AACpC,MAAI,KAAK,OAAO,cACd,MAAK,OAAO,QAAQ,GAAG,KAAK;;CAKhC,WAAW,IAA2B;AACpC,MAAI,CAAC,KAAK,OAAO,aACf,QAAO;AAET,SAAO,KAAK,aAAa,MAAM,GAAG;;CAGpC,UAAU,IAAgC;AACxC,MAAI,CAAC,KAAK,OAAO,aACf;AAEF,SAAO,KAAK,aAAa,KAAK,GAAG;;CAGnC,SAAS,IAA+B;AACtC,SAAO,KAAK,aAAa,IAAI,GAAG;;CAIlC,MAAM,SAAuC;EAC3C,MAAM,cAAc,IAAI,OAAO,KAAK,OAAO;AAC3C,SAAO,QAAQ,QAAQ,CAAC,SAAS,CAAC,KAAK,WAAW;AAChD,eAAY,WAAW,KAAK,MAAM;IAClC;AACF,SAAO;;CAGT,SAAS,OAAuB;AAC9B,OAAK,OAAO,QAAQ;;CAGtB,aAAa,WAA4B;AACvC,OAAK,YAAY;;CAInB,MAAM,QACJ,eACA,IACA,SACY;EACZ,MAAM,QAAQ,KAAK,WAAW,WAAW,gBAAgB;EACzD,MAAM,YAAY,YAAY,KAAK;AAEnC,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,OAAO,MAC/B;IACE,eAAe;IACf,eAAe,WAAW;IAC1B,YAAY;IACb,EACD,GACD;GAED,MAAM,WAAW,YAAY,KAAK,GAAG;AACrC,UAAO,MAAM;GAEb,MAAM,WAAW,SAAS,YAAY,SAAS;AAC/C,QAAK,IAAI,UAAU,YAAY,cAAc,aAAa;IACxD,WAAW;IACX,UAAU,GAAG,SAAS,QAAQ,EAAE,CAAC;IACjC,QAAQ,SAAS,YAAY,SAAS;IACvC,CAAC;AAEF,UAAO;WACA,OAAO;GACd,MAAM,WAAW,YAAY,KAAK,GAAG;AACrC,UAAO,MAAM;AAEb,QAAK,MACH,YAAY,cAAc,UAC1B;IACE,WAAW;IACX,UAAU,GAAG,SAAS,QAAQ,EAAE,CAAC;IACjC,OAAQ,MAAgB;IACzB,EACD,MACD;AAED,SAAM;;;CAKV,WACE,QACA,KACA,YACA,UACM;EACN,MAAM,QAAQ,KAAK,gBAAgB,WAAW;EAC9C,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC,GAAG,MAAM,aAAa,IAAI,eAAe;AAEjF,OAAK,IAAI,OAAO,SAAS;GACvB;GACA;GACA;GACA,UAAU,WAAW,GAAG,SAAS,QAAQ,EAAE,CAAC,MAAM;GAClD,MAAM;GACP,CAAC;;CAIJ,MAAM,QAAuB;AAC3B,OAAK,aAAa,OAAO;;CAI3B,WAIE;AACA,SAAO;GACL,cAAc,KAAK,aAAa,WAAW,CAAC;GAC5C,aAAa,KAAK,OAAO,gBAAgB,CAAC;GAC1C,QAAQ,EAAE,GAAG,KAAK,QAAQ;GAC3B;;CAIH,AAAU,OAAO,SAAiB,OAAuB;AACvD,MAAI,SAAS,SAAS,MACpB,SAAQ,MAAM,QAAQ;MAEtB,SAAQ,IAAI,QAAQ;;CAKxB,AAAQ,IACN,OACA,SACA,UACA,OACM;AACN,MAAI,QAAQ,KAAK,OAAO,MACtB;EAGF,MAAM,eAAe,KAAK,OAAO,gBAC7B,KAAK,OAAO,iBAAiB,GAC7B;EACJ,MAAM,cAAc,KAAK,OAAO,gBAC5B,KAAK,QAAQ,YAAY,GACzB;EAEJ,MAAMA,QAAkB;GACtB;GACA;GACA,2BAAW,IAAI,MAAM;GACrB,SAAS,cAAc;GACvB,UAAU,cAAc;GACxB,QAAQ,cAAc;GACtB,SAAS;GACT;GACA;GACA,MAAM,cAAc;GACrB;AAGD,MAAI,cAAc,UAAU,SAC1B,OAAM,WAAW,aAAa,SAAS;EAGzC,MAAM,YAAY,KAAK,UAAU,OAAO,MAAM;AAC9C,OAAK,OAAO,WAAW,MAAM;;CAG/B,AAAQ,gBAAgB,YAA+B;AACrD,MAAI,CAAC,WAAY,QAAO,SAAS;AACjC,MAAI,cAAc,IAAK,QAAO,SAAS;AACvC,MAAI,cAAc,IAAK,QAAO,SAAS;AACvC,SAAO,SAAS"}
@@ -0,0 +1,2 @@
1
+ import { Logger } from "./logger.node.mjs";
2
+ export { Logger };
package/dist/logger.mjs CHANGED
@@ -1 +1,3 @@
1
- import{Logger as e}from"./logger.node.mjs";export{e as Logger};
1
+ import { Logger } from "./logger.node.mjs";
2
+
3
+ export { Logger };
@@ -0,0 +1,51 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.node.d.mts","names":[],"sources":["../src/logger.node.ts"],"sourcesContent":[],"mappings":"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"}