TypeScript 日志记录:最佳解决方案
日志记录是任何生产级应用程序的关键组件。对于 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 专注于性能 — 比 Winston 快 5-10 倍。是高负载系统和微服务的理想选择。
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
- 高效的对象序列化
- 支持子日志记录器进行上下文日志记录
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 编写。非常适合小型项目