@lark-apaas/nestjs-logger 0.1.0-alpha.1 → 0.1.0-alpha.10

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 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