{T}

NestJS 日志模块概述

核心知识点

1. 日志等级(Log Levels)

日志工具类内部集成了标准化的日志等级方法,名称通常为小写,与以下等级名称对应。了解等级划分是使用任何日志库的基础。

等级方法名说明严重程度
通用日志log()常规信息输出
警告日志warn()潜在问题提示,不影响运行中低
错误日志error()严重错误,需立即关注
调试日志debug()开发调试阶段使用
详细日志verbose()最详细的操作信息最低

各等级详细说明

① log — 通用日志

  • 常规信息的输出,如应用启动信息、模块加载状态等
typescript
// 示例:应用启动日志
console.log('Application is running on: http://localhost:3000');

② warn — 警告日志

  • 提示潜在风险,不影响程序运行,但需要关注
typescript
// 示例:npm 安装时的版本警告
console.warn('Warning: package "lodash" is deprecated, consider using "lodash-es"');
// 提示:包已废弃,建议更新

③ error — 错误日志

  • 严重错误,必须立即处理
typescript
// 示例:数据库连接异常
console.error('Error: Failed to connect to database - ECONNREFUSED');
// 示例:资源访问异常
console.error('Error: Cannot read file "/etc/config.json" - ENOENT');

④ debug — 调试日志

  • 开发调试时使用,定位问题
typescript
// 示例:数据库加载调试
console.debug('Loading database configuration...');
console.debug('Query executed: SELECT * FROM users WHERE id = 1');

⑤ verbose — 详细日志

  • 最详细的操作信息,记录所有细节
typescript
// 示例:每一步操作的详细记录
console.verbose('Step 1: Validating request parameters...');
console.verbose('Step 2: Connecting to database...');
console.verbose('Step 3: Executing query...');
console.verbose('Step 4: Mapping results...');
console.verbose('Step 5: Sending response...');

verbose 的使用原则:非必要不开启。通过 log、error、debug 三个等级基本就能定位问题,无需把所有操作都打印出来。


2. 日志功能分类

按照功能和用途,日志可分为三大类:

2.1 错误日志

特性说明
目的快速定位问题 + 给用户友好的提示
记录内容异常堆栈、错误码、请求上下文
典型场景数据库连接失败、接口调用异常、文件读写错误
目标读者开发者 + 运维人员

2.2 调试日志

特性说明
目的开发阶段辅助调试
记录内容变量值、执行流程、中间状态
典型场景追踪代码执行路径、验证业务逻辑
目标读者开发者(仅开发阶段使用)

2.3 请求日志

特性说明
目的记录敏感操作,便于回溯和追踪
记录内容接口请求参数、响应结果、操作人、操作时间
典型场景删除操作、金融交易、权限变更
目标读者开发者 + 运维人员 + 审计人员

金融/安全领域:几乎所有用户行为都需要记录日志,便于审计和问题回溯。


3. 日志记录位置

3.1 三种记录位置

位置说明适用阶段优缺点
控制台(Console)在终端/命令行输出开发阶段实时查看 不持久化,滚动后丢失
文件(File)写入本地日志文件生产阶段可回溯、可检索 非常安全级别
数据库(Database)写入数据库表生产阶段最安全、可查询分析 性能开销

3.2 各位置适用场景

code
Console(控制台)
├── 开发阶段:实时监控程序运行状态
├── 调试阶段:快速查看变量和流程
└──  生产阶段:进程后台运行,无法实时监控

File(文件)
├── 生产阶段:持久化记录,便于回溯
├── 错误追踪:保存异常堆栈
└──  不适合:高度敏感数据(文件可能被泄露)

Database(数据库)
├── 敏感操作:删除、更新、金融交易
├── 用户行为审计:操作人、时间、内容
└── 便于查询分析和统计

4. NestJS 日志记录推荐规范

4.1 日志等级 × 环境场景矩阵

日志等级开发(Development)测试(Testing/Staging)生产(Production)
log 通用日志
error 错误日志
warn 警告日志
debug 调试日志
verbose 详细日志
API 接口日志

说明

  • 开发阶段:打印所有等级日志,便于调试
  • 测试阶段:关闭 debug 和 verbose,关注功能是否正常
  • 生产阶段:只保留 log、error、warn 和 API 日志,减少性能开销

4.2 日志等级 × 记录位置矩阵

日志等级Console(控制台)File(文件)Database(数据库)
log 通用日志
error 错误日志
warn 警告日志
debug 调试日志
verbose 详细日志
API 接口日志

说明

  • error:必须持久化到文件或数据库,控制台一滚即逝
  • API 日志:记录到数据库,便于查询统计;极少记录到文件(通常由 Nginx 等反向代理统一记录 access log)
  • log:仅控制台输出即可
  • verbose:仅控制台,且生产环境一般不开启

4.3 关于 API 日志的补充说明

API 请求日志通常不放在 NestJS 中记录,而是由外部基础设施统一处理:

code
Nginx(反向代理)
├── access.log    → 记录所有 HTTP 请求
├── error.log     → 记录错误请求
└── 应用无需关心请求日志的文件记录

NestJS(应用层)
├── 仅关注业务逻辑日志
└── 敏感 API 操作可选择性记录到数据库

Nginx 的日志分类非常清晰(access log / error log / app log),不建议在 NestJS 中重复实现。


学习要点总结

  1. 日志等级从低到高verbosedebuglogwarnerror,了解每个等级的适用场景
  2. 日志功能三大类:错误日志(定位问题)、调试日志(开发辅助)、请求日志(行为审计)
  3. 日志三个记录位置:Console(开发实时)→ File(生产回溯)→ Database(敏感数据安全存储)
  4. 不同环境不同策略:开发阶段全开、测试阶段关闭 debug/verbose、生产阶段只保留核心日志
  5. API 日志交给基础设施:Nginx 等反向代理统一记录 access log,NestJS 无需重复实现

延伸学习资源

后续课程预告

  • NestJS 内置 Logger:框架自带的日志模块使用方法
  • Winston 日志库:功能强大的第三方日志库集成
  • 日志文件轮转:使用文件分割策略管理日志文件大小

日志管理最佳实践

code
开发环境:所有等级 → Console
测试环境:log/warn/error → Console + File
生产环境:log/warn → Console
          error → File + Database
          API → Database
          debug/verbose → 关闭

推荐工具

  • Nginx:统一管理 access log 和 error log
  • ELK Stack(Elasticsearch + Logstash + Kibana):日志收集、存储、可视化分析
  • PM2:进程管理 + 内置日志管理功能