Следы стека от узла иногда усекаются. Как я могу увидеть полную ошибку?

У меня есть маршрут, который (умышленно) приводит к сбою моего приложения узла. Когда я посещаю этот маршрут, я получаю правильный журнал аварии:

/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

2 ответа

Решение

Это не системная проблема. Это [проблема узла] ( 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);

Лучше всего, это связано с тем, что stderr/stdout не очищается до завершения работы вашего приложения.

Есть ли какой-нибудь способ сказать вашему приложению печатать трассировку стека по протоколу синхронного системного журнала вместо печати на stdout.

Другие вопросы по тегам