2016-03-01 25 views
1

我有(故意)崩溃我的节点应用程序的路线。当我访问这条路线,我得到崩溃的正确日志:来自节点的堆栈跟踪有时会被截断。我怎样才能看到完整的错误?

/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 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

如果你尝试倾倒大量的文字变成'logger'会发生什么? '回声<很多文字> |记录器“ - 它会被截断或分解吗? – vcsjones

+0

记录器输出不应被截断,因为它使用同步系统日志协议将数据发送到记录。 – Umut

+0

@vcsjones优秀的问题!我已经添加了systemd-cat(比如logger,但是systemd)在上面发生的细节。使用systemd-cat不会截断。 – mikemaccana

回答

0

这不是系统问题。这是[节点问题](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); 
1

我最好的选择是有东西在应用程序终止之前不要刷新stderr/stdout。

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