Правильно ли регистрировать ошибки с помощью nodejs bunyan?

Я прочитал статью об отладке Джойента, и они порекомендовали нам использовать bunyan.

Они говорят о том, что качество информации журнала очень важно и может помочь в решении ошибок, когда они возникают. Кроме того, существуют внешние сайты блогов, которые показывают, как установить и запустить bunyan в своем приложении Nodejs, что приятно.

Но я новичок и в неведении относительно того, как эффективно использовать ведение логов (как для буньян, так и для практики логов в целом). У меня есть три вопроса, которые связаны друг с другом.

(1) Должен ли я использовать bunyan для регистрации каждого действия, которое происходит в моем приложении?

т.е.

router.post('/submit', function(req, res) {
    log.info({ req:req }, req.user.name + ' has called /submit');

    saveData(req)
    .then(function(data) {
        log.info({data: data}, req.user.name + ' has saved to DB successfully in /submit');
        res.json({'success': 'Saved!'});
    })
    .error(function(err) {
        log.error({ err: err }, req.user.name + ' has caused an error in /submit ');
        res.status(500).json("error": err});
    }); 
});

... и так везде в моем приложении?

(2) Если так, то не получу ли я вывод журнала в разрозненных частях? Например, если у нас есть 3 одновременных пользователя, звонящих /submitтогда сообщения могут быть:

Alice has called /submit
Bob has called /submit
Alice has caused an error in /submit
Carol has called /submit
Bob has saved to DB successfully in /submit
Carol has saved to DB successfully in /submit

Это правильно? Если у меня есть трассировка стека для Bob и я пытаюсь получить предварительное знание о состоянии системы до того, как программа прервалась, мне нужно каким-то образом отфильтровать всех остальных и отсортировать по отметке времени, чтобы получить согласованный порядок событий для Bob?

(3) я должен использовать bunyan для регистрации стековых трасс? т.е. добавление err.stack к бунянскому логгеру:

.error(function(err) {
    log.error({ err: err, stacktrace: err.stack }, req.user.name + ' has caused an error in /submit ');
    res.status(500).json("error": err});
});

... Или есть какой-то другой стандартный метод регистрации и сообщения об ошибках (что в основном означает сохранение стековых трасс?)?

1 ответ

Решение

(1) Должен ли я использовать bunyan для регистрации каждого действия, которое происходит в моем приложении?

Да в принципе. В этом есть некоторые тонкости, но в основном вы хотите добиться хорошего соотношения сигнал / шум, сохраняя при этом разумную вероятность успешной посмертной отладки. Записывайте слишком много о путях кода, которые никогда не заканчиваются ошибкой, и вы тонете в шуме. Не регистрируйте достаточно, и вы можете быть буквально не понимая, что вызвало проблему. Не беспокойся об этом слишком сильно. Это чувство, которое вы приобретаете только с опытом, и это достаточно легко увидеть из анализа журнала, где вы генерируете шум и можете смягчить или отфильтровать его по факту, и когда у вас есть большой набор сложного кода, выполняемого без регистрации деталей и Вы должны добавить больше регистрации там.

(2) Если так, то не получу ли я вывод журнала в разрозненных частях?

Да, но это нормально. Вы используете инструменты постобработки, чтобы соединить их в более последовательный рассказ. Общие методы, включая регистрацию как уникального идентификатора запроса для каждого запроса, так и идентификатора сеанса. Таким образом, вы можете отфильтровать сеанс одного пользователя или только один интересный запрос.

(3) я должен использовать bunyan для регистрации стековых трасс?

Да, но bunyan включает в себя стандартные сериализаторы для экземпляров Error, поэтому просто назовите свойство err и включите стандартные сериализаторы, и вы получите сообщение об ошибке и трассировку стека, правильно записанную в журнал.

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