@lark-apaas/nestjs-logger 0.1.0-alpha.1 → 0.1.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -0
- package/dist/index.cjs +197 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +197 -103
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/LICENSE +0 -13
package/README.md
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# NestJS Logger
|
|
2
|
+
|
|
3
|
+
基于 Pino 的高性能 NestJS 日志库,支持请求追踪和结构化日志。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 基于 Pino 的高性能日志记录
|
|
8
|
+
- 自动 HTTP 请求追踪(双层日志:info 链路日志 + verbose 详细日志)
|
|
9
|
+
- 请求和响应体日志记录(可配置)
|
|
10
|
+
- 支持多日志级别
|
|
11
|
+
- 独立的 trace 日志文件
|
|
12
|
+
- 请求上下文传递
|
|
13
|
+
- 日志体长度截断
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @lark-apaas/nestjs-logger
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 基本使用
|
|
22
|
+
|
|
23
|
+
### 1. 导入模块
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { Module } from '@nestjs/common';
|
|
27
|
+
import { LoggerModule } from '@lark-apaas/nestjs-logger';
|
|
28
|
+
|
|
29
|
+
@Module({
|
|
30
|
+
imports: [LoggerModule],
|
|
31
|
+
})
|
|
32
|
+
export class AppModule {}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. 使用 Logger
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { Injectable, Logger } from '@nestjs/common';
|
|
39
|
+
|
|
40
|
+
@Injectable()
|
|
41
|
+
export class MyService {
|
|
42
|
+
private readonly logger = new Logger(MyService.name);
|
|
43
|
+
|
|
44
|
+
doSomething() {
|
|
45
|
+
this.logger.log('This is an info log');
|
|
46
|
+
this.logger.debug('This is a debug log');
|
|
47
|
+
this.logger.warn('This is a warning');
|
|
48
|
+
this.logger.error('This is an error', error.stack);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 环境变量配置
|
|
54
|
+
|
|
55
|
+
### 基础配置
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 日志级别: trace, debug, info, warn, error, fatal, silent
|
|
59
|
+
# 注意:HTTP 请求追踪日志使用 verbose 级别(对应 Pino 的 trace)
|
|
60
|
+
# 生产环境默认为 info,不会打印 verbose 级别的日志
|
|
61
|
+
LOGGER_LEVEL=info
|
|
62
|
+
|
|
63
|
+
# 日志目录
|
|
64
|
+
LOG_DIR=logs
|
|
65
|
+
|
|
66
|
+
# Node 环境(默认:开发环境使用 debug,生产环境使用 info)
|
|
67
|
+
NODE_ENV=production
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 请求/响应体日志配置
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# 启用请求体日志(默认:false)
|
|
74
|
+
LOG_REQUEST_BODY=true
|
|
75
|
+
|
|
76
|
+
# 启用响应体日志(默认:false)
|
|
77
|
+
LOG_RESPONSE_BODY=true
|
|
78
|
+
|
|
79
|
+
# 注意:即使启用了请求/响应体日志,也需要将日志级别设置为 verbose 才能实际输出
|
|
80
|
+
# 因为 HTTP 请求追踪日志使用的是 verbose 级别
|
|
81
|
+
LOGGER_LEVEL=verbose
|
|
82
|
+
|
|
83
|
+
# 日志体最大长度,超过会截断(默认:不限制)
|
|
84
|
+
# 不设置此环境变量时,不会进行截断
|
|
85
|
+
LOG_MAX_BODY_LENGTH=10000
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 请求/响应体日志
|
|
89
|
+
|
|
90
|
+
### 日志级别说明
|
|
91
|
+
|
|
92
|
+
HTTP 请求追踪日志使用 **`verbose` 级别**(对应 Pino 的 `trace` 级别),这意味着:
|
|
93
|
+
|
|
94
|
+
- **生产环境默认不打印**:生产环境默认日志级别为 `info`,不会输出 verbose 级别的日志
|
|
95
|
+
- **需要显式启用**:要查看 HTTP 请求追踪日志,需要将 `LOGGER_LEVEL` 设置为 `verbose`
|
|
96
|
+
- **细粒度控制**:可以通过日志级别控制是否打印请求追踪,而无需修改 `LOG_REQUEST_BODY` 和 `LOG_RESPONSE_BODY` 配置
|
|
97
|
+
|
|
98
|
+
### 启用方式
|
|
99
|
+
|
|
100
|
+
通过环境变量启用:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 方式一:仅启用 HTTP 请求追踪(不包含 body)
|
|
104
|
+
LOGGER_LEVEL=verbose
|
|
105
|
+
|
|
106
|
+
# 方式二:启用 HTTP 请求追踪 + 请求/响应体
|
|
107
|
+
LOGGER_LEVEL=verbose
|
|
108
|
+
LOG_REQUEST_BODY=true
|
|
109
|
+
LOG_RESPONSE_BODY=true
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 重要说明
|
|
113
|
+
|
|
114
|
+
1. **双层日志机制**:
|
|
115
|
+
- **info 级别**:始终记录基础链路日志(不含 body),用于生产环境请求追踪
|
|
116
|
+
- **verbose 级别**:记录详细追踪日志(包含 body),用于开发调试
|
|
117
|
+
|
|
118
|
+
2. **默认不限制长度**:如果不设置 `LOG_MAX_BODY_LENGTH` 环境变量,日志体不会被截断。建议在生产环境设置合理的限制值。
|
|
119
|
+
|
|
120
|
+
3. **响应数据处理**:日志库会尝试序列化所有响应数据,对于无法序列化的数据(如 Buffer、Stream)会返回类型信息。
|
|
121
|
+
|
|
122
|
+
### 日志输出示例
|
|
123
|
+
|
|
124
|
+
#### Info 级别(链路日志)
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"level": "INFO",
|
|
129
|
+
"time": 1234567890,
|
|
130
|
+
"msg": "HTTP request started",
|
|
131
|
+
"method": "GET",
|
|
132
|
+
"path": "/api/users",
|
|
133
|
+
"trace_id": "req-123-456",
|
|
134
|
+
"user_id": "user-001",
|
|
135
|
+
"tenant_id": 24020896,
|
|
136
|
+
"app_id": "",
|
|
137
|
+
"context": "HTTPTraceInterceptor"
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"level": "INFO",
|
|
144
|
+
"time": 1234567890,
|
|
145
|
+
"msg": "HTTP request completed",
|
|
146
|
+
"method": "GET",
|
|
147
|
+
"path": "/api/users",
|
|
148
|
+
"trace_id": "req-123-456",
|
|
149
|
+
"status_code": 200,
|
|
150
|
+
"duration_ms": 125,
|
|
151
|
+
"context": "HTTPTraceInterceptor"
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Verbose 级别(详细追踪日志)
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"level": "TRACE",
|
|
160
|
+
"time": 1234567890,
|
|
161
|
+
"msg": "HTTP request started",
|
|
162
|
+
"method": "POST",
|
|
163
|
+
"path": "/api/users",
|
|
164
|
+
"trace_id": "req-123-456",
|
|
165
|
+
"request_body": {
|
|
166
|
+
"username": "john_doe",
|
|
167
|
+
"email": "john@example.com",
|
|
168
|
+
"password": "secret123"
|
|
169
|
+
},
|
|
170
|
+
"query_params": {
|
|
171
|
+
"filter": "active"
|
|
172
|
+
},
|
|
173
|
+
"context": "HTTPTraceInterceptor"
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```json
|
|
178
|
+
{
|
|
179
|
+
"level": "TRACE",
|
|
180
|
+
"time": 1234567890,
|
|
181
|
+
"msg": "HTTP request completed",
|
|
182
|
+
"method": "POST",
|
|
183
|
+
"path": "/api/users",
|
|
184
|
+
"trace_id": "req-123-456",
|
|
185
|
+
"status_code": 201,
|
|
186
|
+
"duration_ms": 125,
|
|
187
|
+
"response_body": {
|
|
188
|
+
"id": "user-123",
|
|
189
|
+
"username": "john_doe",
|
|
190
|
+
"email": "john@example.com"
|
|
191
|
+
},
|
|
192
|
+
"context": "HTTPTraceInterceptor"
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 数据截断
|
|
197
|
+
|
|
198
|
+
默认情况下,不会对日志体进行截断。当设置 `LOG_MAX_BODY_LENGTH` 环境变量后,如果请求/响应体超过指定长度,会自动截断:
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"response_body": {
|
|
203
|
+
"_truncated": true,
|
|
204
|
+
"_originalLength": 50000,
|
|
205
|
+
"_data": "{ 前 10000 个字符... }..."
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**建议**:在生产环境设置合理的限制值(如 10000),避免单条日志过大。
|
|
211
|
+
|
|
212
|
+
## 日志级别映射
|
|
213
|
+
|
|
214
|
+
NestJS LoggerService 级别到 Pino 级别的映射:
|
|
215
|
+
|
|
216
|
+
- `fatal` → `fatal`
|
|
217
|
+
- `error` → `error`
|
|
218
|
+
- `warn` → `warn`
|
|
219
|
+
- `log` → `info`
|
|
220
|
+
- `debug` → `debug`
|
|
221
|
+
- `verbose` → `trace`
|
|
222
|
+
|
|
223
|
+
## 日志文件
|
|
224
|
+
|
|
225
|
+
日志会写入以下文件(默认在 `logs/` 目录):
|
|
226
|
+
|
|
227
|
+
- `app.log` - 应用日志
|
|
228
|
+
- `trace.log` - HTTP 请求追踪日志
|
|
229
|
+
|
|
230
|
+
## 注意事项
|
|
231
|
+
|
|
232
|
+
### 安全性
|
|
233
|
+
|
|
234
|
+
1. **生产环境默认不打印 HTTP 追踪日志**:由于使用 verbose 级别,生产环境(info 级别)默认不会输出详细日志
|
|
235
|
+
2. **双层日志设计**:info 级别始终记录链路日志,verbose 级别记录详细信息,按需启用
|
|
236
|
+
3. **按需启用**:需要查看详细追踪时,将 LOGGER_LEVEL 设置为 verbose
|
|
237
|
+
4. **敏感数据处理**:日志库不提供脱敏功能,请在业务层或通过中间件处理敏感数据
|
|
238
|
+
|
|
239
|
+
### 性能
|
|
240
|
+
|
|
241
|
+
1. verbose 级别会输出所有 HTTP 请求详细日志,可能影响性能
|
|
242
|
+
2. 开启请求/响应体日志会增加日志体积和 I/O 开销
|
|
243
|
+
3. 大对象的序列化会影响性能
|
|
244
|
+
4. 建议在开发/测试环境使用,生产环境按需临时启用
|
|
245
|
+
|
|
246
|
+
### 存储
|
|
247
|
+
|
|
248
|
+
1. 日志直接写入文件,不支持自动轮转,建议通过外部工具(如 logrotate)管理日志文件
|
|
249
|
+
2. verbose 级别 + 请求/响应体日志会显著增加日志量
|
|
250
|
+
3. 建议设置 `LOG_MAX_BODY_LENGTH` 限制单条日志大小(默认不限制)
|
|
251
|
+
|
|
252
|
+
## 最佳实践
|
|
253
|
+
|
|
254
|
+
### 开发环境
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
NODE_ENV=development
|
|
258
|
+
# 使用 verbose 级别查看 HTTP 请求追踪
|
|
259
|
+
LOGGER_LEVEL=verbose
|
|
260
|
+
LOG_REQUEST_BODY=true
|
|
261
|
+
LOG_RESPONSE_BODY=true
|
|
262
|
+
# 开发环境可以不限制长度,或设置较大值
|
|
263
|
+
# LOG_MAX_BODY_LENGTH=50000
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### 生产环境
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
NODE_ENV=production
|
|
270
|
+
# 生产环境使用 info 级别,不会打印 HTTP 请求追踪日志
|
|
271
|
+
LOGGER_LEVEL=info
|
|
272
|
+
# 这两个配置可以保留,只有当 LOGGER_LEVEL=verbose 时才会生效
|
|
273
|
+
LOG_REQUEST_BODY=false
|
|
274
|
+
LOG_RESPONSE_BODY=false
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 故障排查
|
|
278
|
+
|
|
279
|
+
临时启用详细日志:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
NODE_ENV=production
|
|
283
|
+
# 临时开启 verbose 级别查看 HTTP 请求追踪
|
|
284
|
+
LOGGER_LEVEL=verbose
|
|
285
|
+
LOG_REQUEST_BODY=true
|
|
286
|
+
LOG_RESPONSE_BODY=true
|
|
287
|
+
LOG_MAX_BODY_LENGTH=10000 # 建议设置限制,避免日志过大
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## License
|
|
291
|
+
|
|
292
|
+
MIT
|