Skip to content

日志输出

更新: 1/20/2025 字数: 0 字 时长: 0 分钟

概述

日志系统是应用程序中不可或缺的组成部分,它能帮助开发人员了解应用程序的运行状态、排查问题和监控系统性能。

本项目使用 Winston 作为日志框架,它是 Node.js 最流行的日志库之一,具有以下优势:

  • 支持多种传输方式(文件、控制台、HTTP等)
  • 支持自定义日志格式
  • 提供日志分割功能
  • 可扩展的插件系统
  • 高性能的异步日志写入

注:本项目内封装的Winston不会覆盖Nest的默认logger,仅在显式调用WinstonLoggerService时使用Winston

封装逻辑

src/common/logger目录下封装了Winston的日志服务逻辑,并将WinstonLoggerService导出为全局的提供者:

目录结构

src/common/logger/
├── logger.module.ts       # 日志模块定义
├── winston.config.ts      # Winston配置
└── winston.service.ts     # Winston服务实现

配置说明

winston.config.ts中定义了Winston的核心配置:

  1. 日志文件分类:

    • logs/request/%DATE%.log - 记录普通请求日志
    • logs/error/%DATE%.log - 记录错误日志
    • logs/other/%DATE%.log - 记录其他手动调用的输出日志(如info、warn、debug、verbose)
  2. 日志文件特性:

    • 按日期自动分割(每天一个文件)
    • 超过指定大小(20MB)自动分割
    • 自动压缩存档
    • 保留14天的日志文件
  3. 日志格式定制:

    • 包含时间戳
    • 日志级别
    • 消息内容
    • 额外元数据(JSON格式,2空格缩进)
  4. Loki支持(可选):

    • 通过环境配置开启/关闭
    • 支持将日志推送到Grafana Loki
    • 自动处理连接错误

    相关环境配置项(.env.development):

    bash
    # Loki日志配置
    LOKI_ENABLED=false    # 是否启用Loki日志推送
    LOKI_HOST=localhost:3100   # Loki服务器地址含端口
    LOKI_BASIC_AUTH=     # Loki认证信息 没有认证则留空

    TIP

    • 默认不启用Loki日志推送
    • 如需使用,请确保已正确部署Grafana Loki服务
    • 生产环境请修改为实际的Loki服务地址

服务实现

winston.service.ts实现了LoggerService接口,提供以下日志级别:

  • log() - 信息日志
  • error() - 错误日志
  • warn() - 警告日志
  • debug() - 调试日志
  • verbose() - 详细日志
  • request() - 请求日志

每个方法都支持传入额外的元数据。

默认调用

  • 在所有成功请求时,将会在拦截器中默认调用request(),日志存放在logs/request/%DATE%.log
  • 在所有错误请求或者发生内部错误时,将会默认调用error(),日志存放在logs/error/%DATE%.log

全局注册

logger.module.ts使用@Global()装饰器将日志服务注册为全局模块:

ts
@Global()
@Module({
  providers: [WinstonLoggerService],
  exports: [WinstonLoggerService],
})
export class LoggerModule {}

这样其他模块无需重复导入,直接注入即可使用。

TIP

  • 日志文件默认保存在项目根目录的logs文件夹下
  • 建议在.gitignore中添加logs目录
  • 生产环境部署时注意配置日志目录的读写权限

Released under the MIT License.