Логирование для JavaScript (Node.js): лучшие решения
Логирование — это основа мониторинга и отладки любого веб-приложения. В мире Node.js существует несколько зрелых и популярных библиотек, которые позволяют гибко настраивать сбор, форматирование и хранение логов. В этой статье мы рассмотрим четыре лучших решения: Winston, Pino, Bunyan и Morgan. Вы узнаете их особенности, сильные стороны и получите практические примеры использования.
Зачем нужно логирование в Node.js?
В отличие от браузерного JavaScript, серверное приложение работает без прямого доступа к консоли разработчика. Логи позволяют:
- Отслеживать ошибки и исключения в реальном времени.
- Анализировать производительность (время ответа, запросы).
- Фиксировать события аудита (вход пользователя, изменение данных).
- Интегрироваться с внешними системами мониторинга (ELK, Datadog, Splunk).
1. Winston — универсальный стандарт
Winston — самая популярная библиотека логирования для Node.js. Её главное преимущество — транспорты (куда писать логи) и форматы (как их представлять).
Установка:
npm install winston
Пример базовой настройки:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('Сервер запущен на порту 3000');
logger.error('Ошибка подключения к БД', { db: 'main' });
Ключевые возможности:
- Поддержка нескольких транспортов (консоль, файл, HTTP, MongoDB, Elasticsearch).
- Кастомные форматы (JSON, простой текст, с метками времени).
- Фильтрация по уровню (error, warn, info, verbose, debug, silly).
- Создание дочерних логгеров для разных модулей.
Когда выбирать: для сложных проектов, где требуется гибкая маршрутизация логов и интеграция с внешними сервисами.
2. Pino — сверхбыстрый логгер
Pino создан для максимальной производительности. Он в 5-10 раз быстрее Winston благодаря использованию структурированного JSON и минимизации накладных расходов.
Установка:
npm install pino
Пример использования:
const pino = require('pino');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty', // для красивого вывода в консоль
options: { colorize: true }
}
});
logger.info({ user: 42 }, 'Пользователь вошёл в систему');
logger.error(new Error('Не удалось загрузить файл'));
Особенности:
- Минимальное потребление CPU и памяти.
- Встроенная поддержка
pino-prettyдля разработки. - Работа с потоками (streams) для интеграции с другими инструментами.
- Автоматическое сериализация объектов без потери производительности.
Когда выбирать: для высоконагруженных приложений (API, микросервисы), где каждый миллисекунда на счету.
3. Bunyan — структурированные логи от создателей Joyent
Bunyan от компании Joyent (создателей Node.js) фокусируется на строгой структуре логов. Каждое сообщение — это JSON-объект с обязательными полями (hostname, pid, time).
Установка:
npm install bunyan
Пример:
const bunyan = require('bunyan');
const logger = bunyan.createLogger({
name: 'myapp',
streams: [
{ level: 'info', stream: process.stdout },
{ level: 'error', path: 'error.log' }
]
});
logger.info('Запрос обработан', { method: 'GET', url: '/api/users' });
logger.warn({ cpu: 85 }, 'Высокая нагрузка на процессор');
Сильные стороны:
- Обязательная структура — все логи легко парсятся машинами.
- Встроенный CLI-инструмент
bunyanдля форматирования логов в реальном времени. - Поддержка кольцевых буферов для сбора последних событий.
Когда выбирать: для проектов, где важна строгая типизация логов и их