node.js - 控制台记录时如何截断(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
调用?
[编辑]
对于那些投票结束这个问题以支持“JavaScript toString() override”的人:根据我的理解,这toString()
不是问题 -在记录错误对象时(例如添加堆栈跟踪 -无论如何我都不想重新实现)。(正如我在其中一条评论中提到的,覆盖并不会改变输出。)console
toString()
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
推荐阅读
- ios - 导航栏在推送和弹出视图控制器时保持不变,在转换时创建奇怪的白色效果
- python - 给定的用数字序列替换字符串的程序应该用 pandas 编写
- xcodebuild - Xcode 10 构建失败 rm 权限在 /bin/sh/ 中被拒绝
- php - 输入类型文件未上传名称为 test (copy).csv 的文件
- r - 将向量传递给R中的函数
- tfs - Azure Devops 扩展(构建任务)根据用户操作启用/禁用或显示/隐藏控件
- dialogflow-es - 将谷歌助手与外部聊天机器人数据源集成,而不是在谷歌上唱对话流或动作
- java - 线程池为 7 的 Spring 调度程序不起作用
- python-3.x - 使用 psycopg2 在表中插入值
- java - JavaFX 按钮 minWidth 被忽略