控制台记录时如何截断(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 中的自定义事件

Node.JS MySQL 将结果记录到控制台而不被要求和奇怪的行为

Node.js中基础知识

如何在渲染 ejs 视图 Node.js 时捕获错误

理解js中的Error

Node的内存控制