Логирование в TypeScript: обзор лучших библиотек и решений 2024

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для 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);

Сравнение библиотек логирования

Б

Рекомендаций