@kindgi/log 0.1.4 → 0.1.5-rc.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/format.d.ts +3 -2
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +5 -3
- package/dist/format.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +13 -9
- package/dist/logger.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/format.ts +5 -3
- package/src/logger.ts +19 -9
- package/src/types.ts +9 -1
package/dist/format.d.ts
CHANGED
|
@@ -5,8 +5,9 @@ export declare function formatJson(record: LogRecord): string;
|
|
|
5
5
|
* The pretty format, for a person at a terminal:
|
|
6
6
|
* `HH:MM:SS.mmm LEVEL [subsystem] message key=value …`, an error's
|
|
7
7
|
* frames on the lines after. Colours only when `color` is set (a
|
|
8
|
-
* terminal, and `NO_COLOR` unset).
|
|
9
|
-
*
|
|
8
|
+
* terminal, and `NO_COLOR` unset). The fields the message already states
|
|
9
|
+
* (the record's `inMessage`, and any in `omit`) are left out of the line,
|
|
10
|
+
* so a record read back from JSON renders as it would have at the source.
|
|
10
11
|
*/
|
|
11
12
|
export declare function formatPretty(record: LogRecord, options?: {
|
|
12
13
|
readonly color?: boolean;
|
package/dist/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAE7D,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAIpD;
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAE7D,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAIpD;AAuDD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAC5E,MAAM,CAkBR"}
|
package/dist/format.js
CHANGED
|
@@ -27,6 +27,7 @@ const FIXED = new Set([
|
|
|
27
27
|
'subsystem',
|
|
28
28
|
'message',
|
|
29
29
|
'err',
|
|
30
|
+
'inMessage',
|
|
30
31
|
]);
|
|
31
32
|
function pretty(value) {
|
|
32
33
|
if (typeof value === 'string')
|
|
@@ -55,14 +56,15 @@ function errorLines(err) {
|
|
|
55
56
|
* The pretty format, for a person at a terminal:
|
|
56
57
|
* `HH:MM:SS.mmm LEVEL [subsystem] message key=value …`, an error's
|
|
57
58
|
* frames on the lines after. Colours only when `color` is set (a
|
|
58
|
-
* terminal, and `NO_COLOR` unset).
|
|
59
|
-
*
|
|
59
|
+
* terminal, and `NO_COLOR` unset). The fields the message already states
|
|
60
|
+
* (the record's `inMessage`, and any in `omit`) are left out of the line,
|
|
61
|
+
* so a record read back from JSON renders as it would have at the source.
|
|
60
62
|
*/
|
|
61
63
|
export function formatPretty(record, options = {}) {
|
|
62
64
|
const color = options.color === true;
|
|
63
65
|
const time = record.time.slice(11, 23);
|
|
64
66
|
const label = LEVEL_LABEL[record.level];
|
|
65
|
-
const omit = options.omit ?? [];
|
|
67
|
+
const omit = [...(options.omit ?? []), ...(record.inMessage ?? [])];
|
|
66
68
|
const fields = Object.entries(record)
|
|
67
69
|
.filter(([key, value]) => !FIXED.has(key) && value !== undefined && !omit.includes(key))
|
|
68
70
|
.map(([key, value]) => `${key}=${pretty(value)}`);
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAKjC,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAc,EAAE,EAAE,CACrD,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAuC;IACtD,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,KAAK,GAAuC;IAChD,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;CACpB,CAAC;AACF,MAAM,KAAK,GAAG,WAAW,CAAC;AAC1B,MAAM,GAAG,GAAG,WAAW,CAAC;AAExB,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC;IACzC,MAAM;IACN,OAAO;IACP,UAAU;IACV,WAAW;IACX,SAAS;IACT,KAAK;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAoC,MAAM,aAAa,CAAC;AAE9E,OAAO,KAAK,EAEV,SAAS,EAGT,MAAM,EAEP,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAoC,MAAM,aAAa,CAAC;AAE9E,OAAO,KAAK,EAEV,SAAS,EAGT,MAAM,EAEP,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAwID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAWjE;AAKD,eAAO,MAAM,UAAU,EAAE,MAQxB,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -23,6 +23,8 @@ const CORRELATION = [
|
|
|
23
23
|
'approvalId',
|
|
24
24
|
];
|
|
25
25
|
const FIXED = new Set(['time', 'level', 'severity', 'subsystem', 'message']);
|
|
26
|
+
/** Names a field can't take: the fixed five and `inMessage`, the record's own. */
|
|
27
|
+
const RESERVED = new Set([...FIXED, 'inMessage']);
|
|
26
28
|
function serializeError(err, withStack, depth = 0) {
|
|
27
29
|
if (!(err instanceof Error))
|
|
28
30
|
return scrubText(String(err));
|
|
@@ -39,8 +41,8 @@ function serializeError(err, withStack, depth = 0) {
|
|
|
39
41
|
/**
|
|
40
42
|
* Copy a record's own fields into `out`, after the fixed five and the
|
|
41
43
|
* correlation ones; an `Error` among them is serialized. A field named
|
|
42
|
-
* like one of the fixed five can't replace it: it comes
|
|
43
|
-
* under `fields`.
|
|
44
|
+
* like one of the fixed five (or `inMessage`) can't replace it: it comes
|
|
45
|
+
* back to be kept under `fields`.
|
|
44
46
|
*/
|
|
45
47
|
function copyFields(out, merged, level) {
|
|
46
48
|
const reserved = {};
|
|
@@ -49,7 +51,7 @@ function copyFields(out, merged, level) {
|
|
|
49
51
|
continue;
|
|
50
52
|
if (CORRELATION.includes(key))
|
|
51
53
|
continue;
|
|
52
|
-
if (
|
|
54
|
+
if (RESERVED.has(key))
|
|
53
55
|
reserved[key] = value;
|
|
54
56
|
else
|
|
55
57
|
out[key] = value instanceof Error ? serializeError(value, level === 'error') : value;
|
|
@@ -62,7 +64,7 @@ function build(shared, bindings) {
|
|
|
62
64
|
: (shared.options.subsystem ?? 'root');
|
|
63
65
|
const threshold = levelFor(subsystem, shared.levels, shared.threshold);
|
|
64
66
|
const extra = shared.options.redact ?? [];
|
|
65
|
-
function record(level, message, fields) {
|
|
67
|
+
function record(level, message, fields, how) {
|
|
66
68
|
const merged = { ...bindings, ...fields };
|
|
67
69
|
const out = {
|
|
68
70
|
time: shared.now().toISOString(),
|
|
@@ -86,17 +88,19 @@ function build(shared, bindings) {
|
|
|
86
88
|
const withStack = level === 'error' || levelEnabled('debug', threshold);
|
|
87
89
|
redacted.err = serializeError(merged.err, withStack);
|
|
88
90
|
}
|
|
91
|
+
// The fields the message states, of those the record has: a renderer
|
|
92
|
+
// (the pretty format, `kindgi dev`) leaves them out of the line.
|
|
93
|
+
const stated = (how?.inMessage ?? []).filter((key) => !RESERVED.has(key) && key !== 'err' && key in redacted);
|
|
94
|
+
if (stated.length > 0)
|
|
95
|
+
redacted.inMessage = stated;
|
|
89
96
|
return redacted;
|
|
90
97
|
}
|
|
91
98
|
function write(level, message, fields, how) {
|
|
92
99
|
if (!levelEnabled(level, threshold))
|
|
93
100
|
return;
|
|
94
|
-
const rec = record(level, message, fields);
|
|
101
|
+
const rec = record(level, message, fields, how);
|
|
95
102
|
const line = shared.format === 'pretty'
|
|
96
|
-
? formatPretty(rec, {
|
|
97
|
-
color: shared.options.color === true,
|
|
98
|
-
...(how?.inMessage !== undefined && { omit: how.inMessage }),
|
|
99
|
-
})
|
|
103
|
+
? formatPretty(rec, { color: shared.options.color === true })
|
|
100
104
|
: formatJson(rec);
|
|
101
105
|
try {
|
|
102
106
|
shared.options.write(line);
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAiB,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA6BrD,oFAAoF;AACpF,MAAM,WAAW,GAAG;IAClB,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,OAAO;IACP,aAAa;IACb,SAAS;IACT,cAAc;IACd,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,gBAAgB;IAChB,YAAY;CACJ,CAAC;AAEX,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAiB,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA6BrD,oFAAoF;AACpF,MAAM,WAAW,GAAG;IAClB,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,OAAO;IACP,aAAa;IACb,SAAS;IACT,cAAc;IACd,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,gBAAgB;IAChB,YAAY;CACJ,CAAC;AAEX,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAClG,kFAAkF;AAClF,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAEvE,SAAS,cAAc,CAAC,GAAY,EAAE,SAAkB,EAAE,KAAK,GAAG,CAAC;IACjE,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAI,GAAmC,CAAC,IAAI,CAAC;IACvD,MAAM,KAAK,GAAI,GAAoC,CAAC,KAAK,CAAC;IAC1D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;KAChG,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CACjB,GAA4B,EAC5B,MAAyC,EACzC,KAAe;IAEf,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,KAAK;YAAE,SAAS;QAC1E,IAAK,WAAiC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/D,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;;YACxC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5F,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAUD,SAAS,KAAK,CAAC,MAAc,EAAE,QAAmB;IAChD,MAAM,SAAS,GACb,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,EAAE;QACjE,CAAC,CAAC,QAAQ,CAAC,SAAS;QACpB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IAE1C,SAAS,MAAM,CACb,KAAe,EACf,OAAe,EACf,MAA6B,EAC7B,GAA2B;QAE3B,MAAM,MAAM,GAA4B,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;QACnE,MAAM,GAAG,GAA4B;YACnC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YAChC,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;YACzB,SAAS;YACT,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC;SAC5B,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAA4B,CAAC;QACpE,iEAAiE;QACjE,KAAK,MAAM,GAAG,IAAI,KAAK;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,KAAK,KAAK,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACxE,QAAQ,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1C,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,IAAI,QAAQ,CAChE,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC;QACnD,OAAO,QAAqB,CAAC;IAC/B,CAAC;IAED,SAAS,KAAK,CAAC,KAAe,EAAE,OAAe,EAAE,MAAkB,EAAE,GAAgB;QACnF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;YAAE,OAAO;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,IAAI,GACR,MAAM,CAAC,MAAM,KAAK,QAAQ;YACxB,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC7D,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACrE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACnE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACnE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACrE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACrE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QACxD,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,KAAK,CACV;QACE,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM;QAClC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;QAChC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;KACvC,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,IAAI,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU;IACvB,cAAc,EAAE,GAAG,EAAE,CAAC,KAAK;CAC5B,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -20,6 +20,12 @@ export interface LogRecord {
|
|
|
20
20
|
readonly projectId?: string;
|
|
21
21
|
readonly runId?: string;
|
|
22
22
|
readonly err?: SerializedError;
|
|
23
|
+
/**
|
|
24
|
+
* The fields the message already states (`LogOptions.inMessage`), when
|
|
25
|
+
* it states any: `GET /v1/runs 200 12ms` names `method`, `route`,
|
|
26
|
+
* `status` and `durationMs`. Renderers may leave them out of a line.
|
|
27
|
+
*/
|
|
28
|
+
readonly inMessage?: readonly string[];
|
|
23
29
|
readonly [field: string]: unknown;
|
|
24
30
|
}
|
|
25
31
|
/** An error, as a record carries it. `stack` at `error`, or when the logger is at `debug` or below. */
|
|
@@ -37,7 +43,9 @@ export interface SerializedError {
|
|
|
37
43
|
* line `GET /v1/runs/:runId 200 12ms` states `method`, `route`,
|
|
38
44
|
* `status` and `durationMs`. The pretty format leaves them out, so
|
|
39
45
|
* a terminal line doesn't say everything twice; JSON keeps every
|
|
40
|
-
* field, for queries
|
|
46
|
+
* field, for queries, and lists the ones named here (those the
|
|
47
|
+
* record has) as the record's `inMessage`, so a renderer reading
|
|
48
|
+
* JSON leaves them out too.
|
|
41
49
|
*/
|
|
42
50
|
export interface LogOptions {
|
|
43
51
|
readonly inMessage?: readonly string[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,qEAAqE;AACrE,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC;IAC/B,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,uGAAuG;AACvG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC;CAC3C;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,qEAAqE;AACrE,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,uGAAuG;AACvG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC;CAC3C;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACvE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACtE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACtE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACvE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACvE,KAAK,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;IACnC,kGAAkG;IAClG,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1C;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kindgi/log",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5-rc.0",
|
|
4
4
|
"description": "Kindgi™ structured logging: levels per subsystem (with dotted inheritance), JSON and pretty formats, redaction of secret keys and token shapes, and W3C trace-context helpers. The runtime and @kindgi/api write the same records. Zero runtime dependencies.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
package/src/format.ts
CHANGED
|
@@ -36,6 +36,7 @@ const FIXED: ReadonlySet<string> = new Set([
|
|
|
36
36
|
'subsystem',
|
|
37
37
|
'message',
|
|
38
38
|
'err',
|
|
39
|
+
'inMessage',
|
|
39
40
|
]);
|
|
40
41
|
|
|
41
42
|
function pretty(value: unknown): string {
|
|
@@ -67,8 +68,9 @@ function errorLines(err: SerializedError): string[] {
|
|
|
67
68
|
* The pretty format, for a person at a terminal:
|
|
68
69
|
* `HH:MM:SS.mmm LEVEL [subsystem] message key=value …`, an error's
|
|
69
70
|
* frames on the lines after. Colours only when `color` is set (a
|
|
70
|
-
* terminal, and `NO_COLOR` unset).
|
|
71
|
-
*
|
|
71
|
+
* terminal, and `NO_COLOR` unset). The fields the message already states
|
|
72
|
+
* (the record's `inMessage`, and any in `omit`) are left out of the line,
|
|
73
|
+
* so a record read back from JSON renders as it would have at the source.
|
|
72
74
|
*/
|
|
73
75
|
export function formatPretty(
|
|
74
76
|
record: LogRecord,
|
|
@@ -77,7 +79,7 @@ export function formatPretty(
|
|
|
77
79
|
const color = options.color === true;
|
|
78
80
|
const time = record.time.slice(11, 23);
|
|
79
81
|
const label = LEVEL_LABEL[record.level];
|
|
80
|
-
const omit = options.omit ?? [];
|
|
82
|
+
const omit = [...(options.omit ?? []), ...(record.inMessage ?? [])];
|
|
81
83
|
const fields = Object.entries(record)
|
|
82
84
|
.filter(([key, value]) => !FIXED.has(key) && value !== undefined && !omit.includes(key))
|
|
83
85
|
.map(([key, value]) => `${key}=${pretty(value)}`);
|
package/src/logger.ts
CHANGED
|
@@ -53,6 +53,8 @@ const CORRELATION = [
|
|
|
53
53
|
] as const;
|
|
54
54
|
|
|
55
55
|
const FIXED: ReadonlySet<string> = new Set(['time', 'level', 'severity', 'subsystem', 'message']);
|
|
56
|
+
/** Names a field can't take: the fixed five and `inMessage`, the record's own. */
|
|
57
|
+
const RESERVED: ReadonlySet<string> = new Set([...FIXED, 'inMessage']);
|
|
56
58
|
|
|
57
59
|
function serializeError(err: unknown, withStack: boolean, depth = 0): SerializedError | string {
|
|
58
60
|
if (!(err instanceof Error)) return scrubText(String(err));
|
|
@@ -70,8 +72,8 @@ function serializeError(err: unknown, withStack: boolean, depth = 0): Serialized
|
|
|
70
72
|
/**
|
|
71
73
|
* Copy a record's own fields into `out`, after the fixed five and the
|
|
72
74
|
* correlation ones; an `Error` among them is serialized. A field named
|
|
73
|
-
* like one of the fixed five can't replace it: it comes
|
|
74
|
-
* under `fields`.
|
|
75
|
+
* like one of the fixed five (or `inMessage`) can't replace it: it comes
|
|
76
|
+
* back to be kept under `fields`.
|
|
75
77
|
*/
|
|
76
78
|
function copyFields(
|
|
77
79
|
out: Record<string, unknown>,
|
|
@@ -82,7 +84,7 @@ function copyFields(
|
|
|
82
84
|
for (const [key, value] of Object.entries(merged)) {
|
|
83
85
|
if (value === undefined || key === 'subsystem' || key === 'err') continue;
|
|
84
86
|
if ((CORRELATION as readonly string[]).includes(key)) continue;
|
|
85
|
-
if (
|
|
87
|
+
if (RESERVED.has(key)) reserved[key] = value;
|
|
86
88
|
else out[key] = value instanceof Error ? serializeError(value, level === 'error') : value;
|
|
87
89
|
}
|
|
88
90
|
return reserved;
|
|
@@ -104,7 +106,12 @@ function build(shared: Shared, bindings: LogFields): Logger {
|
|
|
104
106
|
const threshold = levelFor(subsystem, shared.levels, shared.threshold);
|
|
105
107
|
const extra = shared.options.redact ?? [];
|
|
106
108
|
|
|
107
|
-
function record(
|
|
109
|
+
function record(
|
|
110
|
+
level: LogLevel,
|
|
111
|
+
message: string,
|
|
112
|
+
fields: LogFields | undefined,
|
|
113
|
+
how: LogOptions | undefined,
|
|
114
|
+
): LogRecord {
|
|
108
115
|
const merged: Record<string, unknown> = { ...bindings, ...fields };
|
|
109
116
|
const out: Record<string, unknown> = {
|
|
110
117
|
time: shared.now().toISOString(),
|
|
@@ -125,18 +132,21 @@ function build(shared: Shared, bindings: LogFields): Logger {
|
|
|
125
132
|
const withStack = level === 'error' || levelEnabled('debug', threshold);
|
|
126
133
|
redacted.err = serializeError(merged.err, withStack);
|
|
127
134
|
}
|
|
135
|
+
// The fields the message states, of those the record has: a renderer
|
|
136
|
+
// (the pretty format, `kindgi dev`) leaves them out of the line.
|
|
137
|
+
const stated = (how?.inMessage ?? []).filter(
|
|
138
|
+
(key) => !RESERVED.has(key) && key !== 'err' && key in redacted,
|
|
139
|
+
);
|
|
140
|
+
if (stated.length > 0) redacted.inMessage = stated;
|
|
128
141
|
return redacted as LogRecord;
|
|
129
142
|
}
|
|
130
143
|
|
|
131
144
|
function write(level: LogLevel, message: string, fields?: LogFields, how?: LogOptions): void {
|
|
132
145
|
if (!levelEnabled(level, threshold)) return;
|
|
133
|
-
const rec = record(level, message, fields);
|
|
146
|
+
const rec = record(level, message, fields, how);
|
|
134
147
|
const line =
|
|
135
148
|
shared.format === 'pretty'
|
|
136
|
-
? formatPretty(rec, {
|
|
137
|
-
color: shared.options.color === true,
|
|
138
|
-
...(how?.inMessage !== undefined && { omit: how.inMessage }),
|
|
139
|
-
})
|
|
149
|
+
? formatPretty(rec, { color: shared.options.color === true })
|
|
140
150
|
: formatJson(rec);
|
|
141
151
|
try {
|
|
142
152
|
shared.options.write(line);
|
package/src/types.ts
CHANGED
|
@@ -25,6 +25,12 @@ export interface LogRecord {
|
|
|
25
25
|
readonly projectId?: string;
|
|
26
26
|
readonly runId?: string;
|
|
27
27
|
readonly err?: SerializedError;
|
|
28
|
+
/**
|
|
29
|
+
* The fields the message already states (`LogOptions.inMessage`), when
|
|
30
|
+
* it states any: `GET /v1/runs 200 12ms` names `method`, `route`,
|
|
31
|
+
* `status` and `durationMs`. Renderers may leave them out of a line.
|
|
32
|
+
*/
|
|
33
|
+
readonly inMessage?: readonly string[];
|
|
28
34
|
readonly [field: string]: unknown;
|
|
29
35
|
}
|
|
30
36
|
|
|
@@ -44,7 +50,9 @@ export interface SerializedError {
|
|
|
44
50
|
* line `GET /v1/runs/:runId 200 12ms` states `method`, `route`,
|
|
45
51
|
* `status` and `durationMs`. The pretty format leaves them out, so
|
|
46
52
|
* a terminal line doesn't say everything twice; JSON keeps every
|
|
47
|
-
* field, for queries
|
|
53
|
+
* field, for queries, and lists the ones named here (those the
|
|
54
|
+
* record has) as the record's `inMessage`, so a renderer reading
|
|
55
|
+
* JSON leaves them out too.
|
|
48
56
|
*/
|
|
49
57
|
export interface LogOptions {
|
|
50
58
|
readonly inMessage?: readonly string[];
|