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

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

/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下运行相同的代码时,错误被截断。 它

 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 / journaldlogin完整的错误?

更新 :与systemd-cattesting,我做了一个多行文件,并logging它的工作原理:

 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 

我最好的select是在应用程序终止之前,stderr / stdout不会被刷新。

有没有什么办法可以告诉你的应用程序使用同步syslog协议来打印堆栈跟踪,而不是在stdout上打印。

这不是一个系统问题 。 这是一个[节点问题]( https://github.com/nodejs/node/issues/6456 ):节点的process.exit()将始终退出ASAP。 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);