Логирование для TypeScript: библиотека Winston

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

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

Начать курс

Что такое Winston и зачем он нужен?

Winston — это мощная и гибкая библиотека для логирования в приложениях на TypeScript и JavaScript. Она позволяет записывать логи в различные места (консоль, файлы, базы данных) с разными уровнями важности. В отличие от простого console.log, Winston даёт полный контроль над форматом логов, их ротацией и фильтрацией.

Зачем использовать Winston? В больших проектах стандартный вывод консоли становится бесполезным: логи перемешиваются, теряются, их невозможно анализировать. Winston решает эти проблемы: вы можете настроить запись ошибок в отдельный файл, информационных сообщений — в консоль, а отладочные данные — в базу данных. Это критически важно для отладки, мониторинга и аудита.

Установка

Для установки Winston в проект на TypeScript выполните команду:

npm install winston

Также рекомендуется установить типы:

npm install --save-dev @types/winston

Если вы используете yarn:

yarn add winston

Основные функции

  • Уровни логирования: error, warn, info, http, verbose, debug, silly. Каждый уровень имеет приоритет, и вы можете настроить, какие уровни выводить в разных транспортах.
  • Транспорты: способы вывода логов. Встроенные: Console, File, Http, Stream. Можно создавать свои.
  • Форматы: настройка внешнего вида логов (JSON, timestamp, цветной вывод).
  • Ротация файлов: через дополнительный модуль winston-daily-rotate-file можно автоматически создавать новые файлы логов по дням или размеру.
  • Метаданные: передача дополнительного контекста (например, ID запроса, имя пользователя).

Пример кода на TypeScript

Создадим простой логгер с выводом в консоль и файл:

import winston from 'winston';

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize(),
        winston.format.simple()
      )
    }),
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

// Использование
logger.info('Сервер запущен на порту 3000');
logger.error('Ошибка подключения к базе данных', { database: 'main' });

В этом примере: информационные сообщения выводятся в консоль (цветные) и в файл combined.log, а ошибки — дополнительно в error.log. Формат логов — JSON с временной меткой.

Когда использовать Winston?

  • В production-среде для мониторинга ошибок.
  • В микросервисной архитектуре для сбора логов в централизованное хранилище.
  • При необходимости аудита действий пользователей.
  • В проектах, где требуется анализ логов с помощью ELK (Elasticsearch, Logstash, Kibana) или других систем.

Winston — индустриальный стандарт для логирования в TypeScript. Он прост в настройке, но при этом масштабируется под сложные требования.

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