来自节点的堆栈跟踪有时会被截断。我怎样才能看到完整的错误?

Stack traces from node are sometimes truncated. How can I see the full error?

我有一条路线(故意)使我的节点应用程序崩溃。当我访问那条路线时,我得到了正确的崩溃日志:

/Users/me/Documents/myapp/routes/index.js:795
            global.fakeMethod();
                   ^

TypeError: global.fakeMethod is not a function
    at null._onTimeout (/Users/me/Documents/myapp/routes/index.js:795:11)
    at Timer.listOnTimeout (timers.js:92:15)

然而,当我在 systemd 下 运行 相同的代码时,错误是 t运行。它

May 17 10:03:56 a.myapp.com www[28766]: /var/www/myapp/routes/index.js:795
May 17 10:03:56 a.myapp.com systemd[1]: myapp.service: main process exited, code=exited, status=1/FAILURE
May 17 10:03:56 a.myapp.com systemd[1]: Unit myapp.service entered failed state.
May 17 10:03:56 a.myapp.com systemd[1]: myapp.service failed.
May 17 10:03:56 a.myapp.com systemd[1]: myapp.service holdoff time over, scheduling restart.

如何让 systemd / journald 记录完整的错误?

更新:使用 systemd-cat 进行测试,我制作了一个多行文件并记录了它的工作情况:

cat file.txt | systemd-cat

结果:

Mar 02 09:51:25 a.certsimple.com unknown[31600]: line one
Mar 02 09:51:25 a.certsimple.com unknown[31600]: line two
Mar 02 09:51:25 a.certsimple.com unknown[31600]: line three

我最好的选择是它与 stderr/stdout 在您的应用程序终止之前未被刷新有关。

有什么方法可以告诉您的应用程序使用同步系统日志协议打印堆栈跟踪,而不是在标准输出上打印。

这不是系统问题。这是一个[节点问题](https://github.com/nodejs/node/issues/6456 ): 节点的 process.exit() 总是尽快退出。 process.exitCode() 将刷新缓冲区。

查看节点 v6 的主要问题:https://github.com/nodejs/node/issues/6456

作为解决方法,我正在包装 process.exit():

var wrap = require('lodash.wrap');

var log = console.log.bind(console)

var RESTART_FLUSH_DELAY = 3 * 1000

process.exit = wrap(process.exit, function(originalFunction) {
    log('Waiting', RESTART_FLUSH_DELAY, 'for buffers to flush before restarting')
    setTimeout(originalFunction, RESTART_FLUSH_DELAY)
});

process.exit(1);