Логгирование в Node.js

Пару слов о себе

  • Программировал на C-Php-Go-Node.js
  • Бекенд программист, придерживаюсь идеи микросервисов
  • До сих пор ищу серебряной пули логирования

План

  • Погружение в контекст
  • Основные тактики
  • Мой пример
  • Вопросы, вопросы, вопросы

Определение

Логгирование - процесс записи

о работе программы с целью отладки

специальной информации

Программа

Сборщик

информации

Хранилище

Процесс логирования

Код

Событие

Событие

Запись

Microservice

Процесс логирования

Frontend

Mobile

Microservice

Microservice

Logging

Syslog-ng

Logstash

Elastic

Цель

2 цели логгирования

Library

Monitoring

Какие цели бывают

  • Более полная информация при багах
  • Trace информация в качестве отладки
  • A/B тестирование
  • Измерение производительности
  • Юридическое использование

Стратегия логгирования

Comprehensive strategy

  • Логгируем в каждой функции вход
  • Логгируем выход
  • Каждый catch логгируется
  • Логгируем ендпоинт (вход и выход)
  • Логгируем действие (вход и выход)

Retrospective strategy

  • Не логгируем ничего
  • При ошибках вставляем лишь необходимое для расследования

Business strategy

  • Выводим логи из требований
  • Логгируем лишь, то что имеет отношения к требованиям
  • Логгируем каждый шаг в требованиях

Communication strategy

  • Логгируем только каждый внешний вызов

Testing strategy

  • Логгируем только то, с чем взаимодействуют интеграционные тесты
  • Тесты = логи

Формат логов

Что логгировать

  • Весь контекст 
  • Все входные и выходные данные
  • Данные производительности
  • Все значимые шаги пользователя
  • Каждую строчку кода

Что не логгировать

  • Данные пользователя
  • Данные по безопасности системы
  • Мусор

Параметры логгирования

Параметры

Время обновления

Программа

Информация

Time

Парсинг

Запись

Формирование

Параметры

Производительность

Программа

Запись в лог

Параметры

Объем кодовой базы

Параметры

Объем информации

Параметры

Читабельность

Время обновления

Производительность

Объем записи в логе

Читабельность

Объем кодовой базы

Инструменты

Логгирование в коде

  • console.log (time, info)
  • pino
  • winston
  • morgan
  • bunyan
  • log4js
  • intel
  • roarr

Пример

Минусы

  • Возрастание объема кода
  • Необходимость актуализации логгирования
  • Поддержка

 

- быстрый (streams + benchmarks) 201 мс

- легкий (minified - 6 кб)

- Расширяемый

- JSON формат по умолчанию

pino-hapi

pino-express

pino-pretty

pino-react

pino-vue

Расширения

Пример

Пример

Недостатки

  • Менее популярный
  • JSON нативный
  • только logger

Winston

  • Больше pino (minified = 136 кб)
  • Менее скоростной (300 мс)
  • Более известный
  • Человеко читаемый лог

Morgan

Winston

Расширения

Пример

Пример

Недостатки winston

  • Нет дефолного форматтера
  • Более тяжелый
  • Менее быстро развивается
  • Использование на фронтенде
  • 26 $/mo или 10K errors per month
  • Ограниченный контекст сохранения информации
  • Агрегация событий
  • Open source

Пример

Вывод информации

Фронтенд

Title Text

  • 5000 ev/mo - 49 $/mo
  • Более точная, чем Sentry информация о вспомогательных библиотеках
  • Ловит uncaptured Event из коробки
  • Интерфейс более простой

Наш пример

Как пытаемся настроить мы

Frontend

Backend

ELK

Pino

Sentry

Kibana

Pretty-pino

Система

  • Sentry для events и errors
  • Pino работает только у определенных пользователей и по запросы
  • В информацию обязательно сохраняются last_snapshot_id,  request_id, process_id, microservice information

Информация

  • ID процесса
  • ID сервиса
  • Номер коммита
  • Название функции

Информация

  • Конкретное время 
  • Идентификатор запроса/начального действия
  • Уровень вложенности относительно начала
  • ID записи

Информация

  • Инициатор запроса (действия)
  • Основной инициатор
  • Функциональное описание
  • Контекст в этом месте

Советы

  • Выберите цель
  • Выработайте стратегию
  • Выработайте формат
  • Проведите эксперимент по параметрам
  • Настройте линтер

Время обновления

Производительность

Объем записи в логе

Читабельность

Объем кодовой базы

Q&A

Books?

  • Logging and Log Management: The Authoritative Guide to Understanding the Concepts Surrounding Logging and Log Management 1st Edition
  • Google style guides,  IBM style guides
  • Logging in Java with the JDK 1.4 Logging API and Apache log4j 1st Edition

Вопросы без ответа

  • Как быстро находить информацию в логах 
  • Как не перегрузить перфоманс 
  • Как не перегрузить код
  • Как понимать контекст
  • Как добиться актуализации

Вопросы без ответа

  • Стоимость  (компромисс в чью сторону)
  • Как разделить dev и prod по поводу логгирования
  • Как проверять код на чистоту логов автоматически
  • Как собирать логи с фронта
  • Как связать логи фронта и бека

Вопросы без ответа

  • Как найти информацию
  • Как не перегрузить перфоманс
  • Как не перегрузить код
  • Как добиться актуализации

Логгирование в Node.js

By cloudkserg

Логгирование в Node.js

  • 74