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 中重复实现。
学习要点总结
- 日志等级从低到高:
verbose→debug→log→warn→error,了解每个等级的适用场景 - 日志功能三大类:错误日志(定位问题)、调试日志(开发辅助)、请求日志(行为审计)
- 日志三个记录位置:Console(开发实时)→ File(生产回溯)→ Database(敏感数据安全存储)
- 不同环境不同策略:开发阶段全开、测试阶段关闭 debug/verbose、生产阶段只保留核心日志
- 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:进程管理 + 内置日志管理功能