Что такое 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. Он прост в настройке, но при этом масштабируется под сложные требования.