Логирование для TypeScript: лучшие решения и инструменты
Логирование — критически важная часть любого приложения на TypeScript. Без качественной системы логирования невозможно эффективно отлаживать код, анализировать ошибки в production и отслеживать поведение системы. В этой статье мы рассмотрим лучшие библиотеки для логирования в TypeScript, сравним их возможности и приведем практические примеры использования.
Зачем нужно логирование в TypeScript?
TypeScript, будучи надстройкой над JavaScript, наследует все особенности работы с асинхронностью и событийной моделью. Это делает логирование особенно важным для:
- Отладки — понимание последовательности выполнения асинхронных операций
- Мониторинга — отслеживание состояния приложения в реальном времени
- Анализа ошибок — детальная информация о сбоях и исключениях
- Аудита — запись действий пользователей и системных событий
- Производительности — измерение времени выполнения критических операций
Топ-4 библиотеки для логирования в TypeScript
1. Winston — универсальный выбор
Winston — самая популярная библиотека для логирования в Node.js с отличной поддержкой TypeScript. Она предоставляет гибкую систему транспортов (куда отправлять логи) и уровней логирования.
Установка:
npm install winston
npm install @types/winston --save-dev
Пример базовой настройки:
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' })
]
});
// Использование с TypeScript
logger.info('Сервер запущен', { port: 3000 });
logger.error('Ошибка подключения к БД', { error: err.message });
2. Pino — сверхбыстрый логгер
Pino — самый производительный логгер для Node.js. Он оптимизирован для минимального влияния на производительность приложения и идеально подходит для high-load систем.
Установка:
npm install pino
npm install @types/pino --save-dev
Пример использования с TypeScript:
import pino from 'pino';
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard'
}
}
});
// Типизированное логирование
interface UserAction {
userId: string;
action: string;
timestamp: Date;
}
logger.info({ type: 'user_action', data: { userId: '123', action: 'login' } } as UserAction);
3. log4js — мощный и конфигурируемый
log4js — наследник популярного Java-фреймворка Log4j. Предлагает богатую систему конфигурации и поддержку различных форматов вывода.
Установка:
npm install log4js
npm install @types/log4js --save-dev
Пример настройки с TypeScript:
import log4js from 'log4js';
log4js.configure({
appenders: {
out: { type: 'stdout', layout: { type: 'colored' } },
app: { type: 'file', filename: 'application.log' }
},
categories: {
default: { appenders: ['out', 'app'], level: 'debug' },
'api': { appenders: ['out'], level: 'info' }
}
});
const logger = log4js.getLogger('api');
logger.info('API запрос обработан');
logger.debug('Параметры запроса:', { method: 'GET', url: '/users' });
4. Bunyan — простота и мощь
Bunyan — легковесный логгер с фокусом на JSON-формат и простоту использования. Отлично подходит для микросервисной архитектуры.
Установка:
npm install bunyan
npm install @types/bunyan --save-dev
Пример использования:
import bunyan from 'bunyan';
const logger = bunyan.createLogger({
name: 'myapp',
level: 'info',
serializers: {
req: bunyan.stdSerializers.req,
err: bunyan.stdSerializers.err
}
});
// Типизированные логи
interface LogData {
userId: string;
operation: string;
duration: number;
}
logger.info({ userId: '456', operation: 'payment', duration: 120 } as LogData);