@rawnodes/logger 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +386 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +103 -0
- package/dist/index.d.ts +103 -6
- package/dist/index.js +369 -6
- package/dist/index.js.map +1 -1
- package/package.json +8 -5
- package/dist/formatters.d.ts +0 -7
- package/dist/formatters.d.ts.map +0 -1
- package/dist/formatters.js +0 -37
- package/dist/formatters.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/logger.d.ts +0 -30
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -131
- package/dist/logger.js.map +0 -1
- package/dist/singleton.d.ts +0 -15
- package/dist/singleton.d.ts.map +0 -1
- package/dist/singleton.js +0 -40
- package/dist/singleton.js.map +0 -1
- package/dist/store.d.ts +0 -7
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -11
- package/dist/store.js.map +0 -1
- package/dist/transports.d.ts +0 -7
- package/dist/transports.d.ts.map +0 -1
- package/dist/transports.js +0 -22
- package/dist/transports.js.map +0 -1
- package/dist/types.d.ts +0 -23
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -4
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/mask-secrets.d.ts +0 -8
- package/dist/utils/mask-secrets.d.ts.map +0 -1
- package/dist/utils/mask-secrets.js +0 -69
- package/dist/utils/mask-secrets.js.map +0 -1
- package/dist/utils/request-id.d.ts +0 -8
- package/dist/utils/request-id.d.ts.map +0 -1
- package/dist/utils/request-id.js +0 -24
- package/dist/utils/request-id.js.map +0 -1
- package/dist/utils/timing.d.ts +0 -18
- package/dist/utils/timing.d.ts.map +0 -1
- package/dist/utils/timing.js +0 -37
- package/dist/utils/timing.js.map +0 -1
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var winston = require('winston');
|
|
4
|
+
var util = require('util');
|
|
5
|
+
var DailyRotateFile = require('winston-daily-rotate-file');
|
|
6
|
+
var async_hooks = require('async_hooks');
|
|
7
|
+
var crypto = require('crypto');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var DailyRotateFile__default = /*#__PURE__*/_interopDefault(DailyRotateFile);
|
|
12
|
+
|
|
13
|
+
// src/logger.ts
|
|
14
|
+
var DEFAULT_CONTEXT = "APP";
|
|
15
|
+
function formatMeta(meta, colors) {
|
|
16
|
+
return Object.entries(meta).filter(([, value]) => value !== void 0 && value !== null).map(([key, value]) => {
|
|
17
|
+
if (typeof value === "object") {
|
|
18
|
+
const inspected = util.inspect(value, { depth: 4, colors, compact: false });
|
|
19
|
+
return `
|
|
20
|
+
${key}: ${inspected.split("\n").join("\n ")}`;
|
|
21
|
+
}
|
|
22
|
+
return `
|
|
23
|
+
${key}: ${value}`;
|
|
24
|
+
}).join("");
|
|
25
|
+
}
|
|
26
|
+
function addStoreContext(store) {
|
|
27
|
+
return winston.format((info) => {
|
|
28
|
+
const storeContext = store.getStore();
|
|
29
|
+
if (storeContext) {
|
|
30
|
+
return { ...info, ...storeContext };
|
|
31
|
+
}
|
|
32
|
+
return info;
|
|
33
|
+
})();
|
|
34
|
+
}
|
|
35
|
+
function createLocalFormat(store) {
|
|
36
|
+
return winston.format.combine(
|
|
37
|
+
winston.format.errors({ stack: true }),
|
|
38
|
+
winston.format.timestamp(),
|
|
39
|
+
addStoreContext(store),
|
|
40
|
+
winston.format.colorize(),
|
|
41
|
+
winston.format.printf(({ timestamp, level, context, message, ...meta }) => {
|
|
42
|
+
const formattedMeta = formatMeta(meta, true);
|
|
43
|
+
return `[${timestamp}] ${level} [${context || DEFAULT_CONTEXT}] ${message}${formattedMeta}`;
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
function createProductionFormat(store) {
|
|
48
|
+
return winston.format.combine(
|
|
49
|
+
winston.format.errors({ stack: true }),
|
|
50
|
+
winston.format.timestamp(),
|
|
51
|
+
addStoreContext(store),
|
|
52
|
+
winston.format.json()
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function createFormat(isLocal, store) {
|
|
56
|
+
return isLocal ? createLocalFormat(store) : createProductionFormat(store);
|
|
57
|
+
}
|
|
58
|
+
function createTransports(config) {
|
|
59
|
+
const result = [
|
|
60
|
+
new winston.transports.Console({
|
|
61
|
+
level: config.console.level
|
|
62
|
+
})
|
|
63
|
+
];
|
|
64
|
+
if (config.file) {
|
|
65
|
+
result.push(
|
|
66
|
+
new DailyRotateFile__default.default({
|
|
67
|
+
dirname: config.file.dirname,
|
|
68
|
+
filename: config.file.filename,
|
|
69
|
+
level: config.file.level,
|
|
70
|
+
datePattern: config.file.datePattern,
|
|
71
|
+
zippedArchive: config.file.zippedArchive,
|
|
72
|
+
maxSize: config.file.maxSize,
|
|
73
|
+
maxFiles: config.file.maxFiles
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
var LoggerStore = class {
|
|
80
|
+
storage = new async_hooks.AsyncLocalStorage();
|
|
81
|
+
getStore() {
|
|
82
|
+
return this.storage.getStore();
|
|
83
|
+
}
|
|
84
|
+
run(context, fn) {
|
|
85
|
+
return this.storage.run(context, fn);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// src/utils/timing.ts
|
|
90
|
+
function formatDuration(ms) {
|
|
91
|
+
if (ms < 1e3) {
|
|
92
|
+
return `${ms.toFixed(2)}ms`;
|
|
93
|
+
}
|
|
94
|
+
if (ms < 6e4) {
|
|
95
|
+
return `${(ms / 1e3).toFixed(2)}s`;
|
|
96
|
+
}
|
|
97
|
+
const minutes = Math.floor(ms / 6e4);
|
|
98
|
+
const seconds = (ms % 6e4 / 1e3).toFixed(1);
|
|
99
|
+
return `${minutes}m ${seconds}s`;
|
|
100
|
+
}
|
|
101
|
+
function createTimer(label) {
|
|
102
|
+
const start = performance.now();
|
|
103
|
+
return {
|
|
104
|
+
end() {
|
|
105
|
+
const durationMs = performance.now() - start;
|
|
106
|
+
return {
|
|
107
|
+
label,
|
|
108
|
+
durationMs,
|
|
109
|
+
durationFormatted: formatDuration(durationMs)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async function measureAsync(label, fn) {
|
|
115
|
+
const timer = createTimer(label);
|
|
116
|
+
const result = await fn();
|
|
117
|
+
const timing = timer.end();
|
|
118
|
+
return { result, timing };
|
|
119
|
+
}
|
|
120
|
+
function measureSync(label, fn) {
|
|
121
|
+
const timer = createTimer(label);
|
|
122
|
+
const result = fn();
|
|
123
|
+
const timing = timer.end();
|
|
124
|
+
return { result, timing };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/logger.ts
|
|
128
|
+
var DEFAULT_CONTEXT2 = "APP";
|
|
129
|
+
var LOG_LEVELS = {
|
|
130
|
+
error: 0,
|
|
131
|
+
warn: 1,
|
|
132
|
+
info: 2,
|
|
133
|
+
http: 3,
|
|
134
|
+
verbose: 4,
|
|
135
|
+
debug: 5,
|
|
136
|
+
silly: 6
|
|
137
|
+
};
|
|
138
|
+
var BaseLogger = class {
|
|
139
|
+
winstonLogger;
|
|
140
|
+
defaultLevel;
|
|
141
|
+
store;
|
|
142
|
+
levelOverrides = /* @__PURE__ */ new Map();
|
|
143
|
+
constructor(config, store) {
|
|
144
|
+
const isLocal = process.env.NODE_ENV !== "production";
|
|
145
|
+
this.defaultLevel = config.level;
|
|
146
|
+
this.store = store ?? new LoggerStore();
|
|
147
|
+
this.winstonLogger = winston.createLogger({
|
|
148
|
+
level: "silly",
|
|
149
|
+
// Allow all, we filter manually
|
|
150
|
+
format: createFormat(isLocal, this.store),
|
|
151
|
+
transports: createTransports(config)
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
getStore() {
|
|
155
|
+
return this.store;
|
|
156
|
+
}
|
|
157
|
+
setLevelOverride(match, level) {
|
|
158
|
+
const key = JSON.stringify(match);
|
|
159
|
+
this.levelOverrides.set(key, { match, level });
|
|
160
|
+
}
|
|
161
|
+
removeLevelOverride(match) {
|
|
162
|
+
const key = JSON.stringify(match);
|
|
163
|
+
this.levelOverrides.delete(key);
|
|
164
|
+
}
|
|
165
|
+
clearLevelOverrides() {
|
|
166
|
+
this.levelOverrides.clear();
|
|
167
|
+
}
|
|
168
|
+
getLevelOverrides() {
|
|
169
|
+
return Array.from(this.levelOverrides.values());
|
|
170
|
+
}
|
|
171
|
+
getEffectiveLevel() {
|
|
172
|
+
const context = this.store.getStore();
|
|
173
|
+
if (!context) return this.defaultLevel;
|
|
174
|
+
for (const { match, level } of this.levelOverrides.values()) {
|
|
175
|
+
if (this.matchesContext(context, match)) {
|
|
176
|
+
return level;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return this.defaultLevel;
|
|
180
|
+
}
|
|
181
|
+
matchesContext(context, match) {
|
|
182
|
+
return Object.entries(match).every(([key, value]) => context[key] === value);
|
|
183
|
+
}
|
|
184
|
+
shouldLog(level) {
|
|
185
|
+
const effectiveLevel = this.getEffectiveLevel();
|
|
186
|
+
return LOG_LEVELS[level] <= LOG_LEVELS[effectiveLevel];
|
|
187
|
+
}
|
|
188
|
+
getChildLogger(context) {
|
|
189
|
+
return this.winstonLogger.child({ context });
|
|
190
|
+
}
|
|
191
|
+
time(label) {
|
|
192
|
+
return createTimer(label);
|
|
193
|
+
}
|
|
194
|
+
timeEnd(timer, context) {
|
|
195
|
+
const result = timer.end();
|
|
196
|
+
this.debug(`${result.label} completed in ${result.durationFormatted}`, context, {
|
|
197
|
+
timing: result
|
|
198
|
+
});
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
async timeAsync(label, fn, context) {
|
|
202
|
+
const timer = this.time(label);
|
|
203
|
+
try {
|
|
204
|
+
const result = await fn();
|
|
205
|
+
this.timeEnd(timer, context);
|
|
206
|
+
return result;
|
|
207
|
+
} catch (error) {
|
|
208
|
+
const timing = timer.end();
|
|
209
|
+
this.error(`${label} failed after ${timing.durationFormatted}`, error, context);
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
log(message, context, meta) {
|
|
214
|
+
if (!this.shouldLog("info")) return;
|
|
215
|
+
this.winstonLogger.info(message, { context: context || DEFAULT_CONTEXT2, ...meta });
|
|
216
|
+
}
|
|
217
|
+
error(message, error, context) {
|
|
218
|
+
if (!this.shouldLog("error")) return;
|
|
219
|
+
const meta = { context: context || DEFAULT_CONTEXT2 };
|
|
220
|
+
if (error instanceof Error) {
|
|
221
|
+
meta.errorMessage = error.message;
|
|
222
|
+
meta.errorStack = error.stack;
|
|
223
|
+
} else if (error) {
|
|
224
|
+
meta.error = error;
|
|
225
|
+
}
|
|
226
|
+
this.winstonLogger.error(message, meta);
|
|
227
|
+
}
|
|
228
|
+
warn(message, context, meta) {
|
|
229
|
+
if (!this.shouldLog("warn")) return;
|
|
230
|
+
this.winstonLogger.warn(message, { context: context || DEFAULT_CONTEXT2, ...meta });
|
|
231
|
+
}
|
|
232
|
+
debug(message, context, meta) {
|
|
233
|
+
if (!this.shouldLog("debug")) return;
|
|
234
|
+
this.winstonLogger.debug(message, { context: context || DEFAULT_CONTEXT2, ...meta });
|
|
235
|
+
}
|
|
236
|
+
info(message, context, meta) {
|
|
237
|
+
if (!this.shouldLog("info")) return;
|
|
238
|
+
this.winstonLogger.info(message, { context: context || DEFAULT_CONTEXT2, ...meta });
|
|
239
|
+
}
|
|
240
|
+
verbose(message, context, meta) {
|
|
241
|
+
if (!this.shouldLog("verbose")) return;
|
|
242
|
+
this.winstonLogger.verbose(message, { context: context || DEFAULT_CONTEXT2, ...meta });
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
// src/singleton.ts
|
|
247
|
+
function createSingletonLogger() {
|
|
248
|
+
let instance = null;
|
|
249
|
+
const ensureInstance = () => {
|
|
250
|
+
if (!instance) {
|
|
251
|
+
throw new Error("Logger not initialized. Call getInstance(config) first.");
|
|
252
|
+
}
|
|
253
|
+
return instance;
|
|
254
|
+
};
|
|
255
|
+
return {
|
|
256
|
+
getInstance(config) {
|
|
257
|
+
if (!instance) {
|
|
258
|
+
if (!config) {
|
|
259
|
+
throw new Error("Logger config is required for first initialization");
|
|
260
|
+
}
|
|
261
|
+
instance = new BaseLogger(config);
|
|
262
|
+
}
|
|
263
|
+
return instance;
|
|
264
|
+
},
|
|
265
|
+
getStore() {
|
|
266
|
+
return ensureInstance().getStore();
|
|
267
|
+
},
|
|
268
|
+
for(context) {
|
|
269
|
+
return ensureInstance().getChildLogger(context);
|
|
270
|
+
},
|
|
271
|
+
setLevelOverride(match, level) {
|
|
272
|
+
ensureInstance().setLevelOverride(match, level);
|
|
273
|
+
},
|
|
274
|
+
removeLevelOverride(match) {
|
|
275
|
+
ensureInstance().removeLevelOverride(match);
|
|
276
|
+
},
|
|
277
|
+
getLevelOverrides() {
|
|
278
|
+
return ensureInstance().getLevelOverrides();
|
|
279
|
+
},
|
|
280
|
+
clearLevelOverrides() {
|
|
281
|
+
ensureInstance().clearLevelOverrides();
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function generateRequestId(options = {}) {
|
|
286
|
+
const { prefix, short = false } = options;
|
|
287
|
+
const uuid = crypto.randomUUID();
|
|
288
|
+
const id = short ? uuid.split("-")[0] : uuid;
|
|
289
|
+
return prefix ? `${prefix}-${id}` : id;
|
|
290
|
+
}
|
|
291
|
+
function extractRequestId(headers) {
|
|
292
|
+
const headerNames = ["x-request-id", "x-correlation-id", "x-trace-id"];
|
|
293
|
+
for (const name of headerNames) {
|
|
294
|
+
const value = headers[name];
|
|
295
|
+
if (typeof value === "string" && value.length > 0) {
|
|
296
|
+
return value;
|
|
297
|
+
}
|
|
298
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
299
|
+
return value[0];
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return void 0;
|
|
303
|
+
}
|
|
304
|
+
function getOrGenerateRequestId(headers, options = {}) {
|
|
305
|
+
return extractRequestId(headers) ?? generateRequestId(options);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// src/utils/mask-secrets.ts
|
|
309
|
+
var DEFAULT_SECRET_PATTERNS = [
|
|
310
|
+
"password",
|
|
311
|
+
"secret",
|
|
312
|
+
"token",
|
|
313
|
+
"apikey",
|
|
314
|
+
"api_key",
|
|
315
|
+
"api-key",
|
|
316
|
+
"auth",
|
|
317
|
+
"credential",
|
|
318
|
+
"private"
|
|
319
|
+
];
|
|
320
|
+
var DEFAULT_MASK = "***";
|
|
321
|
+
function isSecretKey(key, patterns) {
|
|
322
|
+
const lowerKey = key.toLowerCase();
|
|
323
|
+
return patterns.some((pattern) => lowerKey.includes(pattern.toLowerCase()));
|
|
324
|
+
}
|
|
325
|
+
function maskUrlCredentials(url, mask) {
|
|
326
|
+
try {
|
|
327
|
+
const parsed = new URL(url);
|
|
328
|
+
if (parsed.password) {
|
|
329
|
+
parsed.password = mask;
|
|
330
|
+
}
|
|
331
|
+
if (parsed.username && parsed.password) {
|
|
332
|
+
parsed.username = mask;
|
|
333
|
+
}
|
|
334
|
+
return parsed.toString();
|
|
335
|
+
} catch {
|
|
336
|
+
return url;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function maskSecrets(obj, options = {}) {
|
|
340
|
+
const { patterns = DEFAULT_SECRET_PATTERNS, mask = DEFAULT_MASK, deep = true } = options;
|
|
341
|
+
if (obj === null || obj === void 0) {
|
|
342
|
+
return obj;
|
|
343
|
+
}
|
|
344
|
+
if (typeof obj === "string") {
|
|
345
|
+
if (obj.startsWith("http://") || obj.startsWith("https://")) {
|
|
346
|
+
return maskUrlCredentials(obj, mask);
|
|
347
|
+
}
|
|
348
|
+
return obj;
|
|
349
|
+
}
|
|
350
|
+
if (Array.isArray(obj)) {
|
|
351
|
+
return deep ? obj.map((item) => maskSecrets(item, options)) : obj;
|
|
352
|
+
}
|
|
353
|
+
if (typeof obj === "object") {
|
|
354
|
+
const result = {};
|
|
355
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
356
|
+
if (isSecretKey(key, patterns)) {
|
|
357
|
+
result[key] = mask;
|
|
358
|
+
} else if (deep && typeof value === "object" && value !== null) {
|
|
359
|
+
result[key] = maskSecrets(value, options);
|
|
360
|
+
} else if (typeof value === "string") {
|
|
361
|
+
result[key] = maskSecrets(value, options);
|
|
362
|
+
} else {
|
|
363
|
+
result[key] = value;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
return obj;
|
|
369
|
+
}
|
|
370
|
+
function createMasker(options = {}) {
|
|
371
|
+
return (obj) => maskSecrets(obj, options);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
exports.BaseLogger = BaseLogger;
|
|
375
|
+
exports.LoggerStore = LoggerStore;
|
|
376
|
+
exports.createMasker = createMasker;
|
|
377
|
+
exports.createSingletonLogger = createSingletonLogger;
|
|
378
|
+
exports.createTimer = createTimer;
|
|
379
|
+
exports.extractRequestId = extractRequestId;
|
|
380
|
+
exports.generateRequestId = generateRequestId;
|
|
381
|
+
exports.getOrGenerateRequestId = getOrGenerateRequestId;
|
|
382
|
+
exports.maskSecrets = maskSecrets;
|
|
383
|
+
exports.measureAsync = measureAsync;
|
|
384
|
+
exports.measureSync = measureSync;
|
|
385
|
+
//# sourceMappingURL=index.cjs.map
|
|
386
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/formatters.ts","../src/transports.ts","../src/store.ts","../src/utils/timing.ts","../src/logger.ts","../src/singleton.ts","../src/utils/request-id.ts","../src/utils/mask-secrets.ts"],"names":["inspect","format","transports","DailyRotateFile","AsyncLocalStorage","DEFAULT_CONTEXT","createLogger","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["import { inspect } from 'util';\nimport { format, Logform } from 'winston';\nimport { LoggerStore } from './store.js';\nimport type { LoggerContext } from './types.js';\n\nconst DEFAULT_CONTEXT = 'APP';\n\nfunction formatMeta(meta: Record<string, unknown>, colors: boolean): string {\n return Object.entries(meta)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n const inspected = inspect(value, { depth: 4, colors, compact: false });\n return `\\n ${key}: ${inspected.split('\\n').join('\\n ')}`;\n }\n return `\\n ${key}: ${value}`;\n })\n .join('');\n}\n\nfunction addStoreContext<TContext extends LoggerContext>(store: LoggerStore<TContext>): Logform.Format {\n return format((info) => {\n const storeContext = store.getStore();\n if (storeContext) {\n return { ...info, ...storeContext };\n }\n return info;\n })();\n}\n\nexport function createLocalFormat<TContext extends LoggerContext>(store: LoggerStore<TContext>): Logform.Format {\n return format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n addStoreContext(store),\n format.colorize(),\n format.printf(({ timestamp, level, context, message, ...meta }) => {\n const formattedMeta = formatMeta(meta, true);\n return `[${timestamp}] ${level} [${context || DEFAULT_CONTEXT}] ${message}${formattedMeta}`;\n }),\n );\n}\n\nexport function createProductionFormat<TContext extends LoggerContext>(store: LoggerStore<TContext>): Logform.Format {\n return format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n addStoreContext(store),\n format.json(),\n );\n}\n\nexport function createFormat<TContext extends LoggerContext>(isLocal: boolean, store: LoggerStore<TContext>): Logform.Format {\n return isLocal ? createLocalFormat(store) : createProductionFormat(store);\n}\n","import { transports } from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\nimport { LoggerConfig } from './types.js';\n\ntype Transport = transports.ConsoleTransportInstance | DailyRotateFile;\n\nexport function createTransports(config: LoggerConfig): Transport[] {\n const result: Transport[] = [\n new transports.Console({\n level: config.console.level,\n }),\n ];\n\n if (config.file) {\n result.push(\n new DailyRotateFile({\n dirname: config.file.dirname,\n filename: config.file.filename,\n level: config.file.level,\n datePattern: config.file.datePattern,\n zippedArchive: config.file.zippedArchive,\n maxSize: config.file.maxSize,\n maxFiles: config.file.maxFiles,\n }),\n );\n }\n\n return result;\n}\n","import { AsyncLocalStorage } from 'async_hooks';\nimport type { LoggerContext } from './types.js';\n\nexport class LoggerStore<TContext extends LoggerContext = LoggerContext> {\n private storage = new AsyncLocalStorage<TContext>();\n\n getStore(): TContext | undefined {\n return this.storage.getStore();\n }\n\n run<T>(context: TContext, fn: () => T): T {\n return this.storage.run(context, fn);\n }\n}\n","export interface TimingResult {\n label: string;\n durationMs: number;\n durationFormatted: string;\n}\n\nexport interface Timer {\n end: () => TimingResult;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms.toFixed(2)}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(1);\n return `${minutes}m ${seconds}s`;\n}\n\nexport function createTimer(label: string): Timer {\n const start = performance.now();\n\n return {\n end(): TimingResult {\n const durationMs = performance.now() - start;\n return {\n label,\n durationMs,\n durationFormatted: formatDuration(durationMs),\n };\n },\n };\n}\n\nexport async function measureAsync<T>(\n label: string,\n fn: () => Promise<T>,\n): Promise<{ result: T; timing: TimingResult }> {\n const timer = createTimer(label);\n const result = await fn();\n const timing = timer.end();\n return { result, timing };\n}\n\nexport function measureSync<T>(\n label: string,\n fn: () => T,\n): { result: T; timing: TimingResult } {\n const timer = createTimer(label);\n const result = fn();\n const timing = timer.end();\n return { result, timing };\n}\n","import { createLogger, Logger } from 'winston';\nimport type { LoggerConfig, LoggerContext, LevelOverride } from './types.js';\nimport { createFormat } from './formatters.js';\nimport { createTransports } from './transports.js';\nimport { LoggerStore } from './store.js';\nimport { createTimer, type Timer, type TimingResult } from './utils/timing.js';\n\nconst DEFAULT_CONTEXT = 'APP';\n\nconst LOG_LEVELS: Record<string, number> = {\n error: 0,\n warn: 1,\n info: 2,\n http: 3,\n verbose: 4,\n debug: 5,\n silly: 6,\n};\n\nexport class BaseLogger<TContext extends LoggerContext = LoggerContext> {\n private winstonLogger: Logger;\n private defaultLevel: string;\n private store: LoggerStore<TContext>;\n private levelOverrides: Map<string, LevelOverride<TContext>> = new Map();\n\n constructor(config: LoggerConfig, store?: LoggerStore<TContext>) {\n const isLocal = process.env.NODE_ENV !== 'production';\n\n this.defaultLevel = config.level;\n this.store = store ?? new LoggerStore<TContext>();\n\n this.winstonLogger = createLogger({\n level: 'silly', // Allow all, we filter manually\n format: createFormat(isLocal, this.store),\n transports: createTransports(config),\n });\n }\n\n getStore(): LoggerStore<TContext> {\n return this.store;\n }\n\n setLevelOverride(match: Partial<TContext>, level: string): void {\n const key = JSON.stringify(match);\n this.levelOverrides.set(key, { match, level });\n }\n\n removeLevelOverride(match: Partial<TContext>): void {\n const key = JSON.stringify(match);\n this.levelOverrides.delete(key);\n }\n\n clearLevelOverrides(): void {\n this.levelOverrides.clear();\n }\n\n getLevelOverrides(): LevelOverride<TContext>[] {\n return Array.from(this.levelOverrides.values());\n }\n\n private getEffectiveLevel(): string {\n const context = this.store.getStore();\n if (!context) return this.defaultLevel;\n\n for (const { match, level } of this.levelOverrides.values()) {\n if (this.matchesContext(context, match)) {\n return level;\n }\n }\n return this.defaultLevel;\n }\n\n private matchesContext(context: TContext, match: Partial<TContext>): boolean {\n return Object.entries(match).every(([key, value]) => context[key] === value);\n }\n\n private shouldLog(level: string): boolean {\n const effectiveLevel = this.getEffectiveLevel();\n return LOG_LEVELS[level] <= LOG_LEVELS[effectiveLevel];\n }\n\n getChildLogger(context: string): Logger {\n return this.winstonLogger.child({ context });\n }\n\n time(label: string): Timer {\n return createTimer(label);\n }\n\n timeEnd(timer: Timer, context?: string): TimingResult {\n const result = timer.end();\n this.debug(`${result.label} completed in ${result.durationFormatted}`, context, {\n timing: result,\n });\n return result;\n }\n\n async timeAsync<T>(label: string, fn: () => Promise<T>, context?: string): Promise<T> {\n const timer = this.time(label);\n try {\n const result = await fn();\n this.timeEnd(timer, context);\n return result;\n } catch (error) {\n const timing = timer.end();\n this.error(`${label} failed after ${timing.durationFormatted}`, error, context);\n throw error;\n }\n }\n\n log(message: string, context?: string, meta?: object): void {\n if (!this.shouldLog('info')) return;\n this.winstonLogger.info(message, { context: context || DEFAULT_CONTEXT, ...meta });\n }\n\n error(message: string, error?: Error | unknown, context?: string): void {\n if (!this.shouldLog('error')) return;\n const meta: Record<string, unknown> = { context: context || DEFAULT_CONTEXT };\n if (error instanceof Error) {\n meta.errorMessage = error.message;\n meta.errorStack = error.stack;\n } else if (error) {\n meta.error = error;\n }\n this.winstonLogger.error(message, meta);\n }\n\n warn(message: string, context?: string, meta?: object): void {\n if (!this.shouldLog('warn')) return;\n this.winstonLogger.warn(message, { context: context || DEFAULT_CONTEXT, ...meta });\n }\n\n debug(message: string, context?: string, meta?: object): void {\n if (!this.shouldLog('debug')) return;\n this.winstonLogger.debug(message, { context: context || DEFAULT_CONTEXT, ...meta });\n }\n\n info(message: string, context?: string, meta?: object): void {\n if (!this.shouldLog('info')) return;\n this.winstonLogger.info(message, { context: context || DEFAULT_CONTEXT, ...meta });\n }\n\n verbose(message: string, context?: string, meta?: object): void {\n if (!this.shouldLog('verbose')) return;\n this.winstonLogger.verbose(message, { context: context || DEFAULT_CONTEXT, ...meta });\n }\n}\n","import { Logger } from 'winston';\nimport { BaseLogger } from './logger.js';\nimport { LoggerStore } from './store.js';\nimport type { LoggerConfig, LoggerContext, LevelOverride } from './types.js';\n\nexport interface SingletonLogger<TContext extends LoggerContext> {\n getInstance(config?: LoggerConfig): BaseLogger<TContext>;\n getStore(): LoggerStore<TContext>;\n for(context: string): Logger;\n setLevelOverride(match: Partial<TContext>, level: string): void;\n removeLevelOverride(match: Partial<TContext>): void;\n getLevelOverrides(): LevelOverride<TContext>[];\n clearLevelOverrides(): void;\n}\n\nexport function createSingletonLogger<TContext extends LoggerContext>(): SingletonLogger<TContext> {\n let instance: BaseLogger<TContext> | null = null;\n\n const ensureInstance = (): BaseLogger<TContext> => {\n if (!instance) {\n throw new Error('Logger not initialized. Call getInstance(config) first.');\n }\n return instance;\n };\n\n return {\n getInstance(config?: LoggerConfig): BaseLogger<TContext> {\n if (!instance) {\n if (!config) {\n throw new Error('Logger config is required for first initialization');\n }\n instance = new BaseLogger<TContext>(config);\n }\n return instance;\n },\n\n getStore(): LoggerStore<TContext> {\n return ensureInstance().getStore();\n },\n\n for(context: string): Logger {\n return ensureInstance().getChildLogger(context);\n },\n\n setLevelOverride(match: Partial<TContext>, level: string): void {\n ensureInstance().setLevelOverride(match, level);\n },\n\n removeLevelOverride(match: Partial<TContext>): void {\n ensureInstance().removeLevelOverride(match);\n },\n\n getLevelOverrides(): LevelOverride<TContext>[] {\n return ensureInstance().getLevelOverrides();\n },\n\n clearLevelOverrides(): void {\n ensureInstance().clearLevelOverrides();\n },\n };\n}\n","import { randomUUID } from 'crypto';\n\nexport interface RequestIdOptions {\n prefix?: string;\n short?: boolean;\n}\n\nexport function generateRequestId(options: RequestIdOptions = {}): string {\n const { prefix, short = false } = options;\n const uuid = randomUUID();\n const id = short ? uuid.split('-')[0] : uuid;\n return prefix ? `${prefix}-${id}` : id;\n}\n\nexport function extractRequestId(headers: Record<string, string | string[] | undefined>): string | undefined {\n const headerNames = ['x-request-id', 'x-correlation-id', 'x-trace-id'];\n\n for (const name of headerNames) {\n const value = headers[name];\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && value.length > 0) {\n return value[0];\n }\n }\n\n return undefined;\n}\n\nexport function getOrGenerateRequestId(\n headers: Record<string, string | string[] | undefined>,\n options: RequestIdOptions = {},\n): string {\n return extractRequestId(headers) ?? generateRequestId(options);\n}\n","const DEFAULT_SECRET_PATTERNS = [\n 'password',\n 'secret',\n 'token',\n 'apikey',\n 'api_key',\n 'api-key',\n 'auth',\n 'credential',\n 'private',\n];\n\nconst DEFAULT_MASK = '***';\n\nexport interface MaskSecretsOptions {\n patterns?: string[];\n mask?: string;\n deep?: boolean;\n}\n\nfunction isSecretKey(key: string, patterns: string[]): boolean {\n const lowerKey = key.toLowerCase();\n return patterns.some((pattern) => lowerKey.includes(pattern.toLowerCase()));\n}\n\nfunction maskUrlCredentials(url: string, mask: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.password) {\n parsed.password = mask;\n }\n if (parsed.username && parsed.password) {\n parsed.username = mask;\n }\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nexport function maskSecrets(\n obj: unknown,\n options: MaskSecretsOptions = {},\n): unknown {\n const { patterns = DEFAULT_SECRET_PATTERNS, mask = DEFAULT_MASK, deep = true } = options;\n\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n if (obj.startsWith('http://') || obj.startsWith('https://')) {\n return maskUrlCredentials(obj, mask);\n }\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return deep ? obj.map((item) => maskSecrets(item, options)) : obj;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (isSecretKey(key, patterns)) {\n result[key] = mask;\n } else if (deep && typeof value === 'object' && value !== null) {\n result[key] = maskSecrets(value, options);\n } else if (typeof value === 'string') {\n result[key] = maskSecrets(value, options);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n return obj;\n}\n\nexport function createMasker(options: MaskSecretsOptions = {}) {\n return (obj: unknown): unknown => maskSecrets(obj, options);\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Logger } from 'winston';
|
|
2
|
+
|
|
3
|
+
interface ConsoleConfig {
|
|
4
|
+
level: string;
|
|
5
|
+
}
|
|
6
|
+
interface FileConfig {
|
|
7
|
+
dirname: string;
|
|
8
|
+
filename: string;
|
|
9
|
+
level: string;
|
|
10
|
+
datePattern: string;
|
|
11
|
+
zippedArchive?: boolean;
|
|
12
|
+
maxSize?: string;
|
|
13
|
+
maxFiles?: string;
|
|
14
|
+
}
|
|
15
|
+
interface LoggerConfig {
|
|
16
|
+
level: string;
|
|
17
|
+
console: ConsoleConfig;
|
|
18
|
+
file?: FileConfig;
|
|
19
|
+
}
|
|
20
|
+
type LoggerContext = Record<string, unknown>;
|
|
21
|
+
interface LevelOverride<TContext extends LoggerContext> {
|
|
22
|
+
match: Partial<TContext>;
|
|
23
|
+
level: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
declare class LoggerStore<TContext extends LoggerContext = LoggerContext> {
|
|
27
|
+
private storage;
|
|
28
|
+
getStore(): TContext | undefined;
|
|
29
|
+
run<T>(context: TContext, fn: () => T): T;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface TimingResult {
|
|
33
|
+
label: string;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
durationFormatted: string;
|
|
36
|
+
}
|
|
37
|
+
interface Timer {
|
|
38
|
+
end: () => TimingResult;
|
|
39
|
+
}
|
|
40
|
+
declare function createTimer(label: string): Timer;
|
|
41
|
+
declare function measureAsync<T>(label: string, fn: () => Promise<T>): Promise<{
|
|
42
|
+
result: T;
|
|
43
|
+
timing: TimingResult;
|
|
44
|
+
}>;
|
|
45
|
+
declare function measureSync<T>(label: string, fn: () => T): {
|
|
46
|
+
result: T;
|
|
47
|
+
timing: TimingResult;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare class BaseLogger<TContext extends LoggerContext = LoggerContext> {
|
|
51
|
+
private winstonLogger;
|
|
52
|
+
private defaultLevel;
|
|
53
|
+
private store;
|
|
54
|
+
private levelOverrides;
|
|
55
|
+
constructor(config: LoggerConfig, store?: LoggerStore<TContext>);
|
|
56
|
+
getStore(): LoggerStore<TContext>;
|
|
57
|
+
setLevelOverride(match: Partial<TContext>, level: string): void;
|
|
58
|
+
removeLevelOverride(match: Partial<TContext>): void;
|
|
59
|
+
clearLevelOverrides(): void;
|
|
60
|
+
getLevelOverrides(): LevelOverride<TContext>[];
|
|
61
|
+
private getEffectiveLevel;
|
|
62
|
+
private matchesContext;
|
|
63
|
+
private shouldLog;
|
|
64
|
+
getChildLogger(context: string): Logger;
|
|
65
|
+
time(label: string): Timer;
|
|
66
|
+
timeEnd(timer: Timer, context?: string): TimingResult;
|
|
67
|
+
timeAsync<T>(label: string, fn: () => Promise<T>, context?: string): Promise<T>;
|
|
68
|
+
log(message: string, context?: string, meta?: object): void;
|
|
69
|
+
error(message: string, error?: Error | unknown, context?: string): void;
|
|
70
|
+
warn(message: string, context?: string, meta?: object): void;
|
|
71
|
+
debug(message: string, context?: string, meta?: object): void;
|
|
72
|
+
info(message: string, context?: string, meta?: object): void;
|
|
73
|
+
verbose(message: string, context?: string, meta?: object): void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface SingletonLogger<TContext extends LoggerContext> {
|
|
77
|
+
getInstance(config?: LoggerConfig): BaseLogger<TContext>;
|
|
78
|
+
getStore(): LoggerStore<TContext>;
|
|
79
|
+
for(context: string): Logger;
|
|
80
|
+
setLevelOverride(match: Partial<TContext>, level: string): void;
|
|
81
|
+
removeLevelOverride(match: Partial<TContext>): void;
|
|
82
|
+
getLevelOverrides(): LevelOverride<TContext>[];
|
|
83
|
+
clearLevelOverrides(): void;
|
|
84
|
+
}
|
|
85
|
+
declare function createSingletonLogger<TContext extends LoggerContext>(): SingletonLogger<TContext>;
|
|
86
|
+
|
|
87
|
+
interface RequestIdOptions {
|
|
88
|
+
prefix?: string;
|
|
89
|
+
short?: boolean;
|
|
90
|
+
}
|
|
91
|
+
declare function generateRequestId(options?: RequestIdOptions): string;
|
|
92
|
+
declare function extractRequestId(headers: Record<string, string | string[] | undefined>): string | undefined;
|
|
93
|
+
declare function getOrGenerateRequestId(headers: Record<string, string | string[] | undefined>, options?: RequestIdOptions): string;
|
|
94
|
+
|
|
95
|
+
interface MaskSecretsOptions {
|
|
96
|
+
patterns?: string[];
|
|
97
|
+
mask?: string;
|
|
98
|
+
deep?: boolean;
|
|
99
|
+
}
|
|
100
|
+
declare function maskSecrets(obj: unknown, options?: MaskSecretsOptions): unknown;
|
|
101
|
+
declare function createMasker(options?: MaskSecretsOptions): (obj: unknown) => unknown;
|
|
102
|
+
|
|
103
|
+
export { BaseLogger, type ConsoleConfig, type FileConfig, type LevelOverride, type LoggerConfig, type LoggerContext, LoggerStore, type MaskSecretsOptions, type RequestIdOptions, type SingletonLogger, type Timer, type TimingResult, createMasker, createSingletonLogger, createTimer, extractRequestId, generateRequestId, getOrGenerateRequestId, maskSecrets, measureAsync, measureSync };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Logger } from 'winston';
|
|
2
|
+
|
|
3
|
+
interface ConsoleConfig {
|
|
4
|
+
level: string;
|
|
5
|
+
}
|
|
6
|
+
interface FileConfig {
|
|
7
|
+
dirname: string;
|
|
8
|
+
filename: string;
|
|
9
|
+
level: string;
|
|
10
|
+
datePattern: string;
|
|
11
|
+
zippedArchive?: boolean;
|
|
12
|
+
maxSize?: string;
|
|
13
|
+
maxFiles?: string;
|
|
14
|
+
}
|
|
15
|
+
interface LoggerConfig {
|
|
16
|
+
level: string;
|
|
17
|
+
console: ConsoleConfig;
|
|
18
|
+
file?: FileConfig;
|
|
19
|
+
}
|
|
20
|
+
type LoggerContext = Record<string, unknown>;
|
|
21
|
+
interface LevelOverride<TContext extends LoggerContext> {
|
|
22
|
+
match: Partial<TContext>;
|
|
23
|
+
level: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
declare class LoggerStore<TContext extends LoggerContext = LoggerContext> {
|
|
27
|
+
private storage;
|
|
28
|
+
getStore(): TContext | undefined;
|
|
29
|
+
run<T>(context: TContext, fn: () => T): T;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface TimingResult {
|
|
33
|
+
label: string;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
durationFormatted: string;
|
|
36
|
+
}
|
|
37
|
+
interface Timer {
|
|
38
|
+
end: () => TimingResult;
|
|
39
|
+
}
|
|
40
|
+
declare function createTimer(label: string): Timer;
|
|
41
|
+
declare function measureAsync<T>(label: string, fn: () => Promise<T>): Promise<{
|
|
42
|
+
result: T;
|
|
43
|
+
timing: TimingResult;
|
|
44
|
+
}>;
|
|
45
|
+
declare function measureSync<T>(label: string, fn: () => T): {
|
|
46
|
+
result: T;
|
|
47
|
+
timing: TimingResult;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare class BaseLogger<TContext extends LoggerContext = LoggerContext> {
|
|
51
|
+
private winstonLogger;
|
|
52
|
+
private defaultLevel;
|
|
53
|
+
private store;
|
|
54
|
+
private levelOverrides;
|
|
55
|
+
constructor(config: LoggerConfig, store?: LoggerStore<TContext>);
|
|
56
|
+
getStore(): LoggerStore<TContext>;
|
|
57
|
+
setLevelOverride(match: Partial<TContext>, level: string): void;
|
|
58
|
+
removeLevelOverride(match: Partial<TContext>): void;
|
|
59
|
+
clearLevelOverrides(): void;
|
|
60
|
+
getLevelOverrides(): LevelOverride<TContext>[];
|
|
61
|
+
private getEffectiveLevel;
|
|
62
|
+
private matchesContext;
|
|
63
|
+
private shouldLog;
|
|
64
|
+
getChildLogger(context: string): Logger;
|
|
65
|
+
time(label: string): Timer;
|
|
66
|
+
timeEnd(timer: Timer, context?: string): TimingResult;
|
|
67
|
+
timeAsync<T>(label: string, fn: () => Promise<T>, context?: string): Promise<T>;
|
|
68
|
+
log(message: string, context?: string, meta?: object): void;
|
|
69
|
+
error(message: string, error?: Error | unknown, context?: string): void;
|
|
70
|
+
warn(message: string, context?: string, meta?: object): void;
|
|
71
|
+
debug(message: string, context?: string, meta?: object): void;
|
|
72
|
+
info(message: string, context?: string, meta?: object): void;
|
|
73
|
+
verbose(message: string, context?: string, meta?: object): void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface SingletonLogger<TContext extends LoggerContext> {
|
|
77
|
+
getInstance(config?: LoggerConfig): BaseLogger<TContext>;
|
|
78
|
+
getStore(): LoggerStore<TContext>;
|
|
79
|
+
for(context: string): Logger;
|
|
80
|
+
setLevelOverride(match: Partial<TContext>, level: string): void;
|
|
81
|
+
removeLevelOverride(match: Partial<TContext>): void;
|
|
82
|
+
getLevelOverrides(): LevelOverride<TContext>[];
|
|
83
|
+
clearLevelOverrides(): void;
|
|
84
|
+
}
|
|
85
|
+
declare function createSingletonLogger<TContext extends LoggerContext>(): SingletonLogger<TContext>;
|
|
86
|
+
|
|
87
|
+
interface RequestIdOptions {
|
|
88
|
+
prefix?: string;
|
|
89
|
+
short?: boolean;
|
|
90
|
+
}
|
|
91
|
+
declare function generateRequestId(options?: RequestIdOptions): string;
|
|
92
|
+
declare function extractRequestId(headers: Record<string, string | string[] | undefined>): string | undefined;
|
|
93
|
+
declare function getOrGenerateRequestId(headers: Record<string, string | string[] | undefined>, options?: RequestIdOptions): string;
|
|
94
|
+
|
|
95
|
+
interface MaskSecretsOptions {
|
|
96
|
+
patterns?: string[];
|
|
97
|
+
mask?: string;
|
|
98
|
+
deep?: boolean;
|
|
99
|
+
}
|
|
100
|
+
declare function maskSecrets(obj: unknown, options?: MaskSecretsOptions): unknown;
|
|
101
|
+
declare function createMasker(options?: MaskSecretsOptions): (obj: unknown) => unknown;
|
|
102
|
+
|
|
103
|
+
export { BaseLogger, type ConsoleConfig, type FileConfig, type LevelOverride, type LoggerConfig, type LoggerContext, LoggerStore, type MaskSecretsOptions, type RequestIdOptions, type SingletonLogger, type Timer, type TimingResult, createMasker, createSingletonLogger, createTimer, extractRequestId, generateRequestId, getOrGenerateRequestId, maskSecrets, measureAsync, measureSync };
|