@gyramais/log-transport 0.4.2 → 0.5.1
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 +61 -3
- package/dist/logger.js.map +1 -1
- package/package.json +1 -1
- package/src/logger.ts +69 -3
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;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;
|
|
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;AA8ID;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,aAAa,KAAG,WA8FxD,CAAC"}
|
package/dist/logger.js
CHANGED
|
@@ -89,6 +89,42 @@ const buildPrettyFormat = () => {
|
|
|
89
89
|
});
|
|
90
90
|
return winston_1.format.combine(winston_1.format.splat(), localFormat);
|
|
91
91
|
};
|
|
92
|
+
/*
|
|
93
|
+
O `winston-loki` monta `new URL(host + '/loki/api/v1/push')` na CONSTRUÇÃO do
|
|
94
|
+
transport (batcher.js:43), então host vazio ou inválido lança `TypeError: Invalid
|
|
95
|
+
URL` e o serviço inteiro não sobe — API e worker.
|
|
96
|
+
|
|
97
|
+
Isso não é regressão (o `winston-loki@6.1.2` da frota lança igual), mas o tipo não
|
|
98
|
+
protege: `host: string` é obrigatório, e os 15 consumidores compilam com
|
|
99
|
+
`strictNullChecks: false`, então `process.env.LOKI_URL` type-checa liso mesmo
|
|
100
|
+
quando o env não existe. O argumento que vale para `service` — erro de compilação
|
|
101
|
+
em vez de descoberta em produção — simplesmente não se transfere para cá.
|
|
102
|
+
|
|
103
|
+
Um pacote cujo objetivo é não perder log não pode ser a razão de o serviço não
|
|
104
|
+
subir. Host inválido degrada para console COM diagnóstico audível, que é o mesmo
|
|
105
|
+
princípio do `[LOKI-SHIP-FAIL]`: falha de entrega é ruidosa, nunca silenciosa.
|
|
106
|
+
*/
|
|
107
|
+
const isUsableHost = (host) => {
|
|
108
|
+
if (typeof host !== 'string' || !host.trim()) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const { protocol } = new URL(host);
|
|
113
|
+
return protocol === 'http:' || protocol === 'https:';
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const warnInvalidHost = (host) => {
|
|
120
|
+
process.stdout.write(`${JSON.stringify({
|
|
121
|
+
level: 'error',
|
|
122
|
+
message: `[LOKI-CONFIG-INVALID] host=${JSON.stringify(host ?? null)} ` +
|
|
123
|
+
'nao e uma URL http(s) utilizavel; seguindo so com Console. ' +
|
|
124
|
+
'Nenhum log sera enviado ao destino remoto.',
|
|
125
|
+
timestamp: new Date().toISOString(),
|
|
126
|
+
})}\n`);
|
|
127
|
+
};
|
|
92
128
|
const buildLokiTransport = (loki, labels, lineFormat) => new LokiTransport({
|
|
93
129
|
host: loki.host,
|
|
94
130
|
basicAuth: loki.basicAuth,
|
|
@@ -149,8 +185,21 @@ const buildNestLogger = (options) => {
|
|
|
149
185
|
new winston_1.transports.Console({ format: consoleFormat }),
|
|
150
186
|
];
|
|
151
187
|
let lokiTransport;
|
|
152
|
-
|
|
153
|
-
|
|
188
|
+
/*
|
|
189
|
+
O destino remoto tem precedência sobre o arquivo, e host inutilizável NÃO
|
|
190
|
+
cancela o arquivo: quem pediu `file` continua recebendo arquivo. A primeira
|
|
191
|
+
versão desta guarda (0.5.0) usava `if/else if` e o ramo do arquivo nunca era
|
|
192
|
+
avaliado quando `loki` estava presente — com `LOG_GRAFANA_LOKI=true`,
|
|
193
|
+
`LOKI_URL` vazio e `LOG_FILE=true`, o consumidor pedia dois destinos e ficava
|
|
194
|
+
só com o console, em silêncio no que diz respeito ao arquivo.
|
|
195
|
+
*/
|
|
196
|
+
const loki = options.loki;
|
|
197
|
+
const lokiUsable = Boolean(loki) && isUsableHost(loki?.host);
|
|
198
|
+
if (loki && !lokiUsable) {
|
|
199
|
+
warnInvalidHost(loki.host);
|
|
200
|
+
}
|
|
201
|
+
if (loki && lokiUsable) {
|
|
202
|
+
lokiTransport = buildLokiTransport(loki, {
|
|
154
203
|
service: options.service,
|
|
155
204
|
app: options.app ?? options_1.DEFAULT_APP_LABEL,
|
|
156
205
|
instance: options.instance ?? (0, os_1.hostname)(),
|
|
@@ -159,7 +208,16 @@ const buildNestLogger = (options) => {
|
|
|
159
208
|
transportsList.push(lokiTransport);
|
|
160
209
|
}
|
|
161
210
|
else if (options.file) {
|
|
162
|
-
|
|
211
|
+
/*
|
|
212
|
+
Mesmo formato do destino remoto, e por um motivo prático: sem `format`, o
|
|
213
|
+
transport de arquivo cai no default do winston e a linha sai
|
|
214
|
+
`{"level","message"}` — SEM timestamp. Um arquivo de log sem hora é quase
|
|
215
|
+
inútil, e a diferença passava porque nada lia o arquivo de volta.
|
|
216
|
+
*/
|
|
217
|
+
transportsList.push(new winston_1.transports.File({
|
|
218
|
+
filename: options.file.filename,
|
|
219
|
+
format: remoteFormat,
|
|
220
|
+
}));
|
|
163
221
|
}
|
|
164
222
|
const logger = nest_winston_1.WinstonModule.createLogger({
|
|
165
223
|
level: options.level ?? options_1.DEFAULT_LEVEL,
|
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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"}
|
package/package.json
CHANGED
package/src/logger.ts
CHANGED
|
@@ -138,6 +138,48 @@ const buildPrettyFormat = (): Logform.Format => {
|
|
|
138
138
|
return format.combine(format.splat(), localFormat);
|
|
139
139
|
};
|
|
140
140
|
|
|
141
|
+
/*
|
|
142
|
+
O `winston-loki` monta `new URL(host + '/loki/api/v1/push')` na CONSTRUÇÃO do
|
|
143
|
+
transport (batcher.js:43), então host vazio ou inválido lança `TypeError: Invalid
|
|
144
|
+
URL` e o serviço inteiro não sobe — API e worker.
|
|
145
|
+
|
|
146
|
+
Isso não é regressão (o `winston-loki@6.1.2` da frota lança igual), mas o tipo não
|
|
147
|
+
protege: `host: string` é obrigatório, e os 15 consumidores compilam com
|
|
148
|
+
`strictNullChecks: false`, então `process.env.LOKI_URL` type-checa liso mesmo
|
|
149
|
+
quando o env não existe. O argumento que vale para `service` — erro de compilação
|
|
150
|
+
em vez de descoberta em produção — simplesmente não se transfere para cá.
|
|
151
|
+
|
|
152
|
+
Um pacote cujo objetivo é não perder log não pode ser a razão de o serviço não
|
|
153
|
+
subir. Host inválido degrada para console COM diagnóstico audível, que é o mesmo
|
|
154
|
+
princípio do `[LOKI-SHIP-FAIL]`: falha de entrega é ruidosa, nunca silenciosa.
|
|
155
|
+
*/
|
|
156
|
+
const isUsableHost = (host: unknown): host is string => {
|
|
157
|
+
if (typeof host !== 'string' || !host.trim()) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
const { protocol } = new URL(host);
|
|
163
|
+
|
|
164
|
+
return protocol === 'http:' || protocol === 'https:';
|
|
165
|
+
} catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const warnInvalidHost = (host: unknown): void => {
|
|
171
|
+
process.stdout.write(
|
|
172
|
+
`${JSON.stringify({
|
|
173
|
+
level: 'error',
|
|
174
|
+
message:
|
|
175
|
+
`[LOKI-CONFIG-INVALID] host=${JSON.stringify(host ?? null)} ` +
|
|
176
|
+
'nao e uma URL http(s) utilizavel; seguindo so com Console. ' +
|
|
177
|
+
'Nenhum log sera enviado ao destino remoto.',
|
|
178
|
+
timestamp: new Date().toISOString(),
|
|
179
|
+
})}\n`,
|
|
180
|
+
);
|
|
181
|
+
};
|
|
182
|
+
|
|
141
183
|
const buildLokiTransport = (
|
|
142
184
|
loki: LokiOptions,
|
|
143
185
|
labels: Record<string, string>,
|
|
@@ -214,9 +256,24 @@ export const buildNestLogger = (options: LoggerOptions): BuiltLogger => {
|
|
|
214
256
|
|
|
215
257
|
let lokiTransport: LokiTransport | undefined;
|
|
216
258
|
|
|
217
|
-
|
|
259
|
+
/*
|
|
260
|
+
O destino remoto tem precedência sobre o arquivo, e host inutilizável NÃO
|
|
261
|
+
cancela o arquivo: quem pediu `file` continua recebendo arquivo. A primeira
|
|
262
|
+
versão desta guarda (0.5.0) usava `if/else if` e o ramo do arquivo nunca era
|
|
263
|
+
avaliado quando `loki` estava presente — com `LOG_GRAFANA_LOKI=true`,
|
|
264
|
+
`LOKI_URL` vazio e `LOG_FILE=true`, o consumidor pedia dois destinos e ficava
|
|
265
|
+
só com o console, em silêncio no que diz respeito ao arquivo.
|
|
266
|
+
*/
|
|
267
|
+
const loki = options.loki;
|
|
268
|
+
const lokiUsable = Boolean(loki) && isUsableHost(loki?.host);
|
|
269
|
+
|
|
270
|
+
if (loki && !lokiUsable) {
|
|
271
|
+
warnInvalidHost(loki.host);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (loki && lokiUsable) {
|
|
218
275
|
lokiTransport = buildLokiTransport(
|
|
219
|
-
|
|
276
|
+
loki,
|
|
220
277
|
{
|
|
221
278
|
service: options.service,
|
|
222
279
|
app: options.app ?? DEFAULT_APP_LABEL,
|
|
@@ -228,8 +285,17 @@ export const buildNestLogger = (options: LoggerOptions): BuiltLogger => {
|
|
|
228
285
|
|
|
229
286
|
transportsList.push(lokiTransport);
|
|
230
287
|
} else if (options.file) {
|
|
288
|
+
/*
|
|
289
|
+
Mesmo formato do destino remoto, e por um motivo prático: sem `format`, o
|
|
290
|
+
transport de arquivo cai no default do winston e a linha sai
|
|
291
|
+
`{"level","message"}` — SEM timestamp. Um arquivo de log sem hora é quase
|
|
292
|
+
inútil, e a diferença passava porque nada lia o arquivo de volta.
|
|
293
|
+
*/
|
|
231
294
|
transportsList.push(
|
|
232
|
-
new transports.File({
|
|
295
|
+
new transports.File({
|
|
296
|
+
filename: options.file.filename,
|
|
297
|
+
format: remoteFormat,
|
|
298
|
+
}),
|
|
233
299
|
);
|
|
234
300
|
}
|
|
235
301
|
|