Логгирование в 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