@noego/logger 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -0
- package/dist/core/abstract_logger.cjs +140 -0
- package/dist/core/abstract_logger.cjs.map +1 -0
- package/dist/core/abstract_logger.d.cts +55 -0
- package/dist/core/abstract_logger.d.ts +55 -0
- package/dist/core/abstract_logger.js +116 -0
- package/dist/core/abstract_logger.js.map +1 -0
- package/dist/core/log_level.cjs +78 -0
- package/dist/core/log_level.cjs.map +1 -0
- package/dist/core/log_level.d.cts +12 -0
- package/dist/core/log_level.d.ts +12 -0
- package/dist/core/log_level.js +52 -0
- package/dist/core/log_level.js.map +1 -0
- package/dist/core/log_transport.cjs +17 -0
- package/dist/core/log_transport.cjs.map +1 -0
- package/dist/core/log_transport.d.cts +15 -0
- package/dist/core/log_transport.d.ts +15 -0
- package/dist/core/log_transport.js +1 -0
- package/dist/core/log_transport.js.map +1 -0
- package/dist/core/logging_manager.cjs +130 -0
- package/dist/core/logging_manager.cjs.map +1 -0
- package/dist/core/logging_manager.d.cts +44 -0
- package/dist/core/logging_manager.d.ts +44 -0
- package/dist/core/logging_manager.js +103 -0
- package/dist/core/logging_manager.js.map +1 -0
- package/dist/get_logger.cjs +33 -0
- package/dist/get_logger.cjs.map +1 -0
- package/dist/get_logger.d.cts +25 -0
- package/dist/get_logger.d.ts +25 -0
- package/dist/get_logger.js +9 -0
- package/dist/get_logger.js.map +1 -0
- package/dist/index.cjs +48 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/ioc/index.cjs +34 -0
- package/dist/ioc/index.cjs.map +1 -0
- package/dist/ioc/index.d.cts +41 -0
- package/dist/ioc/index.d.ts +41 -0
- package/dist/ioc/index.js +10 -0
- package/dist/ioc/index.js.map +1 -0
- package/dist/transports/console.cjs +31 -0
- package/dist/transports/console.cjs.map +1 -0
- package/dist/transports/console.d.cts +2 -0
- package/dist/transports/console.d.ts +2 -0
- package/dist/transports/console.js +7 -0
- package/dist/transports/console.js.map +1 -0
- package/dist/transports/console_transport.cjs +48 -0
- package/dist/transports/console_transport.cjs.map +1 -0
- package/dist/transports/console_transport.d.cts +7 -0
- package/dist/transports/console_transport.d.ts +7 -0
- package/dist/transports/console_transport.js +24 -0
- package/dist/transports/console_transport.js.map +1 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# @noego/logger
|
|
2
|
+
|
|
3
|
+
Lightweight logging for Node.js with:
|
|
4
|
+
|
|
5
|
+
- level filtering (`TRACE` to `FATAL`)
|
|
6
|
+
- named loggers
|
|
7
|
+
- contextual metadata
|
|
8
|
+
- pluggable transports
|
|
9
|
+
- optional `@noego/ioc` integration
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @noego/logger
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { getLogger, configureLogging, LogLevel } from "@noego/logger";
|
|
21
|
+
|
|
22
|
+
configureLogging({
|
|
23
|
+
level: LogLevel.INFO,
|
|
24
|
+
serviceName: "my-service",
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const logger = getLogger("api");
|
|
28
|
+
logger.info("Server started", { port: 3000 });
|
|
29
|
+
logger.error("Request failed", new Error("boom"));
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Context and Named Loggers
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
const base = getLogger("http").withContext({ requestId: "req_123" });
|
|
36
|
+
|
|
37
|
+
base.info("Incoming request");
|
|
38
|
+
base.named("auth").warn("Invalid token", { userId: "u_42" });
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## IoC Integration
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { createContainer } from "@noego/ioc";
|
|
45
|
+
import { registerLoggerFactory } from "@noego/logger/ioc";
|
|
46
|
+
|
|
47
|
+
const container = createContainer();
|
|
48
|
+
registerLoggerFactory(container, Symbol.for("app:logger"), "app");
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## API
|
|
52
|
+
|
|
53
|
+
- `getLogger(name)` -> logger instance
|
|
54
|
+
- `configureLogging(options)` -> configure global manager
|
|
55
|
+
- `shutdown()` -> close all transports
|
|
56
|
+
- `ConsoleTransport` -> default console transport implementation
|
|
57
|
+
|
|
58
|
+
## Environment Variables
|
|
59
|
+
|
|
60
|
+
- `LOG_LEVEL` (default: inferred by library, typically `INFO`)
|
|
61
|
+
- `SERVICE_NAME` (default: `noego`)
|
|
62
|
+
- `NODE_ENV` (default: `development`)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var abstract_logger_exports = {};
|
|
20
|
+
__export(abstract_logger_exports, {
|
|
21
|
+
NamedLogger: () => NamedLogger
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(abstract_logger_exports);
|
|
24
|
+
var import_log_level = require("./log_level.cjs");
|
|
25
|
+
function safeJsonStringify(value) {
|
|
26
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
27
|
+
try {
|
|
28
|
+
return JSON.stringify(value, (_key, val) => {
|
|
29
|
+
if (typeof val === "bigint") return val.toString();
|
|
30
|
+
if (typeof val === "object" && val !== null) {
|
|
31
|
+
if (seen.has(val)) return "[Circular]";
|
|
32
|
+
seen.add(val);
|
|
33
|
+
}
|
|
34
|
+
if (val instanceof Error) {
|
|
35
|
+
return { name: val.name, message: val.message, stack: val.stack };
|
|
36
|
+
}
|
|
37
|
+
return val;
|
|
38
|
+
});
|
|
39
|
+
} catch {
|
|
40
|
+
return '"[Unserializable]"';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function formatArg(arg) {
|
|
44
|
+
if (arg === void 0) return "undefined";
|
|
45
|
+
if (arg === null) return null;
|
|
46
|
+
if (arg instanceof Error) {
|
|
47
|
+
return { name: arg.name, message: arg.message, stack: arg.stack };
|
|
48
|
+
}
|
|
49
|
+
switch (typeof arg) {
|
|
50
|
+
case "string":
|
|
51
|
+
case "number":
|
|
52
|
+
case "boolean":
|
|
53
|
+
return arg;
|
|
54
|
+
case "bigint":
|
|
55
|
+
return arg.toString();
|
|
56
|
+
case "symbol":
|
|
57
|
+
return String(arg);
|
|
58
|
+
case "function":
|
|
59
|
+
return `[Function${arg.name ? `: ${arg.name}` : ""}]`;
|
|
60
|
+
default:
|
|
61
|
+
return arg;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function formatArgAsString(arg) {
|
|
65
|
+
const formatted = formatArg(arg);
|
|
66
|
+
if (typeof formatted === "string") return formatted;
|
|
67
|
+
return safeJsonStringify(formatted);
|
|
68
|
+
}
|
|
69
|
+
class AbstractLogger {
|
|
70
|
+
constructor(name, manager, contextData) {
|
|
71
|
+
this.name = name;
|
|
72
|
+
this.manager = manager;
|
|
73
|
+
this.contextData = contextData;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Creates a new logger with the specified name.
|
|
77
|
+
* Replaces the current logger's name (not hierarchical).
|
|
78
|
+
*/
|
|
79
|
+
named(name) {
|
|
80
|
+
return new NamedLogger(name, this.manager, this.contextData);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new logger with additional context.
|
|
84
|
+
* Context is merged into every log entry's context field.
|
|
85
|
+
* If this logger already has context, both contexts are merged.
|
|
86
|
+
* Returns a new logger instance (immutable operation).
|
|
87
|
+
*/
|
|
88
|
+
withContext(context) {
|
|
89
|
+
const mergedContext = this.contextData ? { ...this.contextData, ...context } : context;
|
|
90
|
+
return new NamedLogger(this.name, this.manager, mergedContext);
|
|
91
|
+
}
|
|
92
|
+
trace(message, ...args) {
|
|
93
|
+
this.log(import_log_level.LogLevel.TRACE, message, args);
|
|
94
|
+
}
|
|
95
|
+
debug(message, ...args) {
|
|
96
|
+
this.log(import_log_level.LogLevel.DEBUG, message, args);
|
|
97
|
+
}
|
|
98
|
+
info(message, ...args) {
|
|
99
|
+
this.log(import_log_level.LogLevel.INFO, message, args);
|
|
100
|
+
}
|
|
101
|
+
warn(message, ...args) {
|
|
102
|
+
this.log(import_log_level.LogLevel.WARN, message, args);
|
|
103
|
+
}
|
|
104
|
+
error(message, ...args) {
|
|
105
|
+
this.log(import_log_level.LogLevel.ERROR, message, args);
|
|
106
|
+
}
|
|
107
|
+
fatal(message, ...args) {
|
|
108
|
+
this.log(import_log_level.LogLevel.FATAL, message, args);
|
|
109
|
+
}
|
|
110
|
+
log(level, message, args) {
|
|
111
|
+
if (!this.manager.shouldLog(level, this.name)) return;
|
|
112
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
113
|
+
let argsContext = args.length > 0 ? args.length === 1 ? formatArg(args[0]) : args.map(formatArg) : void 0;
|
|
114
|
+
let context;
|
|
115
|
+
if (this.contextData && argsContext !== void 0) {
|
|
116
|
+
context = { ...this.contextData, args: argsContext };
|
|
117
|
+
} else if (this.contextData) {
|
|
118
|
+
context = this.contextData;
|
|
119
|
+
} else {
|
|
120
|
+
context = argsContext;
|
|
121
|
+
}
|
|
122
|
+
this.manager.log({
|
|
123
|
+
timestamp,
|
|
124
|
+
level: (0, import_log_level.logLevelName)(level),
|
|
125
|
+
logger: this.name,
|
|
126
|
+
message,
|
|
127
|
+
context
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
class NamedLogger extends AbstractLogger {
|
|
132
|
+
constructor(name, manager, contextData) {
|
|
133
|
+
super(name, manager, contextData);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
137
|
+
0 && (module.exports = {
|
|
138
|
+
NamedLogger
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=abstract_logger.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/abstract_logger.ts"],"sourcesContent":["import { LogLevel, logLevelName } from \"./log_level.cjs\";\nimport type { LogEntry } from \"./log_transport.cjs\";\nimport type { LoggingManager } from \"./logging_manager.cjs\";\n\n/**\n * Safely stringifies values, handling circular references, bigints, Errors, and symbols.\n */\nfunction safeJsonStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n try {\n return JSON.stringify(value, (_key, val: unknown) => {\n if (typeof val === \"bigint\") return val.toString();\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n return val;\n });\n } catch {\n return '\"[Unserializable]\"';\n }\n}\n\n/**\n * Formats an argument for logging, converting special types to loggable values.\n */\nfunction formatArg(arg: unknown): unknown {\n if (arg === undefined) return \"undefined\";\n if (arg === null) return null;\n\n if (arg instanceof Error) {\n return { name: arg.name, message: arg.message, stack: arg.stack };\n }\n\n switch (typeof arg) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return arg;\n case \"bigint\":\n return arg.toString();\n case \"symbol\":\n return String(arg);\n case \"function\":\n return `[Function${arg.name ? `: ${arg.name}` : \"\"}]`;\n default:\n return arg;\n }\n}\n\n/**\n * Formats an argument as a string for logging.\n */\nfunction formatArgAsString(arg: unknown): string {\n const formatted = formatArg(arg);\n if (typeof formatted === \"string\") return formatted;\n return safeJsonStringify(formatted);\n}\n\n/**\n * Public logger interface with all logging methods.\n */\nexport interface Logger {\n named(name: string): Logger;\n withContext(context: Record<string, unknown>): Logger;\n trace(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n fatal(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Base logger class providing logging functionality.\n * Not exported directly; use Logger interface and NamedLogger class.\n */\nabstract class AbstractLogger implements Logger {\n protected constructor(\n private readonly name: string,\n protected readonly manager: LoggingManager,\n private readonly contextData?: Record<string, unknown>\n ) {}\n\n /**\n * Creates a new logger with the specified name.\n * Replaces the current logger's name (not hierarchical).\n */\n named(name: string): Logger {\n return new NamedLogger(name, this.manager, this.contextData);\n }\n\n /**\n * Creates a new logger with additional context.\n * Context is merged into every log entry's context field.\n * If this logger already has context, both contexts are merged.\n * Returns a new logger instance (immutable operation).\n */\n withContext(context: Record<string, unknown>): Logger {\n const mergedContext = this.contextData\n ? { ...this.contextData, ...context }\n : context;\n return new NamedLogger(this.name, this.manager, mergedContext);\n }\n\n trace(message: string, ...args: unknown[]): void {\n this.log(LogLevel.TRACE, message, args);\n }\n\n debug(message: string, ...args: unknown[]): void {\n this.log(LogLevel.DEBUG, message, args);\n }\n\n info(message: string, ...args: unknown[]): void {\n this.log(LogLevel.INFO, message, args);\n }\n\n warn(message: string, ...args: unknown[]): void {\n this.log(LogLevel.WARN, message, args);\n }\n\n error(message: string, ...args: unknown[]): void {\n this.log(LogLevel.ERROR, message, args);\n }\n\n fatal(message: string, ...args: unknown[]): void {\n this.log(LogLevel.FATAL, message, args);\n }\n\n private log(level: LogLevel, message: string, args: unknown[]): void {\n // Pass logger name to support per-logger level overrides\n if (!this.manager.shouldLog(level, this.name)) return;\n\n const timestamp = new Date().toISOString();\n\n // Format args as context\n let argsContext = args.length > 0\n ? (args.length === 1 ? formatArg(args[0]) : args.map(formatArg))\n : undefined;\n\n // Merge with contextData if present\n let context: unknown;\n if (this.contextData && argsContext !== undefined) {\n // Both contextData and args exist - merge them\n context = { ...this.contextData, args: argsContext };\n } else if (this.contextData) {\n // Only contextData exists\n context = this.contextData;\n } else {\n // Only args exist (or neither)\n context = argsContext;\n }\n\n this.manager.log({\n timestamp,\n level: logLevelName(level),\n logger: this.name,\n message,\n context,\n });\n }\n}\n\n/**\n * Public-facing logger class with a specific name.\n * Use getLogger() factory to create instances.\n */\nexport class NamedLogger extends AbstractLogger {\n constructor(\n name: string,\n manager: LoggingManager,\n contextData?: Record<string, unknown>\n ) {\n super(name, manager, contextData);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LoggingManager } from './logging_manager.cjs';
|
|
2
|
+
import './log_level.cjs';
|
|
3
|
+
import './log_transport.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Public logger interface with all logging methods.
|
|
7
|
+
*/
|
|
8
|
+
interface Logger {
|
|
9
|
+
named(name: string): Logger;
|
|
10
|
+
withContext(context: Record<string, unknown>): Logger;
|
|
11
|
+
trace(message: string, ...args: unknown[]): void;
|
|
12
|
+
debug(message: string, ...args: unknown[]): void;
|
|
13
|
+
info(message: string, ...args: unknown[]): void;
|
|
14
|
+
warn(message: string, ...args: unknown[]): void;
|
|
15
|
+
error(message: string, ...args: unknown[]): void;
|
|
16
|
+
fatal(message: string, ...args: unknown[]): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Base logger class providing logging functionality.
|
|
20
|
+
* Not exported directly; use Logger interface and NamedLogger class.
|
|
21
|
+
*/
|
|
22
|
+
declare abstract class AbstractLogger implements Logger {
|
|
23
|
+
private readonly name;
|
|
24
|
+
protected readonly manager: LoggingManager;
|
|
25
|
+
private readonly contextData?;
|
|
26
|
+
protected constructor(name: string, manager: LoggingManager, contextData?: Record<string, unknown> | undefined);
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new logger with the specified name.
|
|
29
|
+
* Replaces the current logger's name (not hierarchical).
|
|
30
|
+
*/
|
|
31
|
+
named(name: string): Logger;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new logger with additional context.
|
|
34
|
+
* Context is merged into every log entry's context field.
|
|
35
|
+
* If this logger already has context, both contexts are merged.
|
|
36
|
+
* Returns a new logger instance (immutable operation).
|
|
37
|
+
*/
|
|
38
|
+
withContext(context: Record<string, unknown>): Logger;
|
|
39
|
+
trace(message: string, ...args: unknown[]): void;
|
|
40
|
+
debug(message: string, ...args: unknown[]): void;
|
|
41
|
+
info(message: string, ...args: unknown[]): void;
|
|
42
|
+
warn(message: string, ...args: unknown[]): void;
|
|
43
|
+
error(message: string, ...args: unknown[]): void;
|
|
44
|
+
fatal(message: string, ...args: unknown[]): void;
|
|
45
|
+
private log;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Public-facing logger class with a specific name.
|
|
49
|
+
* Use getLogger() factory to create instances.
|
|
50
|
+
*/
|
|
51
|
+
declare class NamedLogger extends AbstractLogger {
|
|
52
|
+
constructor(name: string, manager: LoggingManager, contextData?: Record<string, unknown>);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { type Logger, NamedLogger };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LoggingManager } from './logging_manager.js';
|
|
2
|
+
import './log_level.js';
|
|
3
|
+
import './log_transport.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Public logger interface with all logging methods.
|
|
7
|
+
*/
|
|
8
|
+
interface Logger {
|
|
9
|
+
named(name: string): Logger;
|
|
10
|
+
withContext(context: Record<string, unknown>): Logger;
|
|
11
|
+
trace(message: string, ...args: unknown[]): void;
|
|
12
|
+
debug(message: string, ...args: unknown[]): void;
|
|
13
|
+
info(message: string, ...args: unknown[]): void;
|
|
14
|
+
warn(message: string, ...args: unknown[]): void;
|
|
15
|
+
error(message: string, ...args: unknown[]): void;
|
|
16
|
+
fatal(message: string, ...args: unknown[]): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Base logger class providing logging functionality.
|
|
20
|
+
* Not exported directly; use Logger interface and NamedLogger class.
|
|
21
|
+
*/
|
|
22
|
+
declare abstract class AbstractLogger implements Logger {
|
|
23
|
+
private readonly name;
|
|
24
|
+
protected readonly manager: LoggingManager;
|
|
25
|
+
private readonly contextData?;
|
|
26
|
+
protected constructor(name: string, manager: LoggingManager, contextData?: Record<string, unknown> | undefined);
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new logger with the specified name.
|
|
29
|
+
* Replaces the current logger's name (not hierarchical).
|
|
30
|
+
*/
|
|
31
|
+
named(name: string): Logger;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new logger with additional context.
|
|
34
|
+
* Context is merged into every log entry's context field.
|
|
35
|
+
* If this logger already has context, both contexts are merged.
|
|
36
|
+
* Returns a new logger instance (immutable operation).
|
|
37
|
+
*/
|
|
38
|
+
withContext(context: Record<string, unknown>): Logger;
|
|
39
|
+
trace(message: string, ...args: unknown[]): void;
|
|
40
|
+
debug(message: string, ...args: unknown[]): void;
|
|
41
|
+
info(message: string, ...args: unknown[]): void;
|
|
42
|
+
warn(message: string, ...args: unknown[]): void;
|
|
43
|
+
error(message: string, ...args: unknown[]): void;
|
|
44
|
+
fatal(message: string, ...args: unknown[]): void;
|
|
45
|
+
private log;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Public-facing logger class with a specific name.
|
|
49
|
+
* Use getLogger() factory to create instances.
|
|
50
|
+
*/
|
|
51
|
+
declare class NamedLogger extends AbstractLogger {
|
|
52
|
+
constructor(name: string, manager: LoggingManager, contextData?: Record<string, unknown>);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { type Logger, NamedLogger };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { LogLevel, logLevelName } from "./log_level.js";
|
|
2
|
+
function safeJsonStringify(value) {
|
|
3
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
4
|
+
try {
|
|
5
|
+
return JSON.stringify(value, (_key, val) => {
|
|
6
|
+
if (typeof val === "bigint") return val.toString();
|
|
7
|
+
if (typeof val === "object" && val !== null) {
|
|
8
|
+
if (seen.has(val)) return "[Circular]";
|
|
9
|
+
seen.add(val);
|
|
10
|
+
}
|
|
11
|
+
if (val instanceof Error) {
|
|
12
|
+
return { name: val.name, message: val.message, stack: val.stack };
|
|
13
|
+
}
|
|
14
|
+
return val;
|
|
15
|
+
});
|
|
16
|
+
} catch {
|
|
17
|
+
return '"[Unserializable]"';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function formatArg(arg) {
|
|
21
|
+
if (arg === void 0) return "undefined";
|
|
22
|
+
if (arg === null) return null;
|
|
23
|
+
if (arg instanceof Error) {
|
|
24
|
+
return { name: arg.name, message: arg.message, stack: arg.stack };
|
|
25
|
+
}
|
|
26
|
+
switch (typeof arg) {
|
|
27
|
+
case "string":
|
|
28
|
+
case "number":
|
|
29
|
+
case "boolean":
|
|
30
|
+
return arg;
|
|
31
|
+
case "bigint":
|
|
32
|
+
return arg.toString();
|
|
33
|
+
case "symbol":
|
|
34
|
+
return String(arg);
|
|
35
|
+
case "function":
|
|
36
|
+
return `[Function${arg.name ? `: ${arg.name}` : ""}]`;
|
|
37
|
+
default:
|
|
38
|
+
return arg;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function formatArgAsString(arg) {
|
|
42
|
+
const formatted = formatArg(arg);
|
|
43
|
+
if (typeof formatted === "string") return formatted;
|
|
44
|
+
return safeJsonStringify(formatted);
|
|
45
|
+
}
|
|
46
|
+
class AbstractLogger {
|
|
47
|
+
constructor(name, manager, contextData) {
|
|
48
|
+
this.name = name;
|
|
49
|
+
this.manager = manager;
|
|
50
|
+
this.contextData = contextData;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates a new logger with the specified name.
|
|
54
|
+
* Replaces the current logger's name (not hierarchical).
|
|
55
|
+
*/
|
|
56
|
+
named(name) {
|
|
57
|
+
return new NamedLogger(name, this.manager, this.contextData);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Creates a new logger with additional context.
|
|
61
|
+
* Context is merged into every log entry's context field.
|
|
62
|
+
* If this logger already has context, both contexts are merged.
|
|
63
|
+
* Returns a new logger instance (immutable operation).
|
|
64
|
+
*/
|
|
65
|
+
withContext(context) {
|
|
66
|
+
const mergedContext = this.contextData ? { ...this.contextData, ...context } : context;
|
|
67
|
+
return new NamedLogger(this.name, this.manager, mergedContext);
|
|
68
|
+
}
|
|
69
|
+
trace(message, ...args) {
|
|
70
|
+
this.log(LogLevel.TRACE, message, args);
|
|
71
|
+
}
|
|
72
|
+
debug(message, ...args) {
|
|
73
|
+
this.log(LogLevel.DEBUG, message, args);
|
|
74
|
+
}
|
|
75
|
+
info(message, ...args) {
|
|
76
|
+
this.log(LogLevel.INFO, message, args);
|
|
77
|
+
}
|
|
78
|
+
warn(message, ...args) {
|
|
79
|
+
this.log(LogLevel.WARN, message, args);
|
|
80
|
+
}
|
|
81
|
+
error(message, ...args) {
|
|
82
|
+
this.log(LogLevel.ERROR, message, args);
|
|
83
|
+
}
|
|
84
|
+
fatal(message, ...args) {
|
|
85
|
+
this.log(LogLevel.FATAL, message, args);
|
|
86
|
+
}
|
|
87
|
+
log(level, message, args) {
|
|
88
|
+
if (!this.manager.shouldLog(level, this.name)) return;
|
|
89
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
90
|
+
let argsContext = args.length > 0 ? args.length === 1 ? formatArg(args[0]) : args.map(formatArg) : void 0;
|
|
91
|
+
let context;
|
|
92
|
+
if (this.contextData && argsContext !== void 0) {
|
|
93
|
+
context = { ...this.contextData, args: argsContext };
|
|
94
|
+
} else if (this.contextData) {
|
|
95
|
+
context = this.contextData;
|
|
96
|
+
} else {
|
|
97
|
+
context = argsContext;
|
|
98
|
+
}
|
|
99
|
+
this.manager.log({
|
|
100
|
+
timestamp,
|
|
101
|
+
level: logLevelName(level),
|
|
102
|
+
logger: this.name,
|
|
103
|
+
message,
|
|
104
|
+
context
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
class NamedLogger extends AbstractLogger {
|
|
109
|
+
constructor(name, manager, contextData) {
|
|
110
|
+
super(name, manager, contextData);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
NamedLogger
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=abstract_logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/abstract_logger.ts"],"sourcesContent":["import { LogLevel, logLevelName } from \"./log_level.js\";\nimport type { LogEntry } from \"./log_transport.js\";\nimport type { LoggingManager } from \"./logging_manager.js\";\n\n/**\n * Safely stringifies values, handling circular references, bigints, Errors, and symbols.\n */\nfunction safeJsonStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n try {\n return JSON.stringify(value, (_key, val: unknown) => {\n if (typeof val === \"bigint\") return val.toString();\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n return val;\n });\n } catch {\n return '\"[Unserializable]\"';\n }\n}\n\n/**\n * Formats an argument for logging, converting special types to loggable values.\n */\nfunction formatArg(arg: unknown): unknown {\n if (arg === undefined) return \"undefined\";\n if (arg === null) return null;\n\n if (arg instanceof Error) {\n return { name: arg.name, message: arg.message, stack: arg.stack };\n }\n\n switch (typeof arg) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return arg;\n case \"bigint\":\n return arg.toString();\n case \"symbol\":\n return String(arg);\n case \"function\":\n return `[Function${arg.name ? `: ${arg.name}` : \"\"}]`;\n default:\n return arg;\n }\n}\n\n/**\n * Formats an argument as a string for logging.\n */\nfunction formatArgAsString(arg: unknown): string {\n const formatted = formatArg(arg);\n if (typeof formatted === \"string\") return formatted;\n return safeJsonStringify(formatted);\n}\n\n/**\n * Public logger interface with all logging methods.\n */\nexport interface Logger {\n named(name: string): Logger;\n withContext(context: Record<string, unknown>): Logger;\n trace(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n fatal(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Base logger class providing logging functionality.\n * Not exported directly; use Logger interface and NamedLogger class.\n */\nabstract class AbstractLogger implements Logger {\n protected constructor(\n private readonly name: string,\n protected readonly manager: LoggingManager,\n private readonly contextData?: Record<string, unknown>\n ) {}\n\n /**\n * Creates a new logger with the specified name.\n * Replaces the current logger's name (not hierarchical).\n */\n named(name: string): Logger {\n return new NamedLogger(name, this.manager, this.contextData);\n }\n\n /**\n * Creates a new logger with additional context.\n * Context is merged into every log entry's context field.\n * If this logger already has context, both contexts are merged.\n * Returns a new logger instance (immutable operation).\n */\n withContext(context: Record<string, unknown>): Logger {\n const mergedContext = this.contextData\n ? { ...this.contextData, ...context }\n : context;\n return new NamedLogger(this.name, this.manager, mergedContext);\n }\n\n trace(message: string, ...args: unknown[]): void {\n this.log(LogLevel.TRACE, message, args);\n }\n\n debug(message: string, ...args: unknown[]): void {\n this.log(LogLevel.DEBUG, message, args);\n }\n\n info(message: string, ...args: unknown[]): void {\n this.log(LogLevel.INFO, message, args);\n }\n\n warn(message: string, ...args: unknown[]): void {\n this.log(LogLevel.WARN, message, args);\n }\n\n error(message: string, ...args: unknown[]): void {\n this.log(LogLevel.ERROR, message, args);\n }\n\n fatal(message: string, ...args: unknown[]): void {\n this.log(LogLevel.FATAL, message, args);\n }\n\n private log(level: LogLevel, message: string, args: unknown[]): void {\n // Pass logger name to support per-logger level overrides\n if (!this.manager.shouldLog(level, this.name)) return;\n\n const timestamp = new Date().toISOString();\n\n // Format args as context\n let argsContext = args.length > 0\n ? (args.length === 1 ? formatArg(args[0]) : args.map(formatArg))\n : undefined;\n\n // Merge with contextData if present\n let context: unknown;\n if (this.contextData && argsContext !== undefined) {\n // Both contextData and args exist - merge them\n context = { ...this.contextData, args: argsContext };\n } else if (this.contextData) {\n // Only contextData exists\n context = this.contextData;\n } else {\n // Only args exist (or neither)\n context = argsContext;\n }\n\n this.manager.log({\n timestamp,\n level: logLevelName(level),\n logger: this.name,\n message,\n context,\n });\n }\n}\n\n/**\n * Public-facing logger class with a specific name.\n * Use getLogger() factory to create instances.\n */\nexport class NamedLogger extends AbstractLogger {\n constructor(\n name: string,\n manager: LoggingManager,\n contextData?: Record<string, unknown>\n ) {\n super(name, manager, contextData);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var log_level_exports = {};
|
|
20
|
+
__export(log_level_exports, {
|
|
21
|
+
LogLevel: () => LogLevel,
|
|
22
|
+
logLevelName: () => logLevelName,
|
|
23
|
+
parseLogLevel: () => parseLogLevel
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(log_level_exports);
|
|
26
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
27
|
+
LogLevel2[LogLevel2["TRACE"] = 0] = "TRACE";
|
|
28
|
+
LogLevel2[LogLevel2["DEBUG"] = 1] = "DEBUG";
|
|
29
|
+
LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
|
|
30
|
+
LogLevel2[LogLevel2["WARN"] = 3] = "WARN";
|
|
31
|
+
LogLevel2[LogLevel2["ERROR"] = 4] = "ERROR";
|
|
32
|
+
LogLevel2[LogLevel2["FATAL"] = 5] = "FATAL";
|
|
33
|
+
return LogLevel2;
|
|
34
|
+
})(LogLevel || {});
|
|
35
|
+
const LEVEL_BY_NAME = {
|
|
36
|
+
trace: 0 /* TRACE */,
|
|
37
|
+
debug: 1 /* DEBUG */,
|
|
38
|
+
info: 2 /* INFO */,
|
|
39
|
+
warn: 3 /* WARN */,
|
|
40
|
+
error: 4 /* ERROR */,
|
|
41
|
+
fatal: 5 /* FATAL */
|
|
42
|
+
};
|
|
43
|
+
function parseLogLevel(value) {
|
|
44
|
+
if (!value) return 2 /* INFO */;
|
|
45
|
+
const normalized = value.trim().toLowerCase();
|
|
46
|
+
const byName = LEVEL_BY_NAME[normalized];
|
|
47
|
+
if (typeof byName === "number") return byName;
|
|
48
|
+
const asNumber = Number(normalized);
|
|
49
|
+
if (Number.isFinite(asNumber) && asNumber >= 0 && asNumber <= 5) {
|
|
50
|
+
return asNumber;
|
|
51
|
+
}
|
|
52
|
+
return 2 /* INFO */;
|
|
53
|
+
}
|
|
54
|
+
function logLevelName(level) {
|
|
55
|
+
switch (level) {
|
|
56
|
+
case 0 /* TRACE */:
|
|
57
|
+
return "TRACE";
|
|
58
|
+
case 1 /* DEBUG */:
|
|
59
|
+
return "DEBUG";
|
|
60
|
+
case 2 /* INFO */:
|
|
61
|
+
return "INFO";
|
|
62
|
+
case 3 /* WARN */:
|
|
63
|
+
return "WARN";
|
|
64
|
+
case 4 /* ERROR */:
|
|
65
|
+
return "ERROR";
|
|
66
|
+
case 5 /* FATAL */:
|
|
67
|
+
return "FATAL";
|
|
68
|
+
default:
|
|
69
|
+
return "INFO";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
LogLevel,
|
|
75
|
+
logLevelName,
|
|
76
|
+
parseLogLevel
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=log_level.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/log_level.ts"],"sourcesContent":["export enum LogLevel {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n FATAL = 5,\n}\n\nconst LEVEL_BY_NAME: Record<string, LogLevel> = {\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n fatal: LogLevel.FATAL,\n};\n\nexport function parseLogLevel(value: string | undefined | null): LogLevel {\n if (!value) return LogLevel.INFO;\n\n const normalized = value.trim().toLowerCase();\n const byName = LEVEL_BY_NAME[normalized];\n if (typeof byName === \"number\") return byName;\n\n const asNumber = Number(normalized);\n if (Number.isFinite(asNumber) && asNumber >= 0 && asNumber <= 5) {\n return asNumber as LogLevel;\n }\n\n return LogLevel.INFO;\n}\n\nexport function logLevelName(level: LogLevel): string {\n switch (level) {\n case LogLevel.TRACE:\n return \"TRACE\";\n case LogLevel.DEBUG:\n return \"DEBUG\";\n case LogLevel.INFO:\n return \"INFO\";\n case LogLevel.WARN:\n return \"WARN\";\n case LogLevel.ERROR:\n return \"ERROR\";\n case LogLevel.FATAL:\n return \"FATAL\";\n default:\n return \"INFO\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AANU,SAAAA;AAAA,GAAA;AASZ,MAAM,gBAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEO,SAAS,cAAc,OAA4C;AACxE,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAM,SAAS,cAAc,UAAU;AACvC,MAAI,OAAO,WAAW,SAAU,QAAO;AAEvC,QAAM,WAAW,OAAO,UAAU;AAClC,MAAI,OAAO,SAAS,QAAQ,KAAK,YAAY,KAAK,YAAY,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAAyB;AACpD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":["LogLevel"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare enum LogLevel {
|
|
2
|
+
TRACE = 0,
|
|
3
|
+
DEBUG = 1,
|
|
4
|
+
INFO = 2,
|
|
5
|
+
WARN = 3,
|
|
6
|
+
ERROR = 4,
|
|
7
|
+
FATAL = 5
|
|
8
|
+
}
|
|
9
|
+
declare function parseLogLevel(value: string | undefined | null): LogLevel;
|
|
10
|
+
declare function logLevelName(level: LogLevel): string;
|
|
11
|
+
|
|
12
|
+
export { LogLevel, logLevelName, parseLogLevel };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare enum LogLevel {
|
|
2
|
+
TRACE = 0,
|
|
3
|
+
DEBUG = 1,
|
|
4
|
+
INFO = 2,
|
|
5
|
+
WARN = 3,
|
|
6
|
+
ERROR = 4,
|
|
7
|
+
FATAL = 5
|
|
8
|
+
}
|
|
9
|
+
declare function parseLogLevel(value: string | undefined | null): LogLevel;
|
|
10
|
+
declare function logLevelName(level: LogLevel): string;
|
|
11
|
+
|
|
12
|
+
export { LogLevel, logLevelName, parseLogLevel };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
2
|
+
LogLevel2[LogLevel2["TRACE"] = 0] = "TRACE";
|
|
3
|
+
LogLevel2[LogLevel2["DEBUG"] = 1] = "DEBUG";
|
|
4
|
+
LogLevel2[LogLevel2["INFO"] = 2] = "INFO";
|
|
5
|
+
LogLevel2[LogLevel2["WARN"] = 3] = "WARN";
|
|
6
|
+
LogLevel2[LogLevel2["ERROR"] = 4] = "ERROR";
|
|
7
|
+
LogLevel2[LogLevel2["FATAL"] = 5] = "FATAL";
|
|
8
|
+
return LogLevel2;
|
|
9
|
+
})(LogLevel || {});
|
|
10
|
+
const LEVEL_BY_NAME = {
|
|
11
|
+
trace: 0 /* TRACE */,
|
|
12
|
+
debug: 1 /* DEBUG */,
|
|
13
|
+
info: 2 /* INFO */,
|
|
14
|
+
warn: 3 /* WARN */,
|
|
15
|
+
error: 4 /* ERROR */,
|
|
16
|
+
fatal: 5 /* FATAL */
|
|
17
|
+
};
|
|
18
|
+
function parseLogLevel(value) {
|
|
19
|
+
if (!value) return 2 /* INFO */;
|
|
20
|
+
const normalized = value.trim().toLowerCase();
|
|
21
|
+
const byName = LEVEL_BY_NAME[normalized];
|
|
22
|
+
if (typeof byName === "number") return byName;
|
|
23
|
+
const asNumber = Number(normalized);
|
|
24
|
+
if (Number.isFinite(asNumber) && asNumber >= 0 && asNumber <= 5) {
|
|
25
|
+
return asNumber;
|
|
26
|
+
}
|
|
27
|
+
return 2 /* INFO */;
|
|
28
|
+
}
|
|
29
|
+
function logLevelName(level) {
|
|
30
|
+
switch (level) {
|
|
31
|
+
case 0 /* TRACE */:
|
|
32
|
+
return "TRACE";
|
|
33
|
+
case 1 /* DEBUG */:
|
|
34
|
+
return "DEBUG";
|
|
35
|
+
case 2 /* INFO */:
|
|
36
|
+
return "INFO";
|
|
37
|
+
case 3 /* WARN */:
|
|
38
|
+
return "WARN";
|
|
39
|
+
case 4 /* ERROR */:
|
|
40
|
+
return "ERROR";
|
|
41
|
+
case 5 /* FATAL */:
|
|
42
|
+
return "FATAL";
|
|
43
|
+
default:
|
|
44
|
+
return "INFO";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
LogLevel,
|
|
49
|
+
logLevelName,
|
|
50
|
+
parseLogLevel
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=log_level.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/log_level.ts"],"sourcesContent":["export enum LogLevel {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n FATAL = 5,\n}\n\nconst LEVEL_BY_NAME: Record<string, LogLevel> = {\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n fatal: LogLevel.FATAL,\n};\n\nexport function parseLogLevel(value: string | undefined | null): LogLevel {\n if (!value) return LogLevel.INFO;\n\n const normalized = value.trim().toLowerCase();\n const byName = LEVEL_BY_NAME[normalized];\n if (typeof byName === \"number\") return byName;\n\n const asNumber = Number(normalized);\n if (Number.isFinite(asNumber) && asNumber >= 0 && asNumber <= 5) {\n return asNumber as LogLevel;\n }\n\n return LogLevel.INFO;\n}\n\nexport function logLevelName(level: LogLevel): string {\n switch (level) {\n case LogLevel.TRACE:\n return \"TRACE\";\n case LogLevel.DEBUG:\n return \"DEBUG\";\n case LogLevel.INFO:\n return \"INFO\";\n case LogLevel.WARN:\n return \"WARN\";\n case LogLevel.ERROR:\n return \"ERROR\";\n case LogLevel.FATAL:\n return \"FATAL\";\n default:\n return \"INFO\";\n }\n}\n"],"mappings":"AAAO,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AANU,SAAAA;AAAA,GAAA;AASZ,MAAM,gBAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEO,SAAS,cAAc,OAA4C;AACxE,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAM,SAAS,cAAc,UAAU;AACvC,MAAI,OAAO,WAAW,SAAU,QAAO;AAEvC,QAAM,WAAW,OAAO,UAAU;AAClC,MAAI,OAAO,SAAS,QAAQ,KAAK,YAAY,KAAK,YAAY,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAAyB;AACpD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":["LogLevel"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var log_transport_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(log_transport_exports);
|
|
17
|
+
//# sourceMappingURL=log_transport.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/log_transport.ts"],"sourcesContent":["export interface LogEntry {\n timestamp: string;\n level: string;\n logger: string;\n message: string;\n context?: unknown;\n environment: string;\n service: string;\n}\n\nexport interface LogTransport {\n log(entry: LogEntry): Promise<void> | void;\n close?(): Promise<void> | void;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|