Логирование для TypeScript: лучшие решения
Логирование — критически важный компонент любого production-приложения. Для TypeScript-экосистемы существует множество библиотек, каждая из которых предлагает уникальный набор возможностей. В этой статье мы рассмотрим пять лучших решений: Winston, Pino, Bunyan, Log4js и TSLog. Вы узнаете их сильные стороны, особенности настройки и получите готовые примеры кода.
1. Winston — универсальный стандарт
Winston — самая популярная библиотека логирования для Node.js с полной поддержкой 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' })
]
});
logger.info('Приложение запущено', { service: 'user-service' });
logger.error('Ошибка подключения к БД', { error: err.message });
Преимущества:
- Гибкая система транспортов (файлы, консоль, HTTP, MongoDB, Elasticsearch)
- Встроенная поддержка ротации логов через winston-daily-rotate-file
- Отличная интеграция с TypeScript — полная типизация
- Совместимость с профилировщиками и APM-системами
2. Pino — сверхбыстрый логгер
Pino ориентирован на производительность — он в 5-10 раз быстрее Winston. Идеальный выбор для high-load систем и микросервисов.
import pino from 'pino';
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: {
target: 'pino-pretty',
options: { colorize: true }
}
});
logger.info({ user: { id: 123 } }, 'Пользователь авторизован');
Ключевые особенности:
- Минимальное потребление CPU и памяти
- Нативная поддержка Node.js streams
- Эффективная сериализация объектов
- Поддержка child-логгеров для контекстного логирования
3. Bunyan — структурированное логирование от Joyent
Bunyan создавался для работы с микросервисной архитектурой. Все логи выводятся в JSON-формате, что упрощает их парсинг и анализ.
import bunyan from 'bunyan';
const logger = bunyan.createLogger({
name: 'myapp',
level: 'info',
serializers: {
req: bunyan.stdSerializers.req,
err: bunyan.stdSerializers.err
}
});
logger.info({ req: request }, 'Входящий запрос');
Особенности:
- Встроенные сериализаторы для HTTP-запросов и ошибок
- Поддержка ringbuffer для хранения последних N записей
- Утилита bunyan CLI для форматированного вывода в консоль
- Простая интеграция с ELK-стеком
4. Log4js — знакомый подход из Java
Log4js — порт популярного Java-фреймворка Log4j. Предлагает знакомую конфигурацию через уровни и аппендеры.
import log4js from 'log4js';
log4js.configure({
appenders: {
out: { type: 'stdout' },
app: { type: 'file', filename: 'application.log' }
},
categories: {
default: { appenders: ['out', 'app'], level: 'debug' }
}
});
const logger = log4js.getLogger();
logger.debug('Отладка соединения');
logger.error('Критическая ошибка');
Сильные стороны:
- Гибкая система категорий и фильтров
- Поддержка множества аппендеров (файлы, базы данных, TCP)
- Возможность переопределения уровней для разных модулей
- Встроенная поддержка кластеризации
5. TSLog — легковесное решение для TypeScript
TSLog — минималистичная библиотека, написанная специально для TypeScript. Идеальна для небольших проектов и скриптов.
import { Logger, LogLevel } from 'tslog';
const logger = new Logger({
name: 'MyApp',
minLevel: LogLevel.Debug,
displayFunctionName: false,
displayFilePath: 'hidden'
});
logger.debug('Отладочное сообщение');
logger.warn('Предупреждение');
Преимущества:
- Полная поддержка TypeScript из коробки
- Работает и на Node.js, и в браузере
Также в библиотеке
Миграции баз данных в Rust: обзор инструментов Diesel, SeaORM и sqlx
Swift Data для Swift: полное руководство с примерами
Elasticsearch .NET для C# (.NET): полное руководство с примерами
Работа с ZIP/архивами в Kotlin: создание, чтение и распаковка