@adatechnology/logger 0.0.6 → 0.0.7
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 +50 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,17 +16,17 @@ import { LoggerModule } from "@adatechnology/logger";
|
|
|
16
16
|
imports: [
|
|
17
17
|
// Opção 1: Configuração estática (forRoot)
|
|
18
18
|
LoggerModule.forRoot({
|
|
19
|
-
level:
|
|
20
|
-
context:
|
|
21
|
-
isProduction: process.env.NODE_ENV ===
|
|
19
|
+
level: "debug",
|
|
20
|
+
context: "MyService",
|
|
21
|
+
isProduction: process.env.NODE_ENV === "production",
|
|
22
22
|
colorize: true,
|
|
23
23
|
}),
|
|
24
24
|
|
|
25
25
|
// Opção 2: Configuração dinâmica (forRootAsync)
|
|
26
26
|
LoggerModule.forRootAsync({
|
|
27
27
|
useFactory: (configService: ConfigService) => ({
|
|
28
|
-
level: configService.get(
|
|
29
|
-
isProduction: configService.get(
|
|
28
|
+
level: configService.get("LOG_LEVEL"),
|
|
29
|
+
isProduction: configService.get("NODE_ENV") === "production",
|
|
30
30
|
}),
|
|
31
31
|
inject: [ConfigService],
|
|
32
32
|
}),
|
|
@@ -92,9 +92,11 @@ Se quiser, eu adiciono um exemplo de teste unitário para validar o comportament
|
|
|
92
92
|
Este pacote implementa um formato de log padronizado para todo o monorepo, facilitando o rastreamento de chamadas entre múltiplas bibliotecas e serviços.
|
|
93
93
|
|
|
94
94
|
### Formato Final
|
|
95
|
+
|
|
95
96
|
`[App-name@version][lib-name:version][requestId][timestamp][source][libMethod][LEVEL] - message - {payload}`
|
|
96
97
|
|
|
97
98
|
### Propriedades do Payload
|
|
99
|
+
|
|
98
100
|
Ao realizar um log, você pode passar as seguintes propriedades para enriquecer o contexto:
|
|
99
101
|
|
|
100
102
|
- `message`: A mensagem principal do log.
|
|
@@ -105,7 +107,46 @@ Ao realizar um log, você pode passar as seguintes propriedades para enriquecer
|
|
|
105
107
|
- `libMethod`: O método interno da biblioteca sendo executado. Ex: `get`.
|
|
106
108
|
- `meta`: Objeto com metadados adicionais (será exibido em uma única linha compacta).
|
|
107
109
|
|
|
110
|
+
> ✅ **Padrão recomendado:** enviar payload estruturado em `meta`.
|
|
111
|
+
>
|
|
112
|
+
> ⚠️ **Compatibilidade legada:** payload em `params` ainda é aceito e promovido para `meta` internamente para não quebrar serviços antigos.
|
|
113
|
+
|
|
114
|
+
### `meta` vs `params` (recomendação)
|
|
115
|
+
|
|
116
|
+
Use `meta` para todo conteúdo estruturado de log (request/response/error/details).
|
|
117
|
+
|
|
118
|
+
Exemplo recomendado:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
this.logger.error({
|
|
122
|
+
message: "Exception caught in filter",
|
|
123
|
+
context: "HttpExceptionFilter.logResponse",
|
|
124
|
+
requestId,
|
|
125
|
+
meta: {
|
|
126
|
+
request: { path, method, headers, params, query, body },
|
|
127
|
+
response: { status, headers, messages },
|
|
128
|
+
error: { type, message, status, body, details },
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Exemplo legado (ainda funciona, mas evite em código novo):
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
this.logger.error({
|
|
137
|
+
message: "Exception caught in filter",
|
|
138
|
+
context: "HttpExceptionFilter.logResponse",
|
|
139
|
+
requestId,
|
|
140
|
+
params: {
|
|
141
|
+
request: { path, method, headers, params, query, body },
|
|
142
|
+
response: { status, headers, messages },
|
|
143
|
+
error: { type, message, status, body, details },
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
108
148
|
### Exemplo de Log de Biblioteca
|
|
149
|
+
|
|
109
150
|
Para uma biblioteca que segue o padrão:
|
|
110
151
|
|
|
111
152
|
```ts
|
|
@@ -128,13 +169,13 @@ Resultado visual:
|
|
|
128
169
|
O pacote oferece um middleware `RequestContextMiddleware` que injeta um `requestId` (a partir do header `x-request-id` ou gerando um UUID) e executa a request dentro de um contexto assíncrono (AsyncLocalStorage). Para usá-lo no NestJS:
|
|
129
170
|
|
|
130
171
|
```ts
|
|
131
|
-
import { MiddlewareConsumer, Module, NestModule } from
|
|
132
|
-
import { RequestContextMiddleware, LoggerModule } from
|
|
172
|
+
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common";
|
|
173
|
+
import { RequestContextMiddleware, LoggerModule } from "@adatechnology/logger";
|
|
133
174
|
|
|
134
175
|
@Module({ imports: [LoggerModule.forRoot()] })
|
|
135
176
|
export class AppModule implements NestModule {
|
|
136
177
|
configure(consumer: MiddlewareConsumer) {
|
|
137
|
-
consumer.apply(RequestContextMiddleware).forRoutes(
|
|
178
|
+
consumer.apply(RequestContextMiddleware).forRoutes("*");
|
|
138
179
|
}
|
|
139
180
|
}
|
|
140
181
|
```
|
|
@@ -146,6 +187,5 @@ Com o middleware ativo, o logger automaticamente incluirá `requestId` nos metad
|
|
|
146
187
|
Se desejar um provider por request (cada request recebe uma instância com `setContext` isolado), passe `requestScoped: true` ao `forRoot`:
|
|
147
188
|
|
|
148
189
|
```ts
|
|
149
|
-
LoggerModule.forRoot({ requestScoped: true })
|
|
190
|
+
LoggerModule.forRoot({ requestScoped: true });
|
|
150
191
|
```
|
|
151
|
-
|