Правильно ли регистрировать ошибки с помощью 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
и включите стандартные сериализаторы, и вы получите сообщение об ошибке и трассировку стека, правильно записанную в журнал.