@lark-apaas/nestjs-logger 0.1.0-alpha.2 → 0.1.0-alpha.4

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,320 @@
1
+ # NestJS Logger
2
+
3
+ 基于 Pino 的高性能 NestJS 日志库,支持请求追踪、结构化日志和敏感信息脱敏。
4
+
5
+ ## 功能特性
6
+
7
+ - 基于 Pino 的高性能日志记录
8
+ - 自动 HTTP 请求追踪
9
+ - 请求和响应体日志记录(可配置)
10
+ - 敏感字段自动脱敏
11
+ - 支持多日志级别
12
+ - 独立的 trace 日志文件
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
+ # 注意:仅记录 Content-Type 为 JSON 的响应
78
+ LOG_RESPONSE_BODY=true
79
+
80
+ # 注意:即使启用了请求/响应体日志,也需要将日志级别设置为 verbose 才能实际输出
81
+ # 因为 HTTP 请求追踪日志使用的是 verbose 级别
82
+ LOGGER_LEVEL=verbose
83
+
84
+ # 日志体最大长度,超过会截断(默认:不限制)
85
+ # 不设置此环境变量时,不会进行截断
86
+ LOG_MAX_BODY_LENGTH=10000
87
+
88
+ # 敏感字段配置(逗号分隔,默认包含常见敏感字段)
89
+ LOG_SENSITIVE_FIELDS=password,token,secret,authorization,cookie,apiKey,accessToken,refreshToken
90
+ ```
91
+
92
+ ## 请求/响应体日志
93
+
94
+ ### 日志级别说明
95
+
96
+ HTTP 请求追踪日志使用 **`verbose` 级别**(对应 Pino 的 `trace` 级别),这意味着:
97
+
98
+ - **生产环境默认不打印**:生产环境默认日志级别为 `info`,不会输出 verbose 级别的日志
99
+ - **需要显式启用**:要查看 HTTP 请求追踪日志,需要将 `LOGGER_LEVEL` 设置为 `verbose`
100
+ - **细粒度控制**:可以通过日志级别控制是否打印请求追踪,而无需修改 `LOG_REQUEST_BODY` 和 `LOG_RESPONSE_BODY` 配置
101
+
102
+ ### 启用方式
103
+
104
+ 通过环境变量启用:
105
+
106
+ ```bash
107
+ # 方式一:仅启用 HTTP 请求追踪(不包含 body)
108
+ LOGGER_LEVEL=verbose
109
+
110
+ # 方式二:启用 HTTP 请求追踪 + 请求/响应体
111
+ LOGGER_LEVEL=verbose
112
+ LOG_REQUEST_BODY=true
113
+ LOG_RESPONSE_BODY=true
114
+ ```
115
+
116
+ ### 重要说明
117
+
118
+ 1. **仅记录 JSON 响应**:响应体日志只会记录 Content-Type 为 JSON 格式的响应(如 `application/json`、`application/vnd.api+json` 等),其他类型(如文件下载、HTML、图片等)不会被记录。
119
+
120
+ 2. **默认不限制长度**:如果不设置 `LOG_MAX_BODY_LENGTH` 环境变量,日志体不会被截断。建议在生产环境设置合理的限制值。
121
+
122
+ 3. **自动脱敏**:所有敏感字段会自动被替换为 `***MASKED***`。
123
+
124
+ ### 日志输出示例
125
+
126
+ #### 请求日志(包含请求体)
127
+
128
+ ```json
129
+ {
130
+ "level": "info",
131
+ "time": 1234567890,
132
+ "msg": "HTTP request started",
133
+ "method": "POST",
134
+ "path": "/api/users",
135
+ "trace_id": "req-123-456",
136
+ "user_id": "user-001",
137
+ "requestBody": {
138
+ "username": "john_doe",
139
+ "email": "john@example.com",
140
+ "password": "***MASKED***"
141
+ },
142
+ "queryParams": {
143
+ "filter": "active"
144
+ }
145
+ }
146
+ ```
147
+
148
+ #### 响应日志(包含响应体)
149
+
150
+ ```json
151
+ {
152
+ "level": "info",
153
+ "time": 1234567890,
154
+ "msg": "HTTP request completed",
155
+ "method": "POST",
156
+ "path": "/api/users",
157
+ "trace_id": "req-123-456",
158
+ "statusCode": 201,
159
+ "durationMs": 125,
160
+ "responseBody": {
161
+ "id": "user-123",
162
+ "username": "john_doe",
163
+ "email": "john@example.com",
164
+ "accessToken": "***MASKED***"
165
+ }
166
+ }
167
+ ```
168
+
169
+ ## 敏感字段脱敏
170
+
171
+ ### 默认脱敏字段
172
+
173
+ 以下字段会自动脱敏(不区分大小写,支持部分匹配):
174
+
175
+ - password
176
+ - token
177
+ - secret
178
+ - authorization
179
+ - cookie
180
+ - apiKey
181
+ - accessToken
182
+ - refreshToken
183
+
184
+ ### 自定义敏感字段
185
+
186
+ 通过环境变量配置:
187
+
188
+ ```bash
189
+ LOG_SENSITIVE_FIELDS=password,token,secret,myCustomSecret,privateKey
190
+ ```
191
+
192
+ ### 脱敏规则
193
+
194
+ - 字段匹配不区分大小写
195
+ - 支持部分匹配(例如:`accessToken` 会匹配 `token`)
196
+ - 敏感字段值会被替换为 `***MASKED***`
197
+ - 嵌套对象中的敏感字段也会被脱敏
198
+
199
+ ### 示例
200
+
201
+ ```typescript
202
+ // 原始数据
203
+ {
204
+ username: "john",
205
+ password: "secret123",
206
+ userToken: "abc123",
207
+ nested: {
208
+ apiKey: "key123"
209
+ }
210
+ }
211
+
212
+ // 脱敏后
213
+ {
214
+ username: "john",
215
+ password: "***MASKED***",
216
+ userToken: "***MASKED***", // 匹配 'token'
217
+ nested: {
218
+ apiKey: "***MASKED***"
219
+ }
220
+ }
221
+ ```
222
+
223
+ ## 数据截断
224
+
225
+ 默认情况下,不会对日志体进行截断。当设置 `LOG_MAX_BODY_LENGTH` 环境变量后,如果请求/响应体超过指定长度,会自动截断:
226
+
227
+ ```json
228
+ {
229
+ "responseBody": {
230
+ "_truncated": true,
231
+ "_originalLength": 50000,
232
+ "_data": "{ 前 10000 个字符... }..."
233
+ }
234
+ }
235
+ ```
236
+
237
+ **建议**:在生产环境设置合理的限制值(如 10000),避免单条日志过大。
238
+
239
+ ## 日志级别映射
240
+
241
+ NestJS LoggerService 级别到 Pino 级别的映射:
242
+
243
+ - `fatal` → `fatal`
244
+ - `error` → `error`
245
+ - `warn` → `warn`
246
+ - `log` → `info`
247
+ - `debug` → `debug`
248
+ - `verbose` → `trace`
249
+
250
+ ## 日志文件
251
+
252
+ 日志会写入以下文件(默认在 `logs/` 目录):
253
+
254
+ - `app.log` - 应用日志
255
+ - `trace.log` - HTTP 请求追踪日志
256
+
257
+ ## 注意事项
258
+
259
+ ### 安全性
260
+
261
+ 1. **生产环境默认不打印 HTTP 追踪日志**:由于使用 verbose 级别,生产环境(info 级别)默认不会输出
262
+ 2. **按需启用**:需要查看请求追踪时,将 LOGGER_LEVEL 设置为 verbose
263
+ 3. 确保敏感字段配置完整,覆盖所有可能的敏感数据
264
+ 4. 定期审查日志内容,确保没有遗漏的敏感信息
265
+ 5. **仅 JSON 响应会被记录**,文件下载、HTML 等其他类型不会被记录
266
+
267
+ ### 性能
268
+
269
+ 1. verbose 级别会输出所有 HTTP 请求日志,可能影响性能
270
+ 2. 开启请求/响应体日志会增加日志体积和 I/O 开销
271
+ 3. 大对象的序列化和脱敏会影响性能
272
+ 4. 建议在开发/测试环境使用,生产环境按需临时启用
273
+
274
+ ### 存储
275
+
276
+ 1. 注意日志文件大小,建议配置日志轮转
277
+ 2. verbose 级别 + 请求/响应体日志会显著增加日志量
278
+ 3. 建议设置 `LOG_MAX_BODY_LENGTH` 限制单条日志大小(默认不限制)
279
+
280
+ ## 最佳实践
281
+
282
+ ### 开发环境
283
+
284
+ ```bash
285
+ NODE_ENV=development
286
+ # 使用 verbose 级别查看 HTTP 请求追踪
287
+ LOGGER_LEVEL=verbose
288
+ LOG_REQUEST_BODY=true
289
+ LOG_RESPONSE_BODY=true
290
+ # 开发环境可以不限制长度,或设置较大值
291
+ # LOG_MAX_BODY_LENGTH=50000
292
+ ```
293
+
294
+ ### 生产环境
295
+
296
+ ```bash
297
+ NODE_ENV=production
298
+ # 生产环境使用 info 级别,不会打印 HTTP 请求追踪日志
299
+ LOGGER_LEVEL=info
300
+ # 这两个配置可以保留,只有当 LOGGER_LEVEL=verbose 时才会生效
301
+ LOG_REQUEST_BODY=false
302
+ LOG_RESPONSE_BODY=false
303
+ ```
304
+
305
+ ### 故障排查
306
+
307
+ 临时启用详细日志:
308
+
309
+ ```bash
310
+ NODE_ENV=production
311
+ # 临时开启 verbose 级别查看 HTTP 请求追踪
312
+ LOGGER_LEVEL=verbose
313
+ LOG_REQUEST_BODY=true
314
+ LOG_RESPONSE_BODY=true
315
+ LOG_MAX_BODY_LENGTH=10000 # 建议设置限制,避免日志过大
316
+ ```
317
+
318
+ ## License
319
+
320
+ MIT
package/dist/index.cjs CHANGED
@@ -14375,6 +14375,7 @@ __export(index_exports, {
14375
14375
  AppLogger: () => AppLogger,
14376
14376
  LoggerContextMiddleware: () => LoggerContextMiddleware,
14377
14377
  LoggerModule: () => LoggerModule,
14378
+ PinoLoggerService: () => PinoLoggerService,
14378
14379
  TRACE_LOGGER: () => TRACE_LOGGER
14379
14380
  });
14380
14381
  module.exports = __toCommonJS(index_exports);
@@ -14521,6 +14522,36 @@ var BasePinoLogger = class _BasePinoLogger {
14521
14522
  fatal(message, ...optionalParams) {
14522
14523
  this.write("fatal", message, optionalParams, true);
14523
14524
  }
14525
+ /**
14526
+ * 记录结构化日志,将 meta 对象合并到日志字段中
14527
+ * @param level 日志级别
14528
+ * @param message 消息文本
14529
+ * @param meta 要合并的元数据对象
14530
+ * @param context 上下文标识
14531
+ */
14532
+ logStructured(level, message, meta, context) {
14533
+ if (!this.levelState.isEnabled(level)) {
14534
+ return;
14535
+ }
14536
+ const requestState = this.contextStore.getContext();
14537
+ const traceId = requestState?.requestId ?? null;
14538
+ const payload = {
14539
+ trace_id: traceId,
14540
+ path: requestState?.path,
14541
+ method: requestState?.method,
14542
+ user_id: requestState?.userId ?? null,
14543
+ app_id: requestState?.appId ?? null,
14544
+ tenant_id: requestState?.tenantId ?? null,
14545
+ pid: process.pid,
14546
+ ...sanitizeValue(meta)
14547
+ };
14548
+ if (context) {
14549
+ payload.context = context;
14550
+ }
14551
+ const pinoLevel = mapLogLevelToPino(level);
14552
+ const sanitizedPayload = sanitizeValue(payload);
14553
+ this.logger[pinoLevel](sanitizedPayload, message);
14554
+ }
14524
14555
  write(level, message, optionalParams, treatStack = false) {
14525
14556
  if (!this.levelState.isEnabled(level)) {
14526
14557
  return;
@@ -14681,7 +14712,7 @@ __name(sanitizeValue, "sanitizeValue");
14681
14712
  // src/module.ts
14682
14713
  var import_common5 = require("@nestjs/common");
14683
14714
  var import_core = require("@nestjs/core");
14684
- var import_config2 = __toESM(require_config2(), 1);
14715
+ var import_config3 = __toESM(require_config2(), 1);
14685
14716
 
14686
14717
  // src/config/logger.config.ts
14687
14718
  var import_config = __toESM(require_config2(), 1);
@@ -14703,14 +14734,21 @@ function normalizeLevel(level) {
14703
14734
  __name(normalizeLevel, "normalizeLevel");
14704
14735
  var logger_config_default = (0, import_config.registerAs)("logger", () => {
14705
14736
  const level = normalizeLevel(process.env.LOGGER_LEVEL || (process.env.NODE_ENV === "production" ? "info" : "debug"));
14737
+ const maxBodyLengthEnv = process.env.LOG_MAX_BODY_LENGTH;
14738
+ const maxBodyLength = maxBodyLengthEnv ? Number(maxBodyLengthEnv) : null;
14706
14739
  return {
14707
14740
  level,
14708
- logDir: process.env.LOG_DIR || "logs"
14741
+ logDir: process.env.LOG_DIR || "logs",
14742
+ logRequestBody: process.env.LOG_REQUEST_BODY === "true",
14743
+ logResponseBody: process.env.LOG_RESPONSE_BODY === "true",
14744
+ maxBodyLength,
14745
+ sensitiveFields: (process.env.LOG_SENSITIVE_FIELDS || "password,token,secret,authorization,cookie,apiKey,accessToken,refreshToken").split(",").map((f) => f.trim())
14709
14746
  };
14710
14747
  });
14711
14748
 
14712
14749
  // src/interceptor/logging.interceptor.ts
14713
14750
  var import_common3 = require("@nestjs/common");
14751
+ var import_config2 = __toESM(require_config2(), 1);
14714
14752
  var import_operators = __toESM(require_operators(), 1);
14715
14753
  function _ts_decorate3(decorators, target, key, desc) {
14716
14754
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -14735,9 +14773,13 @@ var LoggingInterceptor = class {
14735
14773
  }
14736
14774
  traceLogger;
14737
14775
  requestContext;
14738
- constructor(traceLogger, requestContext) {
14776
+ appLogger;
14777
+ config;
14778
+ constructor(traceLogger, requestContext, appLogger, config) {
14739
14779
  this.traceLogger = traceLogger;
14740
14780
  this.requestContext = requestContext;
14781
+ this.appLogger = appLogger;
14782
+ this.config = config;
14741
14783
  }
14742
14784
  intercept(context, next) {
14743
14785
  if (context.getType() !== "http") {
@@ -14756,7 +14798,6 @@ var LoggingInterceptor = class {
14756
14798
  const baseMeta = {
14757
14799
  method,
14758
14800
  path: url,
14759
- requestId: req.requestId ?? req.id,
14760
14801
  trace_id: req.requestId ?? req.id,
14761
14802
  user_id: req.userContext?.userId ?? null,
14762
14803
  tenant_id: req.userContext?.tenantId ?? null,
@@ -14764,39 +14805,141 @@ var LoggingInterceptor = class {
14764
14805
  ip: req.ip ?? null,
14765
14806
  pid: process.pid
14766
14807
  };
14767
- this.traceLogger.log("HTTP request started", baseMeta, "HTTP");
14768
- return next.handle().pipe((0, import_operators.tap)(() => {
14808
+ this.appLogger.logStructured("log", "HTTP request started", baseMeta, "HTTPTraceInterceptor");
14809
+ const requestMeta = {
14810
+ ...baseMeta
14811
+ };
14812
+ if (this.config.logRequestBody && req.body) {
14813
+ requestMeta["request_body"] = this.sanitizeAndTruncate(req.body);
14814
+ }
14815
+ if (this.config.logRequestBody && Object.keys(req.query || {}).length > 0) {
14816
+ requestMeta["query_params"] = this.sanitizeAndTruncate(req.query);
14817
+ }
14818
+ this.traceLogger.logStructured("verbose", "HTTP request started", requestMeta, "HTTPTraceInterceptor");
14819
+ return next.handle().pipe((0, import_operators.tap)((responseData) => {
14769
14820
  const durationMs = Date.now() - startedAt;
14770
14821
  const statusCode = res.statusCode;
14771
- this.traceLogger.log("HTTP request completed", {
14822
+ this.appLogger.logStructured("log", "HTTP request completed", {
14823
+ ...baseMeta,
14824
+ status_code: statusCode,
14825
+ duration_ms: durationMs
14826
+ }, "HTTPTraceInterceptor");
14827
+ const responseMeta = {
14772
14828
  ...baseMeta,
14773
- statusCode,
14774
- durationMs
14775
- }, "HTTP");
14829
+ status_code: statusCode,
14830
+ duration_ms: durationMs
14831
+ };
14832
+ if (this.config.logResponseBody && responseData !== void 0) {
14833
+ const contentType = res.getHeader("content-type");
14834
+ const isJsonResponse = this.isJsonContentType(contentType);
14835
+ if (isJsonResponse) {
14836
+ responseMeta["response_body"] = this.sanitizeAndTruncate(responseData);
14837
+ }
14838
+ }
14839
+ this.traceLogger.logStructured("verbose", "HTTP request completed", responseMeta, "HTTPTraceInterceptor");
14776
14840
  }), (0, import_operators.catchError)((error) => {
14777
14841
  const durationMs = Date.now() - startedAt;
14778
14842
  const statusCode = res.statusCode >= 400 ? res.statusCode : 500;
14843
+ const linkMeta = {
14844
+ ...baseMeta,
14845
+ status_code: statusCode,
14846
+ duration_ms: durationMs
14847
+ };
14848
+ if (error instanceof Error) {
14849
+ linkMeta["error_message"] = error.message;
14850
+ }
14851
+ this.appLogger.logStructured("log", "HTTP request failed", linkMeta, "HTTPTraceInterceptor");
14779
14852
  const meta = {
14780
14853
  ...baseMeta,
14781
- statusCode,
14782
- durationMs
14854
+ status_code: statusCode,
14855
+ duration_ms: durationMs
14783
14856
  };
14784
14857
  if (error instanceof Error) {
14785
- this.traceLogger.error(error, meta, "HTTP");
14858
+ meta["error"] = {
14859
+ message: error.message,
14860
+ stack: error.stack
14861
+ };
14786
14862
  } else {
14787
- this.traceLogger.error("Unknown error thrown", meta, "HTTP");
14863
+ meta["error"] = String(error);
14788
14864
  }
14865
+ this.traceLogger.logStructured("verbose", "HTTP request failed", meta, "HTTPTraceInterceptor");
14789
14866
  throw error;
14790
14867
  }));
14791
14868
  }
14869
+ /**
14870
+ * 对数据进行脱敏和截断处理
14871
+ */
14872
+ sanitizeAndTruncate(data) {
14873
+ try {
14874
+ const sanitized = this.maskSensitiveFields(data);
14875
+ if (this.config.maxBodyLength === null) {
14876
+ return sanitized;
14877
+ }
14878
+ const jsonStr = JSON.stringify(sanitized);
14879
+ if (jsonStr.length > this.config.maxBodyLength) {
14880
+ return {
14881
+ _truncated: true,
14882
+ _originalLength: jsonStr.length,
14883
+ _data: jsonStr.substring(0, this.config.maxBodyLength) + "..."
14884
+ };
14885
+ }
14886
+ return sanitized;
14887
+ } catch (error) {
14888
+ return {
14889
+ _error: "Failed to serialize data",
14890
+ _message: error instanceof Error ? error.message : String(error)
14891
+ };
14892
+ }
14893
+ }
14894
+ /**
14895
+ * 判断是否是 JSON 响应类型
14896
+ */
14897
+ isJsonContentType(contentType) {
14898
+ if (typeof contentType !== "string") {
14899
+ return false;
14900
+ }
14901
+ const contentTypeLower = contentType.toLowerCase();
14902
+ return contentTypeLower.includes("application/json");
14903
+ }
14904
+ /**
14905
+ * 脱敏敏感字段
14906
+ */
14907
+ maskSensitiveFields(data) {
14908
+ if (data === null || data === void 0) {
14909
+ return data;
14910
+ }
14911
+ if (Array.isArray(data)) {
14912
+ return data.map((item) => this.maskSensitiveFields(item));
14913
+ }
14914
+ if (typeof data === "object") {
14915
+ const result = {};
14916
+ for (const [key, value] of Object.entries(data)) {
14917
+ const lowerKey = key.toLowerCase();
14918
+ const isSensitive = this.config.sensitiveFields.some((field) => lowerKey.includes(field.toLowerCase()));
14919
+ if (isSensitive) {
14920
+ result[key] = "***MASKED***";
14921
+ } else if (typeof value === "object" && value !== null) {
14922
+ result[key] = this.maskSensitiveFields(value);
14923
+ } else {
14924
+ result[key] = value;
14925
+ }
14926
+ }
14927
+ return result;
14928
+ }
14929
+ return data;
14930
+ }
14792
14931
  };
14793
14932
  LoggingInterceptor = _ts_decorate3([
14794
14933
  (0, import_common3.Injectable)(),
14795
14934
  _ts_param2(0, (0, import_common3.Inject)(TRACE_LOGGER)),
14935
+ _ts_param2(2, (0, import_common3.Inject)(AppLogger)),
14936
+ _ts_param2(3, (0, import_common3.Inject)(logger_config_default.KEY)),
14796
14937
  _ts_metadata2("design:type", Function),
14797
14938
  _ts_metadata2("design:paramtypes", [
14798
- typeof import_common3.LoggerService === "undefined" ? Object : import_common3.LoggerService,
14799
- typeof RequestContextService === "undefined" ? Object : RequestContextService
14939
+ typeof PinoLoggerService === "undefined" ? Object : PinoLoggerService,
14940
+ typeof RequestContextService === "undefined" ? Object : RequestContextService,
14941
+ typeof AppLogger === "undefined" ? Object : AppLogger,
14942
+ typeof import_config2.ConfigType === "undefined" ? Object : import_config2.ConfigType
14800
14943
  ])
14801
14944
  ], LoggingInterceptor);
14802
14945
 
@@ -14914,7 +15057,7 @@ LoggerModule = _ts_decorate5([
14914
15057
  (0, import_common5.Global)(),
14915
15058
  (0, import_common5.Module)({
14916
15059
  imports: [
14917
- import_config2.ConfigModule.forFeature(logger_config_default)
15060
+ import_config3.ConfigModule.forFeature(logger_config_default)
14918
15061
  ],
14919
15062
  providers: [
14920
15063
  RequestContextService,
@@ -14962,6 +15105,7 @@ LoggerModule = _ts_decorate5([
14962
15105
  AppLogger,
14963
15106
  LoggerContextMiddleware,
14964
15107
  LoggerModule,
15108
+ PinoLoggerService,
14965
15109
  TRACE_LOGGER
14966
15110
  });
14967
15111
  //# sourceMappingURL=index.cjs.map