控制台记录时如何截断(Node)JS错误对象中的自定义字段
Posted
技术标签:
【中文标题】控制台记录时如何截断(Node)JS错误对象中的自定义字段【英文标题】:How to truncate custom field in (Node)JS error object when console-logging 【发布时间】:2021-08-15 06:57:07 【问题描述】:我有一个 (Node)JS 类:
class PayloadContainingError extends Error
constructor(msg, payload)
super(msg);
this.payload = payload;
payload
字段可能包含长字符串,即使在 MB 范围内。
如果我在某个时候console.log
这个课程,我会在日志中得到完整的payload
。
相反,我希望它记录截断的部分(如 Linux head
命令)。
例如如果我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
调用?
[编辑]
对于那些投票结束这个问题以支持“javascript toString() override”的人:根据我的理解,toString()
不是这里的问题——console
似乎超出了toString()
通常在记录错误对象时所做的事情(例如添加堆栈跟踪 - 我不想重新实现)。 (正如我的一个 cmets 所述,覆盖 toString()
无论如何都不会改变输出。)
【问题讨论】:
这能回答你的问题吗? Is it possible to override JavaScript's toString() function to provide meaningful output for debugging? 遗憾的是没有 - 尝试向该类添加一个toString() return payload.substring(0,100);
方法,以及一个单独的 PayloadContainingError.prototype.toString = function() return payload.substring(0,100);
(仅返回截断的有效负载只是为了演示),但两者都没有对 @ 进行任何更改987654338@ 输出 - 看起来 console
在字符串化错误时使用了不同的策略
【参考方案1】:
似乎节点的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
【讨论】:
以上是关于控制台记录时如何截断(Node)JS错误对象中的自定义字段的主要内容,如果未能解决你的问题,请参考以下文章
带有 Express 框架的 Node.js 中的自定义事件