Что такое winston и зачем он нужен?
Winston — это самая популярная библиотека для логирования в среде Node.js. Она предоставляет простой, универсальный API, который позволяет записывать логи с различными уровнями важности, форматировать их и отправлять в разные места (консоль, файлы, базы данных, внешние сервисы). В отличие от простого console.log, winston даёт полный контроль над логированием: вы можете настроить ротацию логов по размеру или дате, фильтровать сообщения по уровню (info, warn, error, debug), добавлять метаданные (время, идентификатор запроса) и даже использовать несколько транспортов одновременно. Это незаменимый инструмент для мониторинга, отладки и аудита в production-приложениях.
Установка
Установите winston через npm или yarn:
npm install winston
# или
yarn add winstonОсновные функции
- Уровни логирования: error, warn, info, http, verbose, debug, silly.
- Транспорты: Console, File, HTTP, Stream и кастомные.
- Форматы: JSON, простой текст, метки времени, цветной вывод.
- Комбинирование нескольких транспортов: например, ошибки в файл, а info — в консоль.
- Кастомные транспорты и форматы: можно интегрировать с Logstash, Sentry, Papertrail и другими.
- Ротация логов: через дополнительный модуль winston-daily-rotate-file.
- Исключения и unhandled rejection: автоматический перехват необработанных ошибок.
Пример кода на JavaScript (Node.js)
const winston = require('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.warn('Недостаточно памяти', { memoryUsage: process.memoryUsage() });
try {
throw new Error('Что-то сломалось');
} catch (err) {
logger.error('Ошибка при обработке запроса', { error: err.message, stack: err.stack });
}Когда использовать
Winston идеален для любых Node.js проектов, где требуется структурированное логирование: веб-серверы (Express, Koa), микросервисы, CLI утилиты, боты, ETL-процессы. Он особенно полезен в production-среде, где нужно централизованно собирать логи, анализировать ошибки и быстро находить проблемы. Если ваш проект использует TypeScript, winston имеет полную поддержку типов.
Альтернативы: pino (быстрее, меньше), log4js (конфигурация через XML/JSON), bunyan (JSON-логи). Но winston остаётся самым гибким и распространённым решением.