如何在Node.js中记录堆栈跟踪

24

你所指的Rails中的"stack trace package"是哪一个? - Andrew Marshall
我更新了问题并添加了一个链接。 - Chris Abrams
可能是如何在Node.js中打印堆栈跟踪?的重复问题。 - Gustavo Straube
4个回答

39

您可以从任何错误(Error)的.stack属性中获取此文本内容。例如:

try {
    throw new Error();
} catch (e) {
    console.log(e.stack);
}

为了获取堆栈跟踪,或者只需简单地new一个错误

console.log(new Error().stack)

需要使用(new Error()).stacknew Error().stack会获取Error().stack,然后尝试从中构建一些东西。 - McKayla
6
不,这在 JavaScript 中并不正确,“new”运算符总是优先执行。 - Benja
1
你应该使用 console.error 而不是 console.log。它们看起来可能做同样的事情,但实际上前者输出到 stderr 而不是 stdout - 0x8890
特别适用于 electron 应用程序,其中 console.trace() 并不总是有效。 - x-yuri

9

如果你使用 winston,你可以添加这个:

winston = require('winston');

logger = expandErrors(new winston.Logger());

logger.info(new Error("my error"));

// Extend a winston by making it expand errors when passed in as the 
// second argument (the first argument is the log level).
function expandErrors(logger) {
  var oldLogFunc = logger.log;
  logger.log = function() {
    var args = Array.prototype.slice.call(arguments, 0);
    if (args.length >= 2 && args[1] instanceof Error) {
      args[1] = args[1].stack;
    }
    return oldLogFunc.apply(this, args);
  };
  return logger;
}

然后你可以得到带有堆栈跟踪的温斯顿日志记录器。还在a gist中。

9

针对此问题有一个函数可供使用:console.trace()

如果您不想要在控制台中打印日志,您可以使用 new Error().stack 获取堆栈跟踪字符串值。


我不知道这个方法的存在..我会试一试! - Chris Abrams
是的,但如果你需要像...我不知道...传递它,或者对它做些什么怎么办?控制台函数被称为“辅助”函数,原因是它们只是让你在特定情况下变得非常懒惰的工具;) - B T
这听起来像是基于原始问题的一个很大的“假设”,但让我为此进行更新。 - Benja
这并不是一个大问题。我将我的错误消息报告给一个集中的日志存储库。非常感谢您的更新! - Michael Lang

0

看看callsite,它可以获取堆栈对象,以便您可以按任何方式使用它(而不是作为字符串)。它非常棒,而且简单易用。查看this以获取有关堆栈操作的更多信息。

Node.js已经有一些出色的记录器了,但我构建了一个记录器,它输出彩色、简单的输出和简短的堆栈跟踪。它不会覆盖console.log,这对我来说很方便。如果您感兴趣,可以在这里,node-logger找到它。


Callsite的实现与@Benja的建议一致。 - Casey Watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接