如何在控制台日志记录时截断(Node)JS错误对象中的自定义字段



我有一个(节点(JS类:

class PayloadContainingError extends Error {
constructor(msg, payload) {
super(msg);
this.payload = payload;
}
}

payload字段可能包含长字符串,即使在MB范围内也是如此。

如果我在某个时候console.log这个类,我会在日志中得到完整的payload。相反,我希望它记录一个截断的部分(如Linuxhead命令(。

例如,如果我console.error("Bad payload", instance_of_PayloadContainingError),而不是得到

Bad payload { Error: BAD
at foo.bar
payload:
'a possibly million-character long line that pollutes my log'
}

我希望console记录

Bad payload { Error: BAD
at foo.bar
payload:
'first 100 chars...'
}

这是否可以通过类/字段级别上的一些魔术实现,而不必重构任何(现有和未来的(console.log调用?

[Edit]对于那些投票支持";JavaScript toString((覆盖":根据我的理解,toString()不是这里的问题——console在记录错误对象时似乎超出了toString()通常的功能(例如,添加stacktrace——我无论如何都不想重新实现(。(正如我在一条评论中提到的,重写toString()无论如何都不会改变输出。(

节点的console.*方法似乎只考虑了可枚举属性。因此,您可以使此属性不可枚举:

class PayloadContainingError extends Error {
constructor(msg, payload) {
super(msg);
Object.defineProperty(this, "payload", {
enumerable: false,
value: payload,
});
}
}
const e = new PayloadContainingError("test error", "a possibly million-character long line that pollutes my log");
console.error(e);
$ node ./test.js 
PayloadContainingError: test error
at Object.<anonymous> (/home/slava-b/arc/fei-24447/frontend/projects/infratest/packages/tokenator-universal/test.js:43:11)
at Module._compile (internal/modules/cjs/loader.js:956:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
at Module.load (internal/modules/cjs/loader.js:812:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
at internal/main/run_main_module.js:17:11

相关内容

最新更新