【发布时间】:2019-02-17 12:53:14
【问题描述】:
在扩展Error 对象时,我很沮丧调用super(originalError) 会导致将正常的堆栈跟踪打印到STDOUT。我希望我的日志以 JSON 格式进行格式化,以便它们可以被 logstash/Kibana 使用。 Kibana 中包含\n 的堆栈跟踪被拆分为多个条目,因为它显然不知道如何处理该输入。我可以在登录之前通过一些修改来避免这种情况
function logError(errorDetails, stack) {
logger.error({ errorDetails, stack: sanitizeLineBreaks(stack) } // removes `\n`
}
但是我正在实现的错误对象看起来像:
class ServerError extends Error {
constructor(originalError, errorDetails, stack) {
super(originalError) // <- this is the problem
Error.captureStackTrace(this, ServerError)
// stuff ...
logError(originalError, stack)
}
}
但是,调用super(originalError) 会使用换行符打印到控制台;这会导致丑陋的条目,其中跟踪的每一行都是 Kibana GUI 中的单独条目。当我不致电super(originalError) 时,我在控制台中没有收到任何投诉,但我仍然犹豫是否要删除它。
扩展Error对象时是否需要super(originalError)?
【问题讨论】:
-
super()没有向控制台打印任何内容?!它只是创建Error实例。或者您的环境中是否有一个覆盖的Error构造函数? -
@Bergi
However calling super(originalError) prints to the console with new line characters好像我在某个地方被误导了。你能指出是什么让你认为它没有打印任何东西吗? -
@Bergi 嗯,我并不完全关注。
Super(originalError)确实在我的情况下打印到控制台。 -
@Bergi 我只有
extendError,不要覆盖它。 -
你能展示一个完整的程序来重现这个问题吗?创建
new Error(…)不会在我的节点中的控制台上打印任何内容 - 除非您执行console.log(new Error(…))。
标签: javascript node.js logging ecmascript-6 error-handling