我有一条路线(故意)崩溃我的节点应用程序。当我访问该路线时,我得到了一个正确的崩溃日志:
/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 / 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
答案 0 :(得分:1)
我最好的选择是,在应用程序终止之前,stderr / stdout没有被刷新。
有没有办法告诉你的应用程序使用同步syslog协议打印堆栈跟踪,而不是在stdout上打印。
答案 1 :(得分:0)
这不是系统问题。它是[节点问题](https://github.com/nodejs/node/issues/6456
):节点process.exit()
将始终尽快退出。 process.exitCode()
将刷新缓冲区。
请参阅https://github.com/nodejs/node/issues/6456
的节点v6的主要问题作为解决方法,我正在包裹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);