Логирование для TypeScript: лучшие решения
Логирование — это один из ключевых аспектов разработки любого серьезного приложения на TypeScript. Правильно настроенная система логирования позволяет отслеживать ошибки, анализировать поведение пользователей, проводить аудит безопасности и отлаживать сложные сценарии. В этой статье мы рассмотрим лучшие библиотеки для логирования в TypeScript, их особенности, преимущества и примеры использования.
Почему логирование важно для TypeScript-проектов?
TypeScript, будучи надстройкой над JavaScript, наследует все его особенности, включая асинхронность и событийно-ориентированную модель. Это делает отладку и мониторинг сложных приложений нетривиальной задачей. Качественное логирование помогает:
- Быстро находить и исправлять баги в production-среде
- Отслеживать последовательность выполнения асинхронных операций
- Собирать метрики производительности
- Обеспечивать соответствие требованиям безопасности (логи аудита)
- Анализировать ошибки в интеграциях с внешними сервисами
Топ библиотек для логирования в TypeScript
1. Winston
Winston — самая популярная библиотека для логирования в экосистеме Node.js и TypeScript. Она предоставляет гибкую архитектуру с поддержкой множества транспортов (вывод в консоль, файл, базу данных, внешние сервисы).
Основные возможности:
- Поддержка различных уровней логирования (error, warn, info, verbose, debug, silly)
- Кастомизация форматов вывода (JSON, простой текст, с метками времени)
- Множество транспортов "из коробки" (Console, File, HTTP, MongoDB, Elasticsearch)
- Возможность создания собственных транспортов
- Полная поддержка 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(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('Приложение запущено');
logger.error('Ошибка подключения к БД', { database: 'users' });
2. Pino
Pino — это сверхбыстрый логгер, который позиционируется как самый производительный среди аналогов для Node.js. Он идеально подходит для высоконагруженных проектов, где производительность критична.
Ключевые особенности:
- Очень высокая скорость работы (до 5 раз быстрее Winston)
- Минимальное потребление памяти
- Нативный вывод в JSON для интеграции с системами сбора логов (ELK, Datadog)
- Встроенная поддержка рабочих процессов (child loggers)
- Экосистема плагинов (pino-pretty для читаемого вывода в разработке)
import pino from 'pino';
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: {
target: 'pino-pretty',
options: { colorize: true }
}
});
const childLogger = logger.child({ module: 'auth' });
childLogger.info('Пользователь авторизован', { userId: 12345 });
3. Bunyan
Bunyan — это проверенный временем логгер от компании Joyent. Он славится своей простотой и надежностью. Библиотека генерирует структурированные JSON-логи, которые легко парсить и анализировать.
Преимущества Bunyan:
- Простой и интуитивно понятный API
- Встроенная поддержка сериализаторов для безопасного логирования объектов
- Утилита bunyan для красивого отображения логов в консоли
- Отличная документация и стабильность
import bunyan from 'bunyan';
const logger = bunyan.createLogger({
name: 'myapp',
level: 'debug',
serializers: {
req: bunyan.stdSerializers.req,
err: bunyan.stdSerializers.err
}
});
logger.info({ user: 'admin' }, 'Вход в систему выполнен');
logger.error({ err: new Error('Connection failed') }, 'Ошибка сети');
4. log4js
log4js — это порт популярного Java-фреймворка log4j на JavaScript/TypeScript. Он предоставляет знакомую многим разработчикам конфигурацию через файлы или объекты.
Что предлагает log4js:
- Поддержка категорий (loggers) для разных моду