@subsquid/logger 0.2.0 → 0.3.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 +6 -6
- package/lib/demo.js +8 -1
- package/lib/demo.js.map +1 -1
- package/lib/logger.d.ts +1 -1
- package/lib/logger.d.ts.map +1 -1
- package/lib/sinks/pretty.d.ts +4 -3
- package/lib/sinks/pretty.d.ts.map +1 -1
- package/lib/sinks/pretty.js +46 -99
- package/lib/sinks/pretty.js.map +1 -1
- package/package.json +9 -9
- package/src/demo.ts +12 -1
- package/src/sinks/pretty.ts +53 -95
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ log.debug('message with severity debug')
|
|
|
15
15
|
log.info({foo: 1, bar: 2}, 'message and some additional attributes')
|
|
16
16
|
|
|
17
17
|
// info message consisting only of attributes
|
|
18
|
-
log.info({a: 1, b: 2, c: 3, array: [4, 5]})
|
|
18
|
+
log.info({a: 1, b: 2, c: 3, array: [4, 5], obj: {foo: 'foo', bar: "bar"}})
|
|
19
19
|
|
|
20
20
|
// pass an Error object inplace of attributes
|
|
21
21
|
log.warn(new Error('Some error occured'))
|
|
@@ -63,9 +63,9 @@ When `stderr` is connected to a terminal, log records will be pretty printed.
|
|
|
63
63
|
Otherwise, log records will be written as JSON lines.
|
|
64
64
|
|
|
65
65
|
```
|
|
66
|
-
{"level":2,"time":
|
|
67
|
-
{"level":2,"time":
|
|
68
|
-
{"level":2,"time":
|
|
69
|
-
{"level":3,"time":
|
|
70
|
-
{"level":4,"time":
|
|
66
|
+
{"level":2,"time":1669387525765,"ns":"sqd:demo","msg":"message with severity info"}
|
|
67
|
+
{"level":2,"time":1669387525766,"ns":"sqd:demo","msg":"message and some additional attributes","foo":1,"bar":2}
|
|
68
|
+
{"level":2,"time":1669387525766,"ns":"sqd:demo","a":1,"b":2,"c":3,"array":[4,5,6],"obj":{"foo":"foo","bar":"bar"}}
|
|
69
|
+
{"level":3,"time":1669387525766,"ns":"sqd:demo","err":{"stack":"Error: Some error occured\n at Object.<anonymous> (/Users/eldar/dev/squid/util/logger/lib/demo.js:11:10)\n at Module._compile (node:internal/modules/cjs/loader:1159:14)\n at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)\n at Module.load (node:internal/modules/cjs/loader:1037:32)\n at Module._load (node:internal/modules/cjs/loader:878:12)\n at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\n at node:internal/main/run_main_module:23:47"}}
|
|
70
|
+
{"level":4,"time":1669387525766,"ns":"sqd:demo","msg":"weird","err":{"stack":"Error: Another error\n at Object.<anonymous> (/Users/eldar/dev/squid/util/logger/lib/demo.js:13:18)\n at Module._compile (node:internal/modules/cjs/loader:1159:14)\n at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)\n at Module.load (node:internal/modules/cjs/loader:1037:32)\n at Module._load (node:internal/modules/cjs/loader:878:12)\n at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\n at node:internal/main/run_main_module:23:47"},"a":1,"b":2}
|
|
71
71
|
```
|
package/lib/demo.js
CHANGED
|
@@ -6,7 +6,7 @@ log.info('message with severity info');
|
|
|
6
6
|
log.debug('message with severity debug');
|
|
7
7
|
log.info({ foo: 1, bar: 2 }, 'message and some additional attributes');
|
|
8
8
|
// info message consisting only of attributes
|
|
9
|
-
log.info({ a: 1, b: 2, c: 3, array: [4, 5,
|
|
9
|
+
log.info({ a: 1, b: 2, c: 3, array: [4, 5, 6], obj: { foo: 'foo', bar: "bar" } });
|
|
10
10
|
// pass an Error object inplace of attributes
|
|
11
11
|
log.warn(new Error('Some error occured'));
|
|
12
12
|
// Error together with some other attributes and message
|
|
@@ -17,4 +17,11 @@ const sqlLog = log.child('sql', { req: 1 });
|
|
|
17
17
|
sqlLog.debug('connecting to database');
|
|
18
18
|
sqlLog.debug({ sql: 'SELECT max(id) FROM status' });
|
|
19
19
|
log.info(new Map([['a', 1], ['b', 2], ['c', 3]]));
|
|
20
|
+
const recursive = {};
|
|
21
|
+
recursive.self = recursive;
|
|
22
|
+
log.info({ recursive });
|
|
23
|
+
const err = new Error('Error with properties');
|
|
24
|
+
err.foo = 1;
|
|
25
|
+
err.bar = 2;
|
|
26
|
+
log.error(err);
|
|
20
27
|
//# sourceMappingURL=demo.js.map
|
package/lib/demo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC,MAAM,GAAG,GAAG,IAAA,oBAAY,EAAC,UAAU,CAAC,CAAA;AAEpC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;AACtC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;AAExC,GAAG,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAE,wCAAwC,CAAC,CAAA;AAEpE,6CAA6C;AAC7C,GAAG,CAAC,IAAI,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC,MAAM,GAAG,GAAG,IAAA,oBAAY,EAAC,UAAU,CAAC,CAAA;AAEpC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;AACtC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;AAExC,GAAG,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAE,wCAAwC,CAAC,CAAA;AAEpE,6CAA6C;AAC7C,GAAG,CAAC,IAAI,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAC,EAAC,CAAC,CAAA;AAE7E,6CAA6C;AAC7C,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAA;AAEzC,wDAAwD;AACxD,GAAG,CAAC,KAAK,CAAC,EAAC,GAAG,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,OAAO,CAAC,CAAA;AAEjE,+DAA+D;AAC/D,sDAAsD;AACtD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAA;AACzC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;AACtC,MAAM,CAAC,KAAK,CAAC,EAAC,GAAG,EAAE,4BAA4B,EAAC,CAAC,CAAA;AAEjD,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAGjD,MAAM,SAAS,GAAQ,EAAE,CAAA;AACzB,SAAS,CAAC,IAAI,GAAG,SAAS,CAAA;AAE1B,GAAG,CAAC,IAAI,CAAC,EAAC,SAAS,EAAC,CAAC,CAAA;AAErB,MAAM,GAAG,GAAQ,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;AACnD,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;AACX,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;AACX,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA"}
|
package/lib/logger.d.ts
CHANGED
package/lib/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,QAAQ,EAAC,MAAM,SAAS,CAAA;AAGxC,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,KAAK,CAAA;CACd;AAGD,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,QAAQ,EAAC,MAAM,SAAS,CAAA;AAGxC,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,KAAK,CAAA;CACd;AAGD,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAA;AAG3C,qBAAa,MAAM;IAEX,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU,CAAC;gBAFX,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,EACV,UAAU,CAAC,oBAAQ;IAI/B,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAED,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IACjC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAkB9C,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAC1C,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAwB/D,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IACzB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAK9C,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IACzB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAK9C,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAK7C,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAK7C,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IACzB,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAK9C,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAChC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAKrD,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;IAIlB,MAAM,IAAI,OAAO;IAIjB,MAAM,IAAI,OAAO;IAIjB,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;CAGrB"}
|
package/lib/sinks/pretty.d.ts
CHANGED
|
@@ -3,16 +3,17 @@ export declare class Printer {
|
|
|
3
3
|
private out;
|
|
4
4
|
private hasColor;
|
|
5
5
|
private prefix?;
|
|
6
|
-
private
|
|
7
|
-
private style?;
|
|
8
|
-
private seenRecursion;
|
|
6
|
+
private color?;
|
|
9
7
|
constructor(out: (line: string) => void, hasColor: boolean);
|
|
8
|
+
private applyColor;
|
|
9
|
+
private style;
|
|
10
10
|
private line;
|
|
11
11
|
private text;
|
|
12
12
|
private begin;
|
|
13
13
|
private end;
|
|
14
14
|
private property;
|
|
15
15
|
print(rec: LogRecord): void;
|
|
16
|
+
private formatHead;
|
|
16
17
|
reset(): void;
|
|
17
18
|
}
|
|
18
19
|
export declare function prettyStderrSink(rec: LogRecord): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pretty.d.ts","sourceRoot":"","sources":["../../src/sinks/pretty.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pretty.d.ts","sourceRoot":"","sources":["../../src/sinks/pretty.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAA;AAGnC,qBAAa,OAAO;IAIJ,OAAO,CAAC,GAAG;IAA0B,OAAO,CAAC,QAAQ;IAHjE,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAC,CAAQ;gBAEF,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAU,QAAQ,EAAE,OAAO;IAE1E,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,QAAQ;IAmChB,KAAK,CAAC,GAAG,EAAE,SAAS;IA8BpB,OAAO,CAAC,UAAU;IAelB,KAAK,IAAI,IAAI;CAIhB;AAkED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAcrD"}
|
package/lib/sinks/pretty.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.prettyStderrSink = exports.Printer = void 0;
|
|
7
7
|
const util_internal_hex_1 = require("@subsquid/util-internal-hex");
|
|
8
|
+
const util_internal_json_1 = require("@subsquid/util-internal-json");
|
|
8
9
|
const assert_1 = __importDefault(require("assert"));
|
|
9
10
|
const supports_color_1 = require("supports-color");
|
|
10
11
|
const level_1 = require("../level");
|
|
@@ -12,13 +13,26 @@ class Printer {
|
|
|
12
13
|
constructor(out, hasColor) {
|
|
13
14
|
this.out = out;
|
|
14
15
|
this.hasColor = hasColor;
|
|
15
|
-
this.visited = new Set();
|
|
16
|
-
this.seenRecursion = false;
|
|
17
16
|
}
|
|
18
|
-
|
|
19
|
-
if (
|
|
20
|
-
|
|
17
|
+
applyColor(s) {
|
|
18
|
+
if (this.hasColor && this.color && s) {
|
|
19
|
+
return `\u001b[${this.color}m${s}\u001b[0m`;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return s;
|
|
21
23
|
}
|
|
24
|
+
}
|
|
25
|
+
style(style, s) {
|
|
26
|
+
if (this.hasColor && style && s) {
|
|
27
|
+
s = style + s + '\u001b[0m';
|
|
28
|
+
if (this.color) {
|
|
29
|
+
s = `\u001b[0m` + s + `\u001b[${this.color}m`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return s;
|
|
33
|
+
}
|
|
34
|
+
line(s) {
|
|
35
|
+
s = this.applyColor(s);
|
|
22
36
|
if (this.prefix) {
|
|
23
37
|
this.out(this.prefix.prepend(s));
|
|
24
38
|
}
|
|
@@ -33,10 +47,7 @@ class Printer {
|
|
|
33
47
|
}
|
|
34
48
|
begin(prefix, width) {
|
|
35
49
|
width = width == null ? prefix.length : width;
|
|
36
|
-
|
|
37
|
-
prefix = this.style.open + prefix + this.style.close;
|
|
38
|
-
}
|
|
39
|
-
this.prefix = new Prefix(prefix, width, this.prefix);
|
|
50
|
+
this.prefix = new Prefix(this.applyColor(prefix), width, this.prefix);
|
|
40
51
|
}
|
|
41
52
|
end() {
|
|
42
53
|
(0, assert_1.default)(this.prefix != null);
|
|
@@ -65,83 +76,33 @@ class Printer {
|
|
|
65
76
|
else if (typeof val?.toJSON == 'function') {
|
|
66
77
|
this.property(prefix, val.toJSON());
|
|
67
78
|
}
|
|
68
|
-
else if (val instanceof Map) {
|
|
69
|
-
let entries = [];
|
|
70
|
-
for (let [k, v] of val.entries()) {
|
|
71
|
-
entries.push({ k, v });
|
|
72
|
-
}
|
|
73
|
-
this.property(prefix, { map: entries });
|
|
74
|
-
}
|
|
75
|
-
else if (val instanceof Set) {
|
|
76
|
-
this.property(prefix, { set: [...val] });
|
|
77
|
-
}
|
|
78
|
-
else if (Array.isArray(val)) {
|
|
79
|
-
if (val.length == 0) {
|
|
80
|
-
this.line(`${prefix} []`);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
if (this.visited.has(val)) {
|
|
84
|
-
this.seenRecursion = true;
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
this.visited.add(val);
|
|
89
|
-
}
|
|
90
|
-
this.line(prefix);
|
|
91
|
-
for (let item of val) {
|
|
92
|
-
this.property(' -', item);
|
|
93
|
-
}
|
|
94
|
-
this.visited.delete(val);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
79
|
else if (val == null) {
|
|
98
80
|
this.line(`${prefix} null`);
|
|
99
81
|
}
|
|
100
82
|
else {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
this.visited.add(val);
|
|
107
|
-
}
|
|
108
|
-
let props;
|
|
109
|
-
if (val instanceof Error) {
|
|
110
|
-
props = { ...val, stack: val.stack || val.toString() };
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
props = val;
|
|
83
|
+
let text;
|
|
84
|
+
try {
|
|
85
|
+
text = JSON.stringify((0, util_internal_json_1.toJSON)(val));
|
|
114
86
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (!has) {
|
|
118
|
-
if (prefix == ' -') {
|
|
119
|
-
this.begin(prefix);
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
this.line(prefix);
|
|
123
|
-
this.begin(' ');
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
has = true;
|
|
127
|
-
this.property(key + ':', props[key]);
|
|
87
|
+
catch (e) {
|
|
88
|
+
text = this.style('\u001b[31m', `failed to serialize logged value: ${e}`);
|
|
128
89
|
}
|
|
129
|
-
|
|
130
|
-
this.end();
|
|
131
|
-
}
|
|
132
|
-
this.visited.delete(val);
|
|
90
|
+
this.line(`${prefix} ${text}`);
|
|
133
91
|
}
|
|
134
92
|
break;
|
|
135
93
|
}
|
|
136
94
|
}
|
|
137
95
|
print(rec) {
|
|
138
|
-
this.begin(formatHead(rec
|
|
96
|
+
this.begin(this.formatHead(rec), 14 + (rec.ns ? rec.ns.length + 1 : 0));
|
|
139
97
|
if (rec.msg) {
|
|
140
98
|
this.text(rec.msg);
|
|
141
99
|
}
|
|
142
|
-
this.
|
|
100
|
+
this.color = '2'; // dim
|
|
143
101
|
if (rec.err instanceof Error) {
|
|
144
102
|
this.text(rec.err.stack || rec.err.toString());
|
|
103
|
+
for (let k in rec.err) {
|
|
104
|
+
this.property(` ${k}:`, rec.err[k]);
|
|
105
|
+
}
|
|
145
106
|
}
|
|
146
107
|
for (let key in rec) {
|
|
147
108
|
switch (key) {
|
|
@@ -152,9 +113,7 @@ class Printer {
|
|
|
152
113
|
break;
|
|
153
114
|
default:
|
|
154
115
|
if (key == 'err' && rec.err instanceof Error) {
|
|
155
|
-
// already printed the stack trace above
|
|
156
|
-
// print only the rest of props
|
|
157
|
-
this.property('err:', { ...rec.err });
|
|
116
|
+
// already printed under the stack trace above
|
|
158
117
|
}
|
|
159
118
|
else {
|
|
160
119
|
this.property(key + ':', rec[key]);
|
|
@@ -162,39 +121,27 @@ class Printer {
|
|
|
162
121
|
}
|
|
163
122
|
}
|
|
164
123
|
this.end();
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
124
|
+
}
|
|
125
|
+
formatHead(rec) {
|
|
126
|
+
let time = formatTime(rec.time);
|
|
127
|
+
let level = level_1.LogLevel[rec.level].padEnd(5, ' ');
|
|
128
|
+
let ns = rec.ns;
|
|
129
|
+
if (this.hasColor) {
|
|
130
|
+
level = `\u001b[1m\u001b[${getLevelColor(rec.level)}m${level}\u001b[0m`;
|
|
131
|
+
ns = `\u001b[1m\u001b[34m${ns}\u001b[0m`;
|
|
132
|
+
}
|
|
133
|
+
let head = time + ' ' + level;
|
|
134
|
+
if (rec.ns) {
|
|
135
|
+
head += ' ' + ns;
|
|
174
136
|
}
|
|
137
|
+
return head;
|
|
175
138
|
}
|
|
176
139
|
reset() {
|
|
177
|
-
this.visited.clear();
|
|
178
140
|
this.prefix = undefined;
|
|
179
|
-
this.
|
|
180
|
-
this.seenRecursion = false;
|
|
141
|
+
this.color = undefined;
|
|
181
142
|
}
|
|
182
143
|
}
|
|
183
144
|
exports.Printer = Printer;
|
|
184
|
-
function formatHead(rec, withColor) {
|
|
185
|
-
let time = formatTime(rec.time);
|
|
186
|
-
let level = level_1.LogLevel[rec.level].padEnd(5, ' ');
|
|
187
|
-
let ns = rec.ns;
|
|
188
|
-
if (withColor) {
|
|
189
|
-
level = `\u001b[1m\u001b[${getLevelColor(rec.level)}m${level}\u001b[0m`;
|
|
190
|
-
ns = `\u001b[1m\u001b[34m${ns}\u001b[0m`;
|
|
191
|
-
}
|
|
192
|
-
let head = time + ' ' + level;
|
|
193
|
-
if (rec.ns) {
|
|
194
|
-
head += ' ' + ns;
|
|
195
|
-
}
|
|
196
|
-
return head;
|
|
197
|
-
}
|
|
198
145
|
function getLevelColor(level) {
|
|
199
146
|
switch (level) {
|
|
200
147
|
case level_1.LogLevel.TRACE:
|
package/lib/sinks/pretty.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pretty.js","sourceRoot":"","sources":["../../src/sinks/pretty.ts"],"names":[],"mappings":";;;;;;AAAA,mEAAiD;AACjD,oDAA2B;AAC3B,mDAAoD;AACpD,oCAAiC;AAIjC,MAAa,OAAO;
|
|
1
|
+
{"version":3,"file":"pretty.js","sourceRoot":"","sources":["../../src/sinks/pretty.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subsquid/logger",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Lightweight library for structured logging",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"repository": "git@github.com:subsquid/squid.git",
|
|
@@ -13,21 +13,21 @@
|
|
|
13
13
|
],
|
|
14
14
|
"main": "lib/index.js",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@subsquid/util-internal-hex": "^0.0.
|
|
17
|
-
"@subsquid/util-internal-json": "^0.2.
|
|
16
|
+
"@subsquid/util-internal-hex": "^0.0.2",
|
|
17
|
+
"@subsquid/util-internal-json": "^0.2.1",
|
|
18
18
|
"supports-color": "^8.1.1"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@types/mocha": "^
|
|
22
|
-
"@types/node": "^16.
|
|
21
|
+
"@types/mocha": "^10.0.1",
|
|
22
|
+
"@types/node": "^16.18.12",
|
|
23
23
|
"@types/supports-color": "^8.1.1",
|
|
24
|
-
"expect": "^
|
|
25
|
-
"mocha": "^
|
|
26
|
-
"typescript": "~4.
|
|
24
|
+
"expect": "^29.4.2",
|
|
25
|
+
"mocha": "^10.2.0",
|
|
26
|
+
"typescript": "~4.9.5"
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
29
29
|
"build": "rm -rf lib && tsc",
|
|
30
30
|
"test": "mocha lib/**/*.test.js"
|
|
31
31
|
},
|
|
32
|
-
"readme": "# @subsquid/logger\n\nLightweight structured logger for squid framework.\n\n## Usage\n\n```typescript\nimport {createLogger} from \"@subsquid/logger\"\n\nconst log = createLogger('sqd:demo')\n\nlog.info('message with severity info')\nlog.debug('message with severity debug')\n\nlog.info({foo: 1, bar: 2}, 'message and some additional attributes')\n\n// info message consisting only of attributes\nlog.info({a: 1, b: 2, c: 3, array: [4, 5]}) \n\n// pass an Error object inplace of attributes\nlog.warn(new Error('Some error occured'))\n\n// Error together with some other attributes and message\nlog.error({err: new Error('Another error'), a: 1, b: 2}, 'weird')\n\n// create a child logger instance with namespace `sqd:demo:sql` \n// and `req: 1` attribute attached to every log record\nconst sqlLog = log.child('sql', {req: 1})\nsqlLog.debug('connecting to database')\nsqlLog.debug({sql: 'SELECT max(id) FROM status'})\n```\n\n## Configuration\n\nThere are 6 log levels available: `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`.\n\nThe log level of each logger instance is solely determined by its namespace and specified\nvia set of `SQD_TRACE`, ..., `SQD_FATAL` environment variables.\nThe default log level is `INFO`. \n\nUsers override the default log level by setting in appropriate \nenvironment variable a pattern which matches the logger's namespace.\n\n* `SQD_DEBUG=*` - sets the log level to `DEBUG` for all loggers.\n* `SQD_DEBUG=foo` - loggers `foo`, `foo:bar`, `foo:a:b`, etc will have a `DEBUG` level.\n* `SQD_DEBUG=a:b*:c,d` - loggers `a:b:c`, `a:baz:c`, `a:baz:c:foo`, `d`, etc will have a `DEBUG` level, logger `a:z:c` will not.\n\nWhen logger is matched by multiple `SQD_*` variables, the match with the highest specificity wins.\nWhen specificities are equal, the most verbose matched log level will be effective.\n\nSpecificity is computed as a number of namespace characters \nwhich are not matched by wildcards and which are not part of a child namespace.\nFor example, given a pattern `foo*bar`, the specificity of `foo:bar:baz:qux`, `foobar` and `foobazbar` is `6`.\n\n## Output\n\nThe logger always writes to `stderr`. \n\nWhen `stderr` is connected to a terminal, log records will be pretty printed.\n\n\n\nOtherwise, log records will be written as JSON lines.\n\n```\n{\"level\":2,\"time\":
|
|
32
|
+
"readme": "# @subsquid/logger\n\nLightweight structured logger for squid framework.\n\n## Usage\n\n```typescript\nimport {createLogger} from \"@subsquid/logger\"\n\nconst log = createLogger('sqd:demo')\n\nlog.info('message with severity info')\nlog.debug('message with severity debug')\n\nlog.info({foo: 1, bar: 2}, 'message and some additional attributes')\n\n// info message consisting only of attributes\nlog.info({a: 1, b: 2, c: 3, array: [4, 5], obj: {foo: 'foo', bar: \"bar\"}}) \n\n// pass an Error object inplace of attributes\nlog.warn(new Error('Some error occured'))\n\n// Error together with some other attributes and message\nlog.error({err: new Error('Another error'), a: 1, b: 2}, 'weird')\n\n// create a child logger instance with namespace `sqd:demo:sql` \n// and `req: 1` attribute attached to every log record\nconst sqlLog = log.child('sql', {req: 1})\nsqlLog.debug('connecting to database')\nsqlLog.debug({sql: 'SELECT max(id) FROM status'})\n```\n\n## Configuration\n\nThere are 6 log levels available: `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`.\n\nThe log level of each logger instance is solely determined by its namespace and specified\nvia set of `SQD_TRACE`, ..., `SQD_FATAL` environment variables.\nThe default log level is `INFO`. \n\nUsers override the default log level by setting in appropriate \nenvironment variable a pattern which matches the logger's namespace.\n\n* `SQD_DEBUG=*` - sets the log level to `DEBUG` for all loggers.\n* `SQD_DEBUG=foo` - loggers `foo`, `foo:bar`, `foo:a:b`, etc will have a `DEBUG` level.\n* `SQD_DEBUG=a:b*:c,d` - loggers `a:b:c`, `a:baz:c`, `a:baz:c:foo`, `d`, etc will have a `DEBUG` level, logger `a:z:c` will not.\n\nWhen logger is matched by multiple `SQD_*` variables, the match with the highest specificity wins.\nWhen specificities are equal, the most verbose matched log level will be effective.\n\nSpecificity is computed as a number of namespace characters \nwhich are not matched by wildcards and which are not part of a child namespace.\nFor example, given a pattern `foo*bar`, the specificity of `foo:bar:baz:qux`, `foobar` and `foobazbar` is `6`.\n\n## Output\n\nThe logger always writes to `stderr`. \n\nWhen `stderr` is connected to a terminal, log records will be pretty printed.\n\n\n\nOtherwise, log records will be written as JSON lines.\n\n```\n{\"level\":2,\"time\":1669387525765,\"ns\":\"sqd:demo\",\"msg\":\"message with severity info\"}\n{\"level\":2,\"time\":1669387525766,\"ns\":\"sqd:demo\",\"msg\":\"message and some additional attributes\",\"foo\":1,\"bar\":2}\n{\"level\":2,\"time\":1669387525766,\"ns\":\"sqd:demo\",\"a\":1,\"b\":2,\"c\":3,\"array\":[4,5,6],\"obj\":{\"foo\":\"foo\",\"bar\":\"bar\"}}\n{\"level\":3,\"time\":1669387525766,\"ns\":\"sqd:demo\",\"err\":{\"stack\":\"Error: Some error occured\\n at Object.<anonymous> (/Users/eldar/dev/squid/util/logger/lib/demo.js:11:10)\\n at Module._compile (node:internal/modules/cjs/loader:1159:14)\\n at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)\\n at Module.load (node:internal/modules/cjs/loader:1037:32)\\n at Module._load (node:internal/modules/cjs/loader:878:12)\\n at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\\n at node:internal/main/run_main_module:23:47\"}}\n{\"level\":4,\"time\":1669387525766,\"ns\":\"sqd:demo\",\"msg\":\"weird\",\"err\":{\"stack\":\"Error: Another error\\n at Object.<anonymous> (/Users/eldar/dev/squid/util/logger/lib/demo.js:13:18)\\n at Module._compile (node:internal/modules/cjs/loader:1159:14)\\n at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)\\n at Module.load (node:internal/modules/cjs/loader:1037:32)\\n at Module._load (node:internal/modules/cjs/loader:878:12)\\n at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\\n at node:internal/main/run_main_module:23:47\"},\"a\":1,\"b\":2}\n```\n"
|
|
33
33
|
}
|
package/src/demo.ts
CHANGED
|
@@ -8,7 +8,7 @@ log.debug('message with severity debug')
|
|
|
8
8
|
log.info({foo: 1, bar: 2}, 'message and some additional attributes')
|
|
9
9
|
|
|
10
10
|
// info message consisting only of attributes
|
|
11
|
-
log.info({a: 1, b: 2, c: 3, array: [4, 5,
|
|
11
|
+
log.info({a: 1, b: 2, c: 3, array: [4, 5, 6], obj: {foo: 'foo', bar: "bar"}})
|
|
12
12
|
|
|
13
13
|
// pass an Error object inplace of attributes
|
|
14
14
|
log.warn(new Error('Some error occured'))
|
|
@@ -23,3 +23,14 @@ sqlLog.debug('connecting to database')
|
|
|
23
23
|
sqlLog.debug({sql: 'SELECT max(id) FROM status'})
|
|
24
24
|
|
|
25
25
|
log.info(new Map([['a', 1], ['b', 2], ['c', 3]]))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
const recursive: any = {}
|
|
29
|
+
recursive.self = recursive
|
|
30
|
+
|
|
31
|
+
log.info({recursive})
|
|
32
|
+
|
|
33
|
+
const err: any = new Error('Error with properties')
|
|
34
|
+
err.foo = 1
|
|
35
|
+
err.bar = 2
|
|
36
|
+
log.error(err)
|
package/src/sinks/pretty.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {toHex} from "@subsquid/util-internal-hex"
|
|
2
|
+
import {toJSON} from '@subsquid/util-internal-json'
|
|
2
3
|
import assert from "assert"
|
|
3
4
|
import {stderr as stderrColor} from "supports-color"
|
|
4
5
|
import {LogLevel} from "../level"
|
|
@@ -7,16 +8,30 @@ import {LogRecord} from "../logger"
|
|
|
7
8
|
|
|
8
9
|
export class Printer {
|
|
9
10
|
private prefix?: Prefix
|
|
10
|
-
private
|
|
11
|
-
private style?: {open: string, close: string}
|
|
12
|
-
private seenRecursion = false
|
|
11
|
+
private color?: string
|
|
13
12
|
|
|
14
13
|
constructor(private out: (line: string) => void, private hasColor: boolean) {}
|
|
15
14
|
|
|
16
|
-
private
|
|
17
|
-
if (
|
|
18
|
-
|
|
15
|
+
private applyColor(s: string): string {
|
|
16
|
+
if (this.hasColor && this.color && s) {
|
|
17
|
+
return `\u001b[${this.color}m${s}\u001b[0m`
|
|
18
|
+
} else {
|
|
19
|
+
return s
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private style(style: string, s: string): string {
|
|
24
|
+
if (this.hasColor && style && s) {
|
|
25
|
+
s = style + s + '\u001b[0m'
|
|
26
|
+
if (this.color) {
|
|
27
|
+
s = `\u001b[0m` + s + `\u001b[${this.color}m`
|
|
28
|
+
}
|
|
19
29
|
}
|
|
30
|
+
return s
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private line(s: string): void {
|
|
34
|
+
s = this.applyColor(s)
|
|
20
35
|
if (this.prefix) {
|
|
21
36
|
this.out(this.prefix.prepend(s))
|
|
22
37
|
} else {
|
|
@@ -32,10 +47,11 @@ export class Printer {
|
|
|
32
47
|
|
|
33
48
|
private begin(prefix: string, width?: number): void {
|
|
34
49
|
width = width == null ? prefix.length : width
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
50
|
+
this.prefix = new Prefix(
|
|
51
|
+
this.applyColor(prefix),
|
|
52
|
+
width,
|
|
53
|
+
this.prefix
|
|
54
|
+
)
|
|
39
55
|
}
|
|
40
56
|
|
|
41
57
|
private end(): void {
|
|
@@ -63,75 +79,32 @@ export class Printer {
|
|
|
63
79
|
this.line(`${prefix} ${val}`)
|
|
64
80
|
} else if (typeof (val as any)?.toJSON == 'function') {
|
|
65
81
|
this.property(prefix, (val as any).toJSON())
|
|
66
|
-
} else if (val instanceof Map) {
|
|
67
|
-
let entries: {k: unknown, v: unknown}[] = []
|
|
68
|
-
for (let [k, v] of val.entries()) {
|
|
69
|
-
entries.push({k, v})
|
|
70
|
-
}
|
|
71
|
-
this.property(prefix, {map: entries})
|
|
72
|
-
} else if (val instanceof Set) {
|
|
73
|
-
this.property(prefix, {set: [...val]})
|
|
74
|
-
} else if (Array.isArray(val)) {
|
|
75
|
-
if (val.length == 0) {
|
|
76
|
-
this.line(`${prefix} []`)
|
|
77
|
-
} else {
|
|
78
|
-
if (this.visited.has(val)) {
|
|
79
|
-
this.seenRecursion = true
|
|
80
|
-
return
|
|
81
|
-
} else {
|
|
82
|
-
this.visited.add(val)
|
|
83
|
-
}
|
|
84
|
-
this.line(prefix)
|
|
85
|
-
for (let item of val) {
|
|
86
|
-
this.property(' -', item)
|
|
87
|
-
}
|
|
88
|
-
this.visited.delete(val)
|
|
89
|
-
}
|
|
90
82
|
} else if (val == null) {
|
|
91
83
|
this.line(`${prefix} null`)
|
|
92
84
|
} else {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
this.
|
|
98
|
-
}
|
|
99
|
-
let props: any
|
|
100
|
-
if (val instanceof Error) {
|
|
101
|
-
props = {...val, stack: val.stack || val.toString()}
|
|
102
|
-
} else {
|
|
103
|
-
props = val
|
|
104
|
-
}
|
|
105
|
-
let has = false
|
|
106
|
-
for (let key in props) {
|
|
107
|
-
if (!has) {
|
|
108
|
-
if (prefix == ' -') {
|
|
109
|
-
this.begin(prefix)
|
|
110
|
-
} else {
|
|
111
|
-
this.line(prefix)
|
|
112
|
-
this.begin(' ')
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
has = true
|
|
116
|
-
this.property(key + ':', props[key])
|
|
85
|
+
let text
|
|
86
|
+
try {
|
|
87
|
+
text = JSON.stringify(toJSON(val))
|
|
88
|
+
} catch(e: any) {
|
|
89
|
+
text = this.style('\u001b[31m', `failed to serialize logged value: ${e}`)
|
|
117
90
|
}
|
|
118
|
-
|
|
119
|
-
this.end()
|
|
120
|
-
}
|
|
121
|
-
this.visited.delete(val)
|
|
91
|
+
this.line(`${prefix} ${text}`)
|
|
122
92
|
}
|
|
123
93
|
break
|
|
124
94
|
}
|
|
125
95
|
}
|
|
126
96
|
|
|
127
97
|
print(rec: LogRecord) {
|
|
128
|
-
this.begin(formatHead(rec
|
|
98
|
+
this.begin(this.formatHead(rec), 14 + (rec.ns ? rec.ns.length + 1 : 0))
|
|
129
99
|
if (rec.msg) {
|
|
130
100
|
this.text(rec.msg)
|
|
131
101
|
}
|
|
132
|
-
this.
|
|
102
|
+
this.color = '2' // dim
|
|
133
103
|
if (rec.err instanceof Error) {
|
|
134
104
|
this.text(rec.err.stack || rec.err.toString())
|
|
105
|
+
for (let k in rec.err) {
|
|
106
|
+
this.property(` ${k}:`, (rec.err as any)[k])
|
|
107
|
+
}
|
|
135
108
|
}
|
|
136
109
|
for (let key in rec) {
|
|
137
110
|
switch(key) {
|
|
@@ -142,49 +115,34 @@ export class Printer {
|
|
|
142
115
|
break
|
|
143
116
|
default:
|
|
144
117
|
if (key == 'err' && rec.err instanceof Error) {
|
|
145
|
-
// already printed the stack trace above
|
|
146
|
-
// print only the rest of props
|
|
147
|
-
this.property('err:', {...rec.err})
|
|
118
|
+
// already printed under the stack trace above
|
|
148
119
|
} else {
|
|
149
120
|
this.property(key + ':', (rec as any)[key])
|
|
150
121
|
}
|
|
151
122
|
}
|
|
152
123
|
}
|
|
153
124
|
this.end()
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private formatHead(rec: LogRecord): string {
|
|
128
|
+
let time = formatTime(rec.time)
|
|
129
|
+
let level = LogLevel[rec.level].padEnd(5, ' ')
|
|
130
|
+
let ns = rec.ns
|
|
131
|
+
if (this.hasColor) {
|
|
132
|
+
level = `\u001b[1m\u001b[${getLevelColor(rec.level)}m${level}\u001b[0m`
|
|
133
|
+
ns = `\u001b[1m\u001b[34m${ns}\u001b[0m`
|
|
134
|
+
}
|
|
135
|
+
let head = time + ' ' + level
|
|
136
|
+
if (rec.ns) {
|
|
137
|
+
head += ' ' + ns
|
|
163
138
|
}
|
|
139
|
+
return head
|
|
164
140
|
}
|
|
165
141
|
|
|
166
142
|
reset(): void {
|
|
167
|
-
this.visited.clear()
|
|
168
143
|
this.prefix = undefined
|
|
169
|
-
this.
|
|
170
|
-
this.seenRecursion = false
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
function formatHead(rec: LogRecord, withColor?: boolean): string {
|
|
176
|
-
let time = formatTime(rec.time)
|
|
177
|
-
let level = LogLevel[rec.level].padEnd(5, ' ')
|
|
178
|
-
let ns = rec.ns
|
|
179
|
-
if (withColor) {
|
|
180
|
-
level = `\u001b[1m\u001b[${getLevelColor(rec.level)}m${level}\u001b[0m`
|
|
181
|
-
ns = `\u001b[1m\u001b[34m${ns}\u001b[0m`
|
|
182
|
-
}
|
|
183
|
-
let head = time + ' ' + level
|
|
184
|
-
if (rec.ns) {
|
|
185
|
-
head += ' ' + ns
|
|
144
|
+
this.color = undefined
|
|
186
145
|
}
|
|
187
|
-
return head
|
|
188
146
|
}
|
|
189
147
|
|
|
190
148
|
|