Логирование в TypeScript: лучшие библиотеки и инструменты в 2024

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

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

Начать курс

Логирование для 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, и в браузере

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