【问题标题】:How to log stack traces in node.js如何在 node.js 中记录堆栈跟踪
【发布时间】:2012-03-22 00:55:41
【问题描述】:

寻找一个处理堆栈跟踪的 node.js 包,类似于在 RoR 中的处理方式:

Rails: Logging the entire stack trace of an exception

【问题讨论】:

标签: node.js logging stack-trace


【解决方案1】:

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

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

或者只是 new 报错以获取堆栈跟踪

console.log(new Error().stack)

【讨论】:

  • 它必须是(new Error()).stacknew Error().stack 会得到 Error().stack,然后尝试从中构造一些东西
  • 不,在 js 中并非如此,new 运算符始终优先。
  • 您实际上应该使用console.error 而不是console.log。他们可能看起来做同样的事情,但实际上使用之前的输出到 stderr 而不是 stdout
  • electron 应用程序中特别有用,而console.trace() 并不总是有效。
【解决方案2】:

有一个函数:console.trace()

如果您不想登录到控制台,您可以使用new Error().stack 获取堆栈跟踪字符串值

【讨论】:

  • 我不知道这种方法存在..我会试试这个!
  • 是的,但是如果您需要喜欢.. iono.. 传递它,或者用它做些什么呢?控制台函数被称为“辅助”函数是有原因的——它们只是为了让你在特定情况下变得非常懒惰; )
  • 这听起来像是一个基于原始问题的大“假设”,但让我更新一下。
  • 根本不是什么大问题。我将我的错误消息报告给一个集中的日志存储。非常感谢您的更新!
【解决方案3】:

如果你使用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;
}

然后你会得到带有堆栈跟踪的 winston 记录器。也在a gist

【讨论】:

    【解决方案4】:

    查看callsite,它会抓取堆栈对象,因此您可以以任何您喜欢的方式使用它(并且作为对象,而不是字符串)。它非常棒,又好又简单。查看this 了解更多关于玩堆栈的信息

    已经有一些优秀的 Node.js 记录器,但我构建了一个记录器,它可以输出彩色、简单的输出和简短的堆栈跟踪。它不会覆盖我觉得很方便的console.log。有兴趣可以找here, node-logger

    【讨论】:

    • callsite 的实现与@Benja 的建议一致。
    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2021-02-07
    • 2013-11-16
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多