Логирование для JavaScript (Node.js): лучшие решения

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для 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 для форматирования логов в реальном времени.
  • Поддержка кольцевых буферов для сбора последних событий.

Когда выбирать: для проектов, где важна строгая типизация логов и их

Рекомендаций