@gyramais/log-transport 1.0.0 → 1.1.0
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/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +27 -0
- package/dist/logger.js.map +1 -1
- package/dist/mask-format.d.ts +3 -0
- package/dist/mask-format.d.ts.map +1 -0
- package/dist/mask-format.js +65 -0
- package/dist/mask-format.js.map +1 -0
- package/dist/options.d.ts +1 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js.map +1 -1
- package/package.json +2 -1
- package/src/logger.ts +28 -0
- package/src/mask-format.ts +71 -0
- package/src/options.ts +11 -0
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAmCA,OAAO,aAAa,GAAG,QAAQ,cAAc,CAAC,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAmCA,OAAO,aAAa,GAAG,QAAQ,cAAc,CAAC,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpD,OAAO,EAKL,aAAa,EAEd,MAAM,WAAW,CAAC;AAQnB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IAOtB,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IAOrC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AA0LD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,aAAa,KAAG,WAyGxD,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -36,6 +36,7 @@ const winston_1 = require("winston");
|
|
|
36
36
|
const nest_winston_1 = require("nest-winston");
|
|
37
37
|
const LokiTransport = require("winston-loki");
|
|
38
38
|
const os_1 = require("os");
|
|
39
|
+
const mask_format_1 = require("./mask-format");
|
|
39
40
|
const console_redirect_1 = require("./console-redirect");
|
|
40
41
|
const fatal_handlers_1 = require("./fatal-handlers");
|
|
41
42
|
const options_1 = require("./options");
|
|
@@ -159,6 +160,21 @@ const buildLokiTransport = (loki, labels, lineFormat) => new LokiTransport({
|
|
|
159
160
|
batching: true,
|
|
160
161
|
timeout: loki.timeout ?? options_1.DEFAULT_LOKI_TIMEOUT_MS,
|
|
161
162
|
format: lineFormat,
|
|
163
|
+
/*
|
|
164
|
+
Lote que falhou é DESCARTADO, não reenfileirado.
|
|
165
|
+
|
|
166
|
+
Sem isto o `winston-loki` chama `_requeue(snapshot)` a cada falha, e como
|
|
167
|
+
não existe teto de tamanho na lib o lote vira append-only: cada ciclo
|
|
168
|
+
re-envia tudo o que já foi recusado. Com um destino que recusa de forma
|
|
169
|
+
sustentada (429 de tenant sem allowance, 401 de escopo), isso não é um
|
|
170
|
+
retry — é um laço que cresce sozinho. Na sandbox rendeu 13,3 TB de egress
|
|
171
|
+
inter-região e um serviço travado acima do limite de 100 MiB do gRPC, sem
|
|
172
|
+
uma única linha ingerida (GYR-1669).
|
|
173
|
+
|
|
174
|
+
O preço é perder as linhas do lote que falhou. É o preço certo: log é
|
|
175
|
+
best-effort, e a falha continua audível pelo `[LOKI-SHIP-FAIL]` abaixo.
|
|
176
|
+
*/
|
|
177
|
+
clearOnError: true,
|
|
162
178
|
/*
|
|
163
179
|
A falha de entrega tem que ser audível: enquanto era silenciosa, o serviço
|
|
164
180
|
perdeu ~99,5% dos seus logs sem ninguém notar. Escreve direto no console
|
|
@@ -244,8 +260,19 @@ const buildNestLogger = (options) => {
|
|
|
244
260
|
format: remoteFormat,
|
|
245
261
|
}));
|
|
246
262
|
}
|
|
263
|
+
/*
|
|
264
|
+
O mascaramento do payload do chamador (GYR-1644) vai no nível do LOGGER, não
|
|
265
|
+
no de cada transport, por dois motivos: roda UMA vez por linha em vez de uma
|
|
266
|
+
por destino, e assim Console, File e Loki recebem a mesma linha já limpa —
|
|
267
|
+
um destino que escapasse seria o vazamento de volta.
|
|
268
|
+
*/
|
|
247
269
|
const logger = nest_winston_1.WinstonModule.createLogger({
|
|
248
270
|
level: options.level ?? options_1.DEFAULT_LEVEL,
|
|
271
|
+
/*
|
|
272
|
+
`undefined` e nao um combine vazio: e o estado anterior FIEL — antes desta
|
|
273
|
+
mudanca nao havia format de nivel de logger nenhum.
|
|
274
|
+
*/
|
|
275
|
+
format: options.maskPayload === false ? undefined : (0, mask_format_1.buildMaskFormat)(),
|
|
249
276
|
transports: transportsList,
|
|
250
277
|
});
|
|
251
278
|
/*
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask-format.d.ts","sourceRoot":"","sources":["../src/mask-format.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AAa1C,eAAO,MAAM,eAAe,QAAO,OAAO,CAAC,MAqBrC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.buildMaskFormat = void 0;
|
|
5
|
+
/*
|
|
6
|
+
Mascaramento do argumento que o chamador passou ao `Logger` (GYR-1644).
|
|
7
|
+
|
|
8
|
+
O interceptor protege o que ATRAVESSA a requisição. Uma chamada direta —
|
|
9
|
+
`Logger.log('CreateReport', user)` — não atravessa nada e saía crua; foi assim
|
|
10
|
+
que um e-mail de pessoa real apareceu no log de produção do gyra-core em
|
|
11
|
+
02/09/2026. São 70 chamadas dessas em 9 repos, nenhuma mascarando.
|
|
12
|
+
|
|
13
|
+
Corrigir aqui, e não nos 70 call sites, é o ponto: a 71ª chamada nasce protegida
|
|
14
|
+
e cada serviço herda ao adotar o pacote.
|
|
15
|
+
|
|
16
|
+
ONDE O ARGUMENTO CAI. Medido com o winston e o nest-winston reais do repo, não
|
|
17
|
+
suposto — o card original supunha que o winston espalhava o objeto no topo do
|
|
18
|
+
`info`, e não é o que acontece:
|
|
19
|
+
|
|
20
|
+
Logger.log('CreateReport', user) -> info.context = user (objeto)
|
|
21
|
+
Logger.log('mensagem', 'SCRPlugin')-> info.context = 'SCRPlugin' (string)
|
|
22
|
+
Logger.warn('aviso', {…}) -> info.context = {…}
|
|
23
|
+
Logger.error('after', {…}) -> info.stack = [ {…} ]
|
|
24
|
+
|
|
25
|
+
Top-level do `info` é sempre `['context','level','message']` (+ `stack` no
|
|
26
|
+
`error`). Ou seja, a fronteira entre metadado da linha e payload do chamador
|
|
27
|
+
está PRESERVADA num campo conhecido — é a assimetria `warn`/`error` medida na
|
|
28
|
+
GYR-1571, que aqui deixa de ser problema e vira o mecanismo.
|
|
29
|
+
|
|
30
|
+
Daí a regra: `context` string é o contexto do Nest (nome da classe) e não se
|
|
31
|
+
toca; `context` objeto é payload do chamador e passa por `maskLogMeta`.
|
|
32
|
+
|
|
33
|
+
O TERCEIRO CANAL. Substituir `info.context` NÃO limpa
|
|
34
|
+
`info[Symbol.for('splat')]`, que segue apontando para o objeto cru — medido. E é
|
|
35
|
+
de lá que o `formatMeta` do formato pretty lê. Mascarar só um canal deixaria o
|
|
36
|
+
PII em claro no stdout de desenvolvimento, que é onde ele é lido por humano.
|
|
37
|
+
*/
|
|
38
|
+
const winston_1 = require("winston");
|
|
39
|
+
const log_redaction_1 = require("@gyramais/log-redaction");
|
|
40
|
+
const SPLAT = Symbol.for('splat');
|
|
41
|
+
/*
|
|
42
|
+
`maskLogMeta` devolve CÓPIA. Isso não é detalhe: o objeto no `splat` é o do
|
|
43
|
+
chamador, e mascarar no lugar corromperia o dado da aplicação — o `user` do
|
|
44
|
+
request perderia o `username` para o resto do handler.
|
|
45
|
+
*/
|
|
46
|
+
const maskEntry = (value) => value && typeof value === 'object' ? (0, log_redaction_1.maskLogMeta)(value) : value;
|
|
47
|
+
const buildMaskFormat = () => (0, winston_1.format)((info) => {
|
|
48
|
+
if (info.context && typeof info.context === 'object') {
|
|
49
|
+
info.context = (0, log_redaction_1.maskLogMeta)(info.context);
|
|
50
|
+
}
|
|
51
|
+
/*
|
|
52
|
+
Só array: num `Logger.error(msg, err.stack)` o `stack` é a string da stack
|
|
53
|
+
trace, e passá-la por um mascarador de objeto não faria nada além de custar.
|
|
54
|
+
*/
|
|
55
|
+
if (Array.isArray(info.stack)) {
|
|
56
|
+
info.stack = info.stack.map(maskEntry);
|
|
57
|
+
}
|
|
58
|
+
const splat = info[SPLAT];
|
|
59
|
+
if (Array.isArray(splat)) {
|
|
60
|
+
info[SPLAT] = splat.map(maskEntry);
|
|
61
|
+
}
|
|
62
|
+
return info;
|
|
63
|
+
})();
|
|
64
|
+
exports.buildMaskFormat = buildMaskFormat;
|
|
65
|
+
//# sourceMappingURL=mask-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask-format.js","sourceRoot":"","sources":["../src/mask-format.ts"],"names":[],"mappings":";AAAA,uDAAuD;;;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCE;AAEF,qCAA0C;AAC1C,2DAAsD;AAEtD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAElC;;;;EAIE;AACF,MAAM,SAAS,GAAG,CAAC,KAAc,EAAW,EAAE,CAC5C,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,2BAAW,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAE3D,MAAM,eAAe,GAAG,GAAmB,EAAE,CAClD,IAAA,gBAAM,EAAC,CAAC,IAAS,EAAE,EAAE;IACnB,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,IAAA,2BAAW,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;MAGE;IACF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,EAAE,CAAC;AArBM,QAAA,eAAe,mBAqBrB"}
|
package/dist/options.d.ts
CHANGED
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAOjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAS5B,OAAO,EAAE,MAAM,CAAC;IAOhB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,KAAK,CAAC,EAAE,MAAM,CAAC;IAQf,QAAQ,CAAC,EAAE,MAAM,CAAC;IASlB,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAOjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAS5B,OAAO,EAAE,MAAM,CAAC;IAOhB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,KAAK,CAAC,EAAE,MAAM,CAAC;IAQf,QAAQ,CAAC,EAAE,MAAM,CAAC;IASlB,MAAM,CAAC,EAAE,OAAO,CAAC;IAWjB,WAAW,CAAC,EAAE,OAAO,CAAC;IAYtB,IAAI,CAAC,EAAE,WAAW,CAAC;IAMnB,IAAI,CAAC,EAAE,WAAW,CAAC;IAWnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAa1B,aAAa,CAAC,EAAE,OAAO,GAAG,oBAAoB,CAAC;CAChD;AAED,eAAO,MAAM,iBAAiB,SAAS,CAAC;AACxC,eAAO,MAAM,aAAa,UAAU,CAAC;AAGrC,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,eAAO,MAAM,uBAAuB,QAAQ,CAAC"}
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;EAeE;;;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;EAeE;;;AA4HW,QAAA,iBAAiB,GAAG,MAAM,CAAC;AAC3B,QAAA,aAAa,GAAG,OAAO,CAAC;AAErC,gEAAgE;AACnD,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAElC,QAAA,uBAAuB,GAAG,KAAK,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gyramais/log-transport",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Entrega de log ao Loki e registro de excecao fatal para os servicos gyra-*",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"prepack": "npm run build"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
+
"@gyramais/log-redaction": "^1.2.0",
|
|
28
29
|
"nest-winston": "^1.9.4",
|
|
29
30
|
"winston": "^3.13.1",
|
|
30
31
|
"winston-loki": "^6.1.6"
|
package/src/logger.ts
CHANGED
|
@@ -37,6 +37,7 @@ import LokiTransport = require('winston-loki');
|
|
|
37
37
|
import type { LoggerService } from '@nestjs/common';
|
|
38
38
|
import { hostname } from 'os';
|
|
39
39
|
|
|
40
|
+
import { buildMaskFormat } from './mask-format';
|
|
40
41
|
import { redirectConsoleToNestLogger } from './console-redirect';
|
|
41
42
|
import { registerFatalHandlers } from './fatal-handlers';
|
|
42
43
|
import {
|
|
@@ -223,6 +224,22 @@ const buildLokiTransport = (
|
|
|
223
224
|
timeout: loki.timeout ?? DEFAULT_LOKI_TIMEOUT_MS,
|
|
224
225
|
format: lineFormat,
|
|
225
226
|
|
|
227
|
+
/*
|
|
228
|
+
Lote que falhou é DESCARTADO, não reenfileirado.
|
|
229
|
+
|
|
230
|
+
Sem isto o `winston-loki` chama `_requeue(snapshot)` a cada falha, e como
|
|
231
|
+
não existe teto de tamanho na lib o lote vira append-only: cada ciclo
|
|
232
|
+
re-envia tudo o que já foi recusado. Com um destino que recusa de forma
|
|
233
|
+
sustentada (429 de tenant sem allowance, 401 de escopo), isso não é um
|
|
234
|
+
retry — é um laço que cresce sozinho. Na sandbox rendeu 13,3 TB de egress
|
|
235
|
+
inter-região e um serviço travado acima do limite de 100 MiB do gRPC, sem
|
|
236
|
+
uma única linha ingerida (GYR-1669).
|
|
237
|
+
|
|
238
|
+
O preço é perder as linhas do lote que falhou. É o preço certo: log é
|
|
239
|
+
best-effort, e a falha continua audível pelo `[LOKI-SHIP-FAIL]` abaixo.
|
|
240
|
+
*/
|
|
241
|
+
clearOnError: true,
|
|
242
|
+
|
|
226
243
|
/*
|
|
227
244
|
A falha de entrega tem que ser audível: enquanto era silenciosa, o serviço
|
|
228
245
|
perdeu ~99,5% dos seus logs sem ninguém notar. Escreve direto no console
|
|
@@ -327,8 +344,19 @@ export const buildNestLogger = (options: LoggerOptions): BuiltLogger => {
|
|
|
327
344
|
);
|
|
328
345
|
}
|
|
329
346
|
|
|
347
|
+
/*
|
|
348
|
+
O mascaramento do payload do chamador (GYR-1644) vai no nível do LOGGER, não
|
|
349
|
+
no de cada transport, por dois motivos: roda UMA vez por linha em vez de uma
|
|
350
|
+
por destino, e assim Console, File e Loki recebem a mesma linha já limpa —
|
|
351
|
+
um destino que escapasse seria o vazamento de volta.
|
|
352
|
+
*/
|
|
330
353
|
const logger = WinstonModule.createLogger({
|
|
331
354
|
level: options.level ?? DEFAULT_LEVEL,
|
|
355
|
+
/*
|
|
356
|
+
`undefined` e nao um combine vazio: e o estado anterior FIEL — antes desta
|
|
357
|
+
mudanca nao havia format de nivel de logger nenhum.
|
|
358
|
+
*/
|
|
359
|
+
format: options.maskPayload === false ? undefined : buildMaskFormat(),
|
|
332
360
|
transports: transportsList,
|
|
333
361
|
});
|
|
334
362
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
Mascaramento do argumento que o chamador passou ao `Logger` (GYR-1644).
|
|
5
|
+
|
|
6
|
+
O interceptor protege o que ATRAVESSA a requisição. Uma chamada direta —
|
|
7
|
+
`Logger.log('CreateReport', user)` — não atravessa nada e saía crua; foi assim
|
|
8
|
+
que um e-mail de pessoa real apareceu no log de produção do gyra-core em
|
|
9
|
+
02/09/2026. São 70 chamadas dessas em 9 repos, nenhuma mascarando.
|
|
10
|
+
|
|
11
|
+
Corrigir aqui, e não nos 70 call sites, é o ponto: a 71ª chamada nasce protegida
|
|
12
|
+
e cada serviço herda ao adotar o pacote.
|
|
13
|
+
|
|
14
|
+
ONDE O ARGUMENTO CAI. Medido com o winston e o nest-winston reais do repo, não
|
|
15
|
+
suposto — o card original supunha que o winston espalhava o objeto no topo do
|
|
16
|
+
`info`, e não é o que acontece:
|
|
17
|
+
|
|
18
|
+
Logger.log('CreateReport', user) -> info.context = user (objeto)
|
|
19
|
+
Logger.log('mensagem', 'SCRPlugin')-> info.context = 'SCRPlugin' (string)
|
|
20
|
+
Logger.warn('aviso', {…}) -> info.context = {…}
|
|
21
|
+
Logger.error('after', {…}) -> info.stack = [ {…} ]
|
|
22
|
+
|
|
23
|
+
Top-level do `info` é sempre `['context','level','message']` (+ `stack` no
|
|
24
|
+
`error`). Ou seja, a fronteira entre metadado da linha e payload do chamador
|
|
25
|
+
está PRESERVADA num campo conhecido — é a assimetria `warn`/`error` medida na
|
|
26
|
+
GYR-1571, que aqui deixa de ser problema e vira o mecanismo.
|
|
27
|
+
|
|
28
|
+
Daí a regra: `context` string é o contexto do Nest (nome da classe) e não se
|
|
29
|
+
toca; `context` objeto é payload do chamador e passa por `maskLogMeta`.
|
|
30
|
+
|
|
31
|
+
O TERCEIRO CANAL. Substituir `info.context` NÃO limpa
|
|
32
|
+
`info[Symbol.for('splat')]`, que segue apontando para o objeto cru — medido. E é
|
|
33
|
+
de lá que o `formatMeta` do formato pretty lê. Mascarar só um canal deixaria o
|
|
34
|
+
PII em claro no stdout de desenvolvimento, que é onde ele é lido por humano.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { format, Logform } from 'winston';
|
|
38
|
+
import { maskLogMeta } from '@gyramais/log-redaction';
|
|
39
|
+
|
|
40
|
+
const SPLAT = Symbol.for('splat');
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
`maskLogMeta` devolve CÓPIA. Isso não é detalhe: o objeto no `splat` é o do
|
|
44
|
+
chamador, e mascarar no lugar corromperia o dado da aplicação — o `user` do
|
|
45
|
+
request perderia o `username` para o resto do handler.
|
|
46
|
+
*/
|
|
47
|
+
const maskEntry = (value: unknown): unknown =>
|
|
48
|
+
value && typeof value === 'object' ? maskLogMeta(value) : value;
|
|
49
|
+
|
|
50
|
+
export const buildMaskFormat = (): Logform.Format =>
|
|
51
|
+
format((info: any) => {
|
|
52
|
+
if (info.context && typeof info.context === 'object') {
|
|
53
|
+
info.context = maskLogMeta(info.context);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
Só array: num `Logger.error(msg, err.stack)` o `stack` é a string da stack
|
|
58
|
+
trace, e passá-la por um mascarador de objeto não faria nada além de custar.
|
|
59
|
+
*/
|
|
60
|
+
if (Array.isArray(info.stack)) {
|
|
61
|
+
info.stack = info.stack.map(maskEntry);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const splat = info[SPLAT];
|
|
65
|
+
|
|
66
|
+
if (Array.isArray(splat)) {
|
|
67
|
+
info[SPLAT] = splat.map(maskEntry);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return info;
|
|
71
|
+
})();
|
package/src/options.ts
CHANGED
|
@@ -83,6 +83,17 @@ export interface LoggerOptions {
|
|
|
83
83
|
*/
|
|
84
84
|
pretty?: boolean;
|
|
85
85
|
|
|
86
|
+
/*
|
|
87
|
+
Mascara o objeto que o chamador passa ao `Logger` (GYR-1644). Default LIGADO:
|
|
88
|
+
o caminho que ele protege é o que vazou em produção, e um default desligado
|
|
89
|
+
faria cada serviço precisar lembrar de ligá-lo — que é exatamente a
|
|
90
|
+
disciplina por serviço que este pacote existe para não depender.
|
|
91
|
+
|
|
92
|
+
Existe para medir o custo do format (o benchmark liga e desliga a mesma
|
|
93
|
+
carga) e para desligar em emergência. Não é configuração de rotina.
|
|
94
|
+
*/
|
|
95
|
+
maskPayload?: boolean;
|
|
96
|
+
|
|
86
97
|
/*
|
|
87
98
|
A PRESENÇA deste objeto é o gate de envio — substitui o
|
|
88
99
|
`LOG_GRAFANA_LOKI === 'true'`. Ausente significa não enviar, e o pacote não
|