@gyramais/log-transport 0.2.0 → 0.4.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/README.md +25 -34
- package/dist/fatal-handlers.d.ts.map +1 -1
- package/dist/fatal-handlers.js +6 -5
- package/dist/fatal-handlers.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -20
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +15 -46
- package/dist/logger.js.map +1 -1
- package/dist/options.d.ts +0 -8
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js.map +1 -1
- package/package.json +4 -4
- package/src/fatal-handlers.ts +6 -5
- package/src/index.ts +3 -3
- package/src/logger.ts +14 -61
- package/src/options.ts +4 -51
package/README.md
CHANGED
|
@@ -18,8 +18,8 @@ const { logger } = buildNestLogger({
|
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
Uma chamada. Os dois efeitos de processo continuam **opt-in** — você escreve `true`,
|
|
21
|
-
não herda nada por importar o pacote — mas não exigem mais uma chamada separada
|
|
22
|
-
|
|
21
|
+
não herda nada por importar o pacote — mas não exigem mais uma chamada separada cada,
|
|
22
|
+
com o `logger` costurado na mão.
|
|
23
23
|
|
|
24
24
|
Sem essas duas opções, **nada no processo é tocado**: `console` intacto, nenhum
|
|
25
25
|
handler instalado.
|
|
@@ -28,49 +28,40 @@ handler instalado.
|
|
|
28
28
|
quem precisar de controle fino (ordem, opções, ou instalar sobre um logger que veio
|
|
29
29
|
de outro lugar).
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## Um logger por processo
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
conexões RMQ (`src/main.worker.ts`):
|
|
33
|
+
Construa **um** logger e passe a referência adiante — para a app e para cada conexão
|
|
34
|
+
de mensageria:
|
|
36
35
|
|
|
37
36
|
```ts
|
|
38
|
-
import { createLokiTransport, buildNestLogger } from '@gyramais/log-transport';
|
|
39
|
-
|
|
40
|
-
// UM transport para o processo inteiro
|
|
41
|
-
const lokiTransport = createLokiTransport({
|
|
42
|
-
service: 'gyra-core',
|
|
43
|
-
host: process.env.LOKI_URL,
|
|
44
|
-
basicAuth: process.env.LOKI_BASIC_AUTH,
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
// peça os efeitos de processo em UM dos loggers
|
|
48
37
|
const { logger } = buildNestLogger({
|
|
49
38
|
service: 'gyra-core',
|
|
50
|
-
|
|
39
|
+
loki: { host: process.env.LOKI_URL, basicAuth: process.env.LOKI_BASIC_AUTH },
|
|
51
40
|
redirectConsole: true,
|
|
52
41
|
fatalHandlers: true,
|
|
53
42
|
});
|
|
54
43
|
|
|
55
|
-
|
|
56
|
-
|
|
44
|
+
const app = await NestFactory.create(AppModule, { logger });
|
|
45
|
+
|
|
46
|
+
app.connectMicroservice({ transport: Transport.RMQ, logger, options: { ... } });
|
|
47
|
+
app.connectMicroservice({ transport: Transport.RMQ, logger, options: { ... } });
|
|
57
48
|
```
|
|
58
49
|
|
|
59
|
-
Não é
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
do processo: registros duplicados produziriam
|
|
71
|
-
|
|
72
|
-
`[FATAL-HANDLERS-DUP]
|
|
73
|
-
|
|
50
|
+
Não é estilo, é correção: **cada construção cria seu próprio lote pendente**. N
|
|
51
|
+
loggers são N lotes, e a descarga de exceção fatal alcança só um deles — as linhas
|
|
52
|
+
acumuladas nos outros morrem com o processo, que é o sintoma que a entrega confiável
|
|
53
|
+
existe para impedir.
|
|
54
|
+
|
|
55
|
+
Vale dizer de onde isso vem: os 15 serviços chamavam o `LoggerFactory()` mais de uma
|
|
56
|
+
vez (13 dos 15; o gyra-integration, seis vezes). Como a fábrica não recebia
|
|
57
|
+
argumento, todas as chamadas produziam loggers idênticos — era cópia de código, não
|
|
58
|
+
necessidade. Se você está construindo o segundo logger, pergunte primeiro por quê.
|
|
59
|
+
|
|
60
|
+
**`registerFatalHandlers` é chamado uma vez por processo.** Handler de
|
|
61
|
+
`uncaughtException` é recurso único do processo: registros duplicados produziriam
|
|
62
|
+
linhas `[FATAL]` repetidas e descargas concorrentes. O pacote ignora a chamada extra
|
|
63
|
+
e emite `[FATAL-HANDLERS-DUP]`, mas o certo é chamar uma vez — ou usar
|
|
64
|
+
`fatalHandlers: true`, que já faz isso.
|
|
74
65
|
|
|
75
66
|
## O pacote não lê `process.env`
|
|
76
67
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fatal-handlers.d.ts","sourceRoot":"","sources":["../src/fatal-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,aAAa,GAAG,QAAQ,cAAc,CAAC,CAAC;AAE/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAgCtD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,kBAAkB,GACtB,WAAW,aAAa,GAAG,SAAS,EACpC,kBAA4B,KAC3B,OAAO,CAAC,IAAI,CA6Bd,CAAC;
|
|
1
|
+
{"version":3,"file":"fatal-handlers.d.ts","sourceRoot":"","sources":["../src/fatal-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,aAAa,GAAG,QAAQ,cAAc,CAAC,CAAC;AAE/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAgCtD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,kBAAkB,GACtB,WAAW,aAAa,GAAG,SAAS,EACpC,kBAA4B,KAC3B,OAAO,CAAC,IAAI,CA6Bd,CAAC;AAoDF,QAAA,MAAM,qBAAqB,GACzB,QAAQ,aAAa,EACrB,WAAW,aAAa,GAAG,SAAS,EACpC,UAAS,oBAAyB,KACjC,CAAC,MAAM,IAAI,CA6Fb,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/fatal-handlers.js
CHANGED
|
@@ -89,9 +89,10 @@ const describeReason = (reason) => {
|
|
|
89
89
|
linhas `[FATAL]`, quatro flushes concorrentes no mesmo transport e quatro
|
|
90
90
|
chamadas de exit.
|
|
91
91
|
|
|
92
|
-
O risco
|
|
93
|
-
|
|
94
|
-
handler por logger.
|
|
92
|
+
O risco aparece em serviço que constrói mais de um logger — o que, na frota, era
|
|
93
|
+
o padrão: 13 dos 15 repos chamavam a fábrica mais de uma vez. Nesses, registrar um
|
|
94
|
+
handler por logger é o erro natural. A orientação é construir UM logger por
|
|
95
|
+
processo, mas o guard existe para o caso de alguém não seguir.
|
|
95
96
|
|
|
96
97
|
Este é o único estado global do pacote, e a distinção importa: ele descreve o
|
|
97
98
|
PROCESSO — se os handlers já estão instalados nele —, não configuração. Config
|
|
@@ -113,8 +114,8 @@ const registerFatalHandlers = (logger, transport, options = {}) => {
|
|
|
113
114
|
process.stdout.write(`${JSON.stringify({
|
|
114
115
|
level: 'warn',
|
|
115
116
|
message: '[FATAL-HANDLERS-DUP] registerFatalHandlers chamado mais de uma vez ' +
|
|
116
|
-
'neste processo; a chamada extra foi ignorada.
|
|
117
|
-
'
|
|
117
|
+
'neste processo; a chamada extra foi ignorada. Construa UM logger por ' +
|
|
118
|
+
'processo e registre uma vez.',
|
|
118
119
|
timestamp: new Date().toISOString(),
|
|
119
120
|
})}\n`);
|
|
120
121
|
return () => undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fatal-handlers.js","sourceRoot":"","sources":["../src/fatal-handlers.ts"],"names":[],"mappings":";;;AAKA;;;EAGE;AACF,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAI9B;;;;;EAKE;AACF,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC,MAAM,cAAc,GAAG,CACrB,SAAwB,EACxB,SAAiB,EACF,EAAE,CACjB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;GAUG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAC9B,SAAoC,EACpC,SAAS,GAAG,gBAAgB,EACb,EAAE;IACjB,IAAI,CAAC,SAAS,EAAE,KAAK;QAAE,OAAO;IAE9B,IAAI,KAAiC,CAAC;IAEtC,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,cAAc,CAClB,SAAS,EACT,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAC/C,CAAC;QACF,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,KAAK,EAAE;YACP,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP;;;UAGE;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fatal-handlers.js","sourceRoot":"","sources":["../src/fatal-handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { buildNestLogger
|
|
2
|
-
export type { BuiltLogger
|
|
1
|
+
export { buildNestLogger } from './logger';
|
|
2
|
+
export type { BuiltLogger } from './logger';
|
|
3
3
|
export { redirectConsoleToNestLogger } from './console-redirect';
|
|
4
4
|
export type { ConsoleRedirectOptions } from './console-redirect';
|
|
5
5
|
export { registerFatalHandlers, flushLokiTransport } from './fatal-handlers';
|
|
6
6
|
export { DEFAULT_APP_LABEL, DEFAULT_LEVEL, DEFAULT_LOKI_INTERVAL_SECONDS, DEFAULT_LOKI_TIMEOUT_MS, } from './options';
|
|
7
|
-
export type { LoggerOptions, LokiOptions, FileOptions,
|
|
7
|
+
export type { LoggerOptions, LokiOptions, FileOptions, FatalHandlersOptions, } from './options';
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,10 +13,9 @@
|
|
|
13
13
|
`dist/` e fariam um grep de auditoria acusar o pacote de ler ambiente.
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.DEFAULT_LOKI_TIMEOUT_MS = exports.DEFAULT_LOKI_INTERVAL_SECONDS = exports.DEFAULT_LEVEL = exports.DEFAULT_APP_LABEL = exports.flushLokiTransport = exports.registerFatalHandlers = exports.redirectConsoleToNestLogger = exports.
|
|
16
|
+
exports.DEFAULT_LOKI_TIMEOUT_MS = exports.DEFAULT_LOKI_INTERVAL_SECONDS = exports.DEFAULT_LEVEL = exports.DEFAULT_APP_LABEL = exports.flushLokiTransport = exports.registerFatalHandlers = exports.redirectConsoleToNestLogger = exports.buildNestLogger = void 0;
|
|
17
17
|
var logger_1 = require("./logger");
|
|
18
18
|
Object.defineProperty(exports, "buildNestLogger", { enumerable: true, get: function () { return logger_1.buildNestLogger; } });
|
|
19
|
-
Object.defineProperty(exports, "createLokiTransport", { enumerable: true, get: function () { return logger_1.createLokiTransport; } });
|
|
20
19
|
var console_redirect_1 = require("./console-redirect");
|
|
21
20
|
Object.defineProperty(exports, "redirectConsoleToNestLogger", { enumerable: true, get: function () { return console_redirect_1.redirectConsoleToNestLogger; } });
|
|
22
21
|
var fatal_handlers_1 = require("./fatal-handlers");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;EAYE;;;AAEF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;EAYE;;;AAEF,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAGxB,uDAAiE;AAAxD,+HAAA,2BAA2B,OAAA;AAGpC,mDAA6E;AAApE,uHAAA,qBAAqB,OAAA;AAAE,oHAAA,kBAAkB,OAAA;AAElD,qCAKmB;AAJjB,4GAAA,iBAAiB,OAAA;AACjB,wGAAA,aAAa,OAAA;AACb,wHAAA,6BAA6B,OAAA;AAC7B,kHAAA,uBAAuB,OAAA"}
|
package/dist/logger.d.ts
CHANGED
|
@@ -1,30 +1,11 @@
|
|
|
1
1
|
import LokiTransport = require('winston-loki');
|
|
2
2
|
import type { LoggerService } from '@nestjs/common';
|
|
3
|
-
import { LoggerOptions
|
|
3
|
+
import { LoggerOptions } from './options';
|
|
4
4
|
export interface BuiltLogger {
|
|
5
5
|
logger: LoggerService;
|
|
6
6
|
unregisterFatalHandlers?: () => void;
|
|
7
7
|
lokiTransport?: LokiTransport;
|
|
8
8
|
}
|
|
9
|
-
export interface CreateLokiTransportOptions extends LokiOptions {
|
|
10
|
-
service: string;
|
|
11
|
-
app?: string;
|
|
12
|
-
instance?: string;
|
|
13
|
-
pretty?: boolean;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Constrói o transport do Loki isoladamente, para o consumidor COMPARTILHAR um
|
|
17
|
-
* único batcher entre vários loggers do mesmo processo.
|
|
18
|
-
*
|
|
19
|
-
* Use isto quando o serviço monta mais de um logger — o worker do gyra-core monta
|
|
20
|
-
* quatro. Com um transport por logger, cada um tem seu batcher, e o flush de
|
|
21
|
-
* exceção fatal cobre só um deles.
|
|
22
|
-
*
|
|
23
|
-
* const lokiTransport = createLokiTransport({ service: 'gyra-core', host });
|
|
24
|
-
* const { logger } = buildNestLogger({ service: 'gyra-core', lokiTransport });
|
|
25
|
-
* // ...e o mesmo `lokiTransport` nos outros loggers do processo
|
|
26
|
-
*/
|
|
27
|
-
export declare const createLokiTransport: (options: CreateLokiTransportOptions) => LokiTransport;
|
|
28
9
|
/**
|
|
29
10
|
* Monta o logger do Nest com os transports pedidos e, se pedido, instala os
|
|
30
11
|
* efeitos de processo.
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"
|
|
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;AAKpD,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;AAoGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,aAAa,KAAG,WAwDxD,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.buildNestLogger =
|
|
4
|
+
exports.buildNestLogger = void 0;
|
|
5
5
|
/*
|
|
6
6
|
PROVENIÊNCIA: derivado de gyra-core/src/common/logger/LoggerFactory.ts na branch
|
|
7
7
|
GYR-1555 (tag `backup/GYR-1555-pre-close`), onde o defeito de entrega ao Loki foi
|
|
@@ -15,12 +15,19 @@ exports.buildNestLogger = exports.createLokiTransport = void 0;
|
|
|
15
15
|
para o handler de exceção fatal alcançá-lo; aqui ele volta no retorno, porque
|
|
16
16
|
estado global no pacote é o mesmo problema de ler env com outra roupa.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
Houve uma tentativa intermediária, e ela está registrada aqui porque o erro é
|
|
19
|
+
fácil de repetir: ao ver o worker do gyra-core construir QUATRO loggers, a
|
|
20
|
+
conclusão foi "eles precisam compartilhar um transport", e o pacote ganhou um
|
|
21
|
+
`createLokiTransport` para isso. Estava errado — a pergunta certa era por que
|
|
22
|
+
havia quatro loggers.
|
|
23
|
+
|
|
24
|
+
Não havia motivo: o `LoggerFactory` original não recebia argumento, então as
|
|
25
|
+
quatro chamadas sempre produziram loggers idênticos. Era cópia de código. O
|
|
26
|
+
conserto é UM logger por processo, com o handle passado adiante — e aí não
|
|
27
|
+
existe transport para compartilhar. A opção foi removida na 0.3.0.
|
|
28
|
+
|
|
29
|
+
Se algum dia um serviço precisar de dois loggers com LABELS diferentes e um só
|
|
30
|
+
batcher, aí sim a opção volta a fazer sentido. Nenhum dos 15 tem esse caso.
|
|
24
31
|
- O redirecionamento de `console.*` saiu para `console-redirect.ts`, como opt-in
|
|
25
32
|
explícito: é efeito colateral de processo, e importar um pacote não deve mudar
|
|
26
33
|
o que `console.log` faz.
|
|
@@ -82,30 +89,6 @@ const buildPrettyFormat = () => {
|
|
|
82
89
|
});
|
|
83
90
|
return winston_1.format.combine(winston_1.format.splat(), localFormat);
|
|
84
91
|
};
|
|
85
|
-
/**
|
|
86
|
-
* Constrói o transport do Loki isoladamente, para o consumidor COMPARTILHAR um
|
|
87
|
-
* único batcher entre vários loggers do mesmo processo.
|
|
88
|
-
*
|
|
89
|
-
* Use isto quando o serviço monta mais de um logger — o worker do gyra-core monta
|
|
90
|
-
* quatro. Com um transport por logger, cada um tem seu batcher, e o flush de
|
|
91
|
-
* exceção fatal cobre só um deles.
|
|
92
|
-
*
|
|
93
|
-
* const lokiTransport = createLokiTransport({ service: 'gyra-core', host });
|
|
94
|
-
* const { logger } = buildNestLogger({ service: 'gyra-core', lokiTransport });
|
|
95
|
-
* // ...e o mesmo `lokiTransport` nos outros loggers do processo
|
|
96
|
-
*/
|
|
97
|
-
const createLokiTransport = (options) => {
|
|
98
|
-
const { service, app, instance, pretty, ...loki } = options;
|
|
99
|
-
return buildLokiTransport(loki, {
|
|
100
|
-
service,
|
|
101
|
-
app: app ?? options_1.DEFAULT_APP_LABEL,
|
|
102
|
-
instance: instance ?? (0, os_1.hostname)(),
|
|
103
|
-
...loki.labels,
|
|
104
|
-
}, pretty
|
|
105
|
-
? buildPrettyFormat()
|
|
106
|
-
: winston_1.format.combine(winston_1.format.timestamp(), winston_1.format.json()));
|
|
107
|
-
};
|
|
108
|
-
exports.createLokiTransport = createLokiTransport;
|
|
109
92
|
const buildLokiTransport = (loki, labels, lineFormat) => new LokiTransport({
|
|
110
93
|
host: loki.host,
|
|
111
94
|
basicAuth: loki.basicAuth,
|
|
@@ -149,25 +132,11 @@ const buildNestLogger = (options) => {
|
|
|
149
132
|
const lineFormat = options.pretty
|
|
150
133
|
? buildPrettyFormat()
|
|
151
134
|
: winston_1.format.combine(winston_1.format.timestamp(), winston_1.format.json());
|
|
152
|
-
/*
|
|
153
|
-
Passar os dois é ambíguo: um pede para construir um transport novo, o outro
|
|
154
|
-
para reusar um existente. Falhar alto é melhor que escolher em silêncio e
|
|
155
|
-
deixar o consumidor com dois batchers sem saber.
|
|
156
|
-
*/
|
|
157
|
-
if (options.loki && options.lokiTransport) {
|
|
158
|
-
throw new Error('[log-transport] `loki` e `lokiTransport` sao mutuamente exclusivos: ' +
|
|
159
|
-
'use `loki` para construir um transport novo, ou `lokiTransport` para ' +
|
|
160
|
-
'reusar um ja construido por createLokiTransport().');
|
|
161
|
-
}
|
|
162
135
|
const transportsList = [
|
|
163
136
|
new winston_1.transports.Console({ format: lineFormat }),
|
|
164
137
|
];
|
|
165
138
|
let lokiTransport;
|
|
166
|
-
if (options.
|
|
167
|
-
lokiTransport = options.lokiTransport;
|
|
168
|
-
transportsList.push(lokiTransport);
|
|
169
|
-
}
|
|
170
|
-
else if (options.loki) {
|
|
139
|
+
if (options.loki) {
|
|
171
140
|
lokiTransport = buildLokiTransport(options.loki, {
|
|
172
141
|
service: options.service,
|
|
173
142
|
app: options.app ?? options_1.DEFAULT_APP_LABEL,
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,uDAAuD;;;AAEvD
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/options.d.ts
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
export interface LokiTransportLike {
|
|
2
|
-
log?: unknown;
|
|
3
|
-
flush?: () => Promise<void>;
|
|
4
|
-
close?: () => void;
|
|
5
|
-
once?: (event: string, listener: (...args: unknown[]) => void) => unknown;
|
|
6
|
-
off?: (event: string, listener: (...args: unknown[]) => void) => unknown;
|
|
7
|
-
}
|
|
8
1
|
export interface LokiOptions {
|
|
9
2
|
host: string;
|
|
10
3
|
basicAuth?: string;
|
|
@@ -26,7 +19,6 @@ export interface LoggerOptions {
|
|
|
26
19
|
instance?: string;
|
|
27
20
|
pretty?: boolean;
|
|
28
21
|
loki?: LokiOptions;
|
|
29
|
-
lokiTransport?: LokiTransportLike;
|
|
30
22
|
file?: FileOptions;
|
|
31
23
|
redirectConsole?: boolean;
|
|
32
24
|
fatalHandlers?: boolean | FatalHandlersOptions;
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"
|
|
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;IAYjB,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;;;AAiHW,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": "0.
|
|
3
|
+
"version": "0.4.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,11 +25,11 @@
|
|
|
25
25
|
"prepack": "npm run build"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
+
"nest-winston": "^1.9.4",
|
|
29
|
+
"winston": "^3.13.1",
|
|
28
30
|
"winston-loki": "^6.1.6"
|
|
29
31
|
},
|
|
30
32
|
"peerDependencies": {
|
|
31
|
-
"@nestjs/common": ">=10"
|
|
32
|
-
"nest-winston": "^1.9.4",
|
|
33
|
-
"winston": "^3.13.1"
|
|
33
|
+
"@nestjs/common": ">=10"
|
|
34
34
|
}
|
|
35
35
|
}
|
package/src/fatal-handlers.ts
CHANGED
|
@@ -109,9 +109,10 @@ const describeReason = (
|
|
|
109
109
|
linhas `[FATAL]`, quatro flushes concorrentes no mesmo transport e quatro
|
|
110
110
|
chamadas de exit.
|
|
111
111
|
|
|
112
|
-
O risco
|
|
113
|
-
|
|
114
|
-
handler por logger.
|
|
112
|
+
O risco aparece em serviço que constrói mais de um logger — o que, na frota, era
|
|
113
|
+
o padrão: 13 dos 15 repos chamavam a fábrica mais de uma vez. Nesses, registrar um
|
|
114
|
+
handler por logger é o erro natural. A orientação é construir UM logger por
|
|
115
|
+
processo, mas o guard existe para o caso de alguém não seguir.
|
|
115
116
|
|
|
116
117
|
Este é o único estado global do pacote, e a distinção importa: ele descreve o
|
|
117
118
|
PROCESSO — se os handlers já estão instalados nele —, não configuração. Config
|
|
@@ -145,8 +146,8 @@ const registerFatalHandlers = (
|
|
|
145
146
|
level: 'warn',
|
|
146
147
|
message:
|
|
147
148
|
'[FATAL-HANDLERS-DUP] registerFatalHandlers chamado mais de uma vez ' +
|
|
148
|
-
'neste processo; a chamada extra foi ignorada.
|
|
149
|
-
'
|
|
149
|
+
'neste processo; a chamada extra foi ignorada. Construa UM logger por ' +
|
|
150
|
+
'processo e registre uma vez.',
|
|
150
151
|
timestamp: new Date().toISOString(),
|
|
151
152
|
})}\n`,
|
|
152
153
|
);
|
package/src/index.ts
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
`dist/` e fariam um grep de auditoria acusar o pacote de ler ambiente.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
export { buildNestLogger
|
|
16
|
-
export type { BuiltLogger
|
|
15
|
+
export { buildNestLogger } from './logger';
|
|
16
|
+
export type { BuiltLogger } from './logger';
|
|
17
17
|
|
|
18
18
|
export { redirectConsoleToNestLogger } from './console-redirect';
|
|
19
19
|
export type { ConsoleRedirectOptions } from './console-redirect';
|
|
@@ -30,5 +30,5 @@ export type {
|
|
|
30
30
|
LoggerOptions,
|
|
31
31
|
LokiOptions,
|
|
32
32
|
FileOptions,
|
|
33
|
-
|
|
33
|
+
FatalHandlersOptions,
|
|
34
34
|
} from './options';
|
package/src/logger.ts
CHANGED
|
@@ -13,12 +13,19 @@
|
|
|
13
13
|
para o handler de exceção fatal alcançá-lo; aqui ele volta no retorno, porque
|
|
14
14
|
estado global no pacote é o mesmo problema de ler env com outra roupa.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
Houve uma tentativa intermediária, e ela está registrada aqui porque o erro é
|
|
17
|
+
fácil de repetir: ao ver o worker do gyra-core construir QUATRO loggers, a
|
|
18
|
+
conclusão foi "eles precisam compartilhar um transport", e o pacote ganhou um
|
|
19
|
+
`createLokiTransport` para isso. Estava errado — a pergunta certa era por que
|
|
20
|
+
havia quatro loggers.
|
|
21
|
+
|
|
22
|
+
Não havia motivo: o `LoggerFactory` original não recebia argumento, então as
|
|
23
|
+
quatro chamadas sempre produziram loggers idênticos. Era cópia de código. O
|
|
24
|
+
conserto é UM logger por processo, com o handle passado adiante — e aí não
|
|
25
|
+
existe transport para compartilhar. A opção foi removida na 0.3.0.
|
|
26
|
+
|
|
27
|
+
Se algum dia um serviço precisar de dois loggers com LABELS diferentes e um só
|
|
28
|
+
batcher, aí sim a opção volta a fazer sentido. Nenhum dos 15 tem esse caso.
|
|
22
29
|
- O redirecionamento de `console.*` saiu para `console-redirect.ts`, como opt-in
|
|
23
30
|
explícito: é efeito colateral de processo, e importar um pacote não deve mudar
|
|
24
31
|
o que `console.log` faz.
|
|
@@ -131,44 +138,6 @@ const buildPrettyFormat = (): Logform.Format => {
|
|
|
131
138
|
return format.combine(format.splat(), localFormat);
|
|
132
139
|
};
|
|
133
140
|
|
|
134
|
-
export interface CreateLokiTransportOptions extends LokiOptions {
|
|
135
|
-
service: string;
|
|
136
|
-
app?: string;
|
|
137
|
-
instance?: string;
|
|
138
|
-
pretty?: boolean;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Constrói o transport do Loki isoladamente, para o consumidor COMPARTILHAR um
|
|
143
|
-
* único batcher entre vários loggers do mesmo processo.
|
|
144
|
-
*
|
|
145
|
-
* Use isto quando o serviço monta mais de um logger — o worker do gyra-core monta
|
|
146
|
-
* quatro. Com um transport por logger, cada um tem seu batcher, e o flush de
|
|
147
|
-
* exceção fatal cobre só um deles.
|
|
148
|
-
*
|
|
149
|
-
* const lokiTransport = createLokiTransport({ service: 'gyra-core', host });
|
|
150
|
-
* const { logger } = buildNestLogger({ service: 'gyra-core', lokiTransport });
|
|
151
|
-
* // ...e o mesmo `lokiTransport` nos outros loggers do processo
|
|
152
|
-
*/
|
|
153
|
-
export const createLokiTransport = (
|
|
154
|
-
options: CreateLokiTransportOptions,
|
|
155
|
-
): LokiTransport => {
|
|
156
|
-
const { service, app, instance, pretty, ...loki } = options;
|
|
157
|
-
|
|
158
|
-
return buildLokiTransport(
|
|
159
|
-
loki,
|
|
160
|
-
{
|
|
161
|
-
service,
|
|
162
|
-
app: app ?? DEFAULT_APP_LABEL,
|
|
163
|
-
instance: instance ?? hostname(),
|
|
164
|
-
...loki.labels,
|
|
165
|
-
},
|
|
166
|
-
pretty
|
|
167
|
-
? buildPrettyFormat()
|
|
168
|
-
: format.combine(format.timestamp(), format.json()),
|
|
169
|
-
);
|
|
170
|
-
};
|
|
171
|
-
|
|
172
141
|
const buildLokiTransport = (
|
|
173
142
|
loki: LokiOptions,
|
|
174
143
|
labels: Record<string, string>,
|
|
@@ -225,29 +194,13 @@ export const buildNestLogger = (options: LoggerOptions): BuiltLogger => {
|
|
|
225
194
|
? buildPrettyFormat()
|
|
226
195
|
: format.combine(format.timestamp(), format.json());
|
|
227
196
|
|
|
228
|
-
/*
|
|
229
|
-
Passar os dois é ambíguo: um pede para construir um transport novo, o outro
|
|
230
|
-
para reusar um existente. Falhar alto é melhor que escolher em silêncio e
|
|
231
|
-
deixar o consumidor com dois batchers sem saber.
|
|
232
|
-
*/
|
|
233
|
-
if (options.loki && options.lokiTransport) {
|
|
234
|
-
throw new Error(
|
|
235
|
-
'[log-transport] `loki` e `lokiTransport` sao mutuamente exclusivos: ' +
|
|
236
|
-
'use `loki` para construir um transport novo, ou `lokiTransport` para ' +
|
|
237
|
-
'reusar um ja construido por createLokiTransport().',
|
|
238
|
-
);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
197
|
const transportsList: any[] = [
|
|
242
198
|
new transports.Console({ format: lineFormat }),
|
|
243
199
|
];
|
|
244
200
|
|
|
245
201
|
let lokiTransport: LokiTransport | undefined;
|
|
246
202
|
|
|
247
|
-
if (options.
|
|
248
|
-
lokiTransport = options.lokiTransport as LokiTransport;
|
|
249
|
-
transportsList.push(lokiTransport);
|
|
250
|
-
} else if (options.loki) {
|
|
203
|
+
if (options.loki) {
|
|
251
204
|
lokiTransport = buildLokiTransport(
|
|
252
205
|
options.loki,
|
|
253
206
|
{
|
package/src/options.ts
CHANGED
|
@@ -15,37 +15,6 @@
|
|
|
15
15
|
Quem lê env é o serviço, no entrypoint, onde o env já mora hoje.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
/*
|
|
19
|
-
Estrutura mínima do transport que o pacote manipula, declarada aqui para o
|
|
20
|
-
`options.ts` não precisar importar o winston-loki.
|
|
21
|
-
|
|
22
|
-
Lista os membros que são de fato tocados — `log` pelo winston ao montar o
|
|
23
|
-
logger, e `flush`/`close`/`once`/`off` pelo caminho de exceção fatal.
|
|
24
|
-
|
|
25
|
-
Era `object`, que aceitava `{ qualquer: 'coisa' }` e até um `Date` em tempo de
|
|
26
|
-
compilação; o erro só aparecia no boot, quando o winston recusava o transport
|
|
27
|
-
com "Invalid transport, must be an object with a log method".
|
|
28
|
-
*/
|
|
29
|
-
export interface LokiTransportLike {
|
|
30
|
-
/*
|
|
31
|
-
Todos os membros são opcionais, e isso é deliberado — não desleixo.
|
|
32
|
-
|
|
33
|
-
Não existe membro que dê para exigir: o tipo real do `LokiTransport` declara
|
|
34
|
-
`log` e `flush` como opcionais, então exigir qualquer um deles rejeitaria o
|
|
35
|
-
transport de verdade. Tentei, e o `tsc` recusou o caso legítimo.
|
|
36
|
-
|
|
37
|
-
Com todos opcionais, a detecção de "weak type" do TypeScript faz o trabalho:
|
|
38
|
-
um objeto sem NENHUMA propriedade em comum com esta interface é rejeitado. É o
|
|
39
|
-
suficiente para pegar `{ qualquer: 'coisa' }` e `Date`, que passavam quando o
|
|
40
|
-
tipo era `object`.
|
|
41
|
-
*/
|
|
42
|
-
log?: unknown;
|
|
43
|
-
flush?: () => Promise<void>;
|
|
44
|
-
close?: () => void;
|
|
45
|
-
once?: (event: string, listener: (...args: unknown[]) => void) => unknown;
|
|
46
|
-
off?: (event: string, listener: (...args: unknown[]) => void) => unknown;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
18
|
export interface LokiOptions {
|
|
50
19
|
/* Endereço do Loki. Sem ele não há para onde enviar, então é obrigatório. */
|
|
51
20
|
host: string;
|
|
@@ -119,29 +88,13 @@ export interface LoggerOptions {
|
|
|
119
88
|
`LOG_GRAFANA_LOKI === 'true'`. Ausente significa não enviar, e o pacote não
|
|
120
89
|
precisa parsear string booleana.
|
|
121
90
|
|
|
122
|
-
Cada chamada
|
|
123
|
-
|
|
91
|
+
Cada chamada constrói um transport novo — e é por isso que o serviço deve
|
|
92
|
+
construir UM logger por processo e passar o handle adiante, em vez de chamar
|
|
93
|
+
isto várias vezes. N loggers seriam N batchers, e a descarga de exceção fatal
|
|
94
|
+
alcançaria apenas um deles.
|
|
124
95
|
*/
|
|
125
96
|
loki?: LokiOptions;
|
|
126
97
|
|
|
127
|
-
/*
|
|
128
|
-
Transport já construído, para COMPARTILHAR um único batcher entre vários
|
|
129
|
-
loggers do mesmo processo.
|
|
130
|
-
|
|
131
|
-
Isto não é conveniência, é correção. O worker do gyra-core monta quatro
|
|
132
|
-
loggers — um para a app e três para conexões RMQ. Com quatro transports
|
|
133
|
-
independentes há quatro batchers, e o `registerFatalHandlers` drena apenas o
|
|
134
|
-
que recebeu: as linhas bufferizadas nos outros três morrem com o processo, que
|
|
135
|
-
é exatamente o sintoma que a entrega confiável existe para impedir.
|
|
136
|
-
|
|
137
|
-
A fonte original resolvia isso com um singleton de módulo. Aqui a decisão fica
|
|
138
|
-
com o consumidor — ele chama `createLokiTransport` uma vez e passa o mesmo
|
|
139
|
-
transport para cada logger — sem estado global escondido no pacote.
|
|
140
|
-
|
|
141
|
-
Mutuamente exclusivo com `loki`.
|
|
142
|
-
*/
|
|
143
|
-
lokiTransport?: LokiTransportLike;
|
|
144
|
-
|
|
145
98
|
/*
|
|
146
99
|
Transport de arquivo, usado quando não há Loki. Mantém a precedência do código
|
|
147
100
|
original: havendo `loki`, o arquivo é ignorado.
|