@lilaquadrat/studio 10.0.0-beta.7 → 10.0.0-beta.9
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/lib/src/logger.js +114 -30
- package/lib/src/logger.js.map +1 -1
- package/package.json +1 -1
package/lib/src/logger.js
CHANGED
|
@@ -1,40 +1,124 @@
|
|
|
1
1
|
import { createLogger, format, transports } from 'winston';
|
|
2
2
|
import prettyjson from 'prettyjson';
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
const LOG_FORMAT = process.env.LOG_FORMAT ?? 'json';
|
|
4
|
+
const LOG_LEVEL = process.env.LOG_LEVEL ??
|
|
5
|
+
(process.env.NODE_ENV === 'production' ? 'info' : 'debug');
|
|
6
|
+
const REDACT_KEYS = new Set([
|
|
7
|
+
'password',
|
|
8
|
+
'passwd',
|
|
9
|
+
'secret',
|
|
10
|
+
'token',
|
|
11
|
+
'access_token',
|
|
12
|
+
'refresh_token',
|
|
13
|
+
'api_key',
|
|
14
|
+
'apikey',
|
|
15
|
+
'authorization',
|
|
16
|
+
'cookie',
|
|
17
|
+
'set-cookie',
|
|
18
|
+
]);
|
|
19
|
+
function redactDeep(value) {
|
|
20
|
+
if (!value || typeof value !== 'object')
|
|
21
|
+
return value;
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return value.map(redactDeep);
|
|
24
|
+
const obj = value;
|
|
25
|
+
const out = {};
|
|
26
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
27
|
+
if (REDACT_KEYS.has(k.toLowerCase()))
|
|
28
|
+
out[k] = '[REDACTED]';
|
|
29
|
+
else
|
|
30
|
+
out[k] = redactDeep(v);
|
|
11
31
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function toPlainObject(value) {
|
|
35
|
+
if (!value || typeof value !== 'object')
|
|
36
|
+
return undefined;
|
|
37
|
+
if (Array.isArray(value))
|
|
38
|
+
return { items: value };
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function safePretty(value) {
|
|
42
|
+
try {
|
|
43
|
+
return prettyjson.render(value);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// fallback for circular/unsupported structures
|
|
47
|
+
try {
|
|
48
|
+
return JSON.stringify(value);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return String(value);
|
|
52
|
+
}
|
|
15
53
|
}
|
|
16
|
-
return base;
|
|
17
|
-
});
|
|
18
|
-
if (process.env.LOG_FORMAT === 'console') {
|
|
19
|
-
useFormat = format.combine(format((info) => {
|
|
20
|
-
info.level = info.level.toUpperCase();
|
|
21
|
-
return info;
|
|
22
|
-
})(), format.timestamp({
|
|
23
|
-
format: 'HH:mm:ss',
|
|
24
|
-
}),
|
|
25
|
-
// format.colorize({ all: true, colors: { info: 'white', debug: 'magenta' } }),
|
|
26
|
-
format.simple(), format.splat(), format.errors({ stack: true }), mainFormat);
|
|
27
54
|
}
|
|
28
|
-
|
|
29
|
-
|
|
55
|
+
const COLORIZE = process.env.LOG_COLORIZE
|
|
56
|
+
? !['0', 'false', 'no', 'off'].includes(process.env.LOG_COLORIZE.toLowerCase())
|
|
57
|
+
: process.env.NODE_ENV !== 'production' && Boolean(process.stdout.isTTY);
|
|
58
|
+
const uppercaseLevel = format((info) => {
|
|
59
|
+
if (typeof info.level === 'string')
|
|
60
|
+
info.level = info.level.toUpperCase();
|
|
61
|
+
return info;
|
|
62
|
+
});
|
|
63
|
+
const maybeColorize = COLORIZE
|
|
64
|
+
? format.colorize({ level: true, message: false })
|
|
65
|
+
: format((info) => info)();
|
|
66
|
+
const normalize = format((info) => {
|
|
67
|
+
// Keep winston core fields, move everything else into `meta`
|
|
68
|
+
// NOTE: exclude `service` so defaultMeta doesn't end up printed as meta every time
|
|
69
|
+
const { level, message, timestamp, stack, service, ...rest } = info;
|
|
70
|
+
// If message itself is an Error, normalize it
|
|
71
|
+
if (message instanceof Error) {
|
|
72
|
+
info.message = message.message;
|
|
73
|
+
info.stack = info.stack ?? message.stack;
|
|
74
|
+
}
|
|
75
|
+
const meta = toPlainObject(rest);
|
|
76
|
+
if (meta && Object.keys(meta).length > 0) {
|
|
77
|
+
info.meta = redactDeep(meta);
|
|
78
|
+
}
|
|
79
|
+
if (info.data) {
|
|
80
|
+
info.data = redactDeep(info.data);
|
|
81
|
+
}
|
|
82
|
+
// Ensure message is a string for printf/json loggers
|
|
83
|
+
if (typeof info.message !== 'string') {
|
|
84
|
+
try {
|
|
85
|
+
info.message = JSON.stringify(info.message);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
info.message = String(info.message);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return info;
|
|
92
|
+
});
|
|
93
|
+
const consoleFormat = format.combine(format.timestamp({ format: 'HH:mm:ss' }), format.errors({ stack: true }), format.splat(), normalize(), uppercaseLevel(), maybeColorize, format.printf((info) => {
|
|
94
|
+
const lvl = String(info.level); // already uppercased above (and maybe colorized)
|
|
95
|
+
const header = `[${info.timestamp}][${lvl}] ${info.message}`;
|
|
96
|
+
const blocks = [];
|
|
97
|
+
if (info.data)
|
|
98
|
+
blocks.push(safePretty(info.data));
|
|
99
|
+
if (info.meta)
|
|
100
|
+
blocks.push(safePretty(info.meta));
|
|
101
|
+
if (info.stack)
|
|
102
|
+
blocks.push(String(info.stack));
|
|
103
|
+
return blocks.length ? `${header}\n\n${blocks.join('\n\n')}\n` : header;
|
|
104
|
+
}));
|
|
105
|
+
const jsonFormat = format.combine(format.timestamp(), format.errors({ stack: true }), format.splat(), normalize(), format.json());
|
|
106
|
+
function createConsoleTransport() {
|
|
107
|
+
return new transports.Console({
|
|
108
|
+
stderrLevels: ['error'],
|
|
109
|
+
handleExceptions: true,
|
|
110
|
+
});
|
|
30
111
|
}
|
|
112
|
+
const consoleTransport = createConsoleTransport();
|
|
31
113
|
const logger = createLogger({
|
|
32
|
-
level:
|
|
33
|
-
format:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
],
|
|
37
|
-
|
|
114
|
+
level: LOG_LEVEL,
|
|
115
|
+
format: LOG_FORMAT === 'console' ? consoleFormat : jsonFormat,
|
|
116
|
+
defaultMeta: { service: process.env.SERVICE_NAME ?? 'studio' },
|
|
117
|
+
transports: [consoleTransport],
|
|
118
|
+
exceptionHandlers: [createConsoleTransport()],
|
|
119
|
+
rejectionHandlers: [createConsoleTransport()],
|
|
120
|
+
exitOnError: false,
|
|
121
|
+
silent: process.env.NODE_ENV === 'test',
|
|
38
122
|
});
|
|
39
123
|
export default logger;
|
|
40
124
|
//# sourceMappingURL=logger.js.map
|
package/lib/src/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,UAAU,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
|