winston
Version?_ 3.2.1winston@2
winston@3
node -v
Ausgaben:_ v12.8.1Winston scheint keine Ausnahmen zu protokollieren, es scheint das Fehlerobjekt nicht richtig zu analysieren.
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
transports: [
new winston.transports.File({
filename: `./logs/error-${momentLogger.unix()}.log`,
level: 'error'
}),
new winston.transports.File({
filename: `./logs/debug-${momentLogger.unix()}.log`,
level: 'debug'
}),
new winston.transports.File({
filename: `./logs/combined-${momentLogger.unix()}.log`
}),
new winston.transports.Console({
format: winston.format.simple()
})
]
});
try {
logger.debug(folderIdRegex.exec(event.link)[1]);
} catch (ex) {
console.log(ex); // Correctly prints
logger.info(ex); // Undefined
logger.debug(ex); // Undefined
logger.error(ex); // Undefined
}
Weiteres Debugging mit dem VSCode-Debugger
// Output
TypeError: Cannot read property '1' of null
at .....google-sheets-scraping-testing.js:188:51
at processTicksAndRejections (internal/process/task_queues.js:85:5)
info: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
error: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
// Here I started using the built-in debug terminal
ex // Input into debug console
> TypeError: Cannot read property '1' of null // Result of ex
logger.log(ex) // Input into debug console
info: undefined {"timestamp":"2020-03-04T20:11:13.924Z"} // Result of logger.log(ex)
> DerivedLogger {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 3, _maxListeners: undefined, …} // Result of logger.log(ex)
Ich erwarte, dass Winston den abgefangenen Fehler aus dem try...catch-Block protokolliert. Wenn ich stattdessen ex.message
anstelle von nur ex
, wird es richtig ausgegeben. ex
ist im gesamten catch-Block definiert, aber Winston scheint aus irgendeinem Grund nicht in der Lage zu sein, ihn zu parsen.
Außerdem, wenn ich return ex
aus dem catch-Block heraus schreibe und dann alles in einem anderen catch-Block umschließe, scheint es richtig ausgegeben zu werden. Weitere Informationen zu diesem ungewöhnlichen Verhalten finden
Außerdem denke ich, dass dieser Fehler auch das Problem mit sich bringt, das ein anderer Benutzer im letzten Monat bei #1758 hatte
Ich glaube, dies kann auf das inkonsistente Verhalten zwischen Winston-Loggern und Transportunternehmen beim Anwenden von Formaten zurückzuführen sein. In winston-transport macht ein Teil der TransportStream _write-Funktion dies:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
Der entsprechende Code in winston/logger.js sieht so aus:
this.push(this.format.transform(info, this.format.options));
Hier ist eine vereinfachte Reproduktion des Problems.
const winston = require('winston');
// First logger uses a format configured on logger
const logger1 = winston.createLogger({
level: 'info',
transports: new winston.transports.Console(),
format: winston.format.simple()
});
// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
level: 'info',
transports: new winston.transports.Console({
format: winston.format.simple()
})
});
logger1.info(new Error('err message')); // logs expected 'err message'
logger2.info(new Error('err message')); // logs 'undefined'
Mir ist nicht klar, welches Verhalten bevorzugt werden soll.
Ich frage mich, ob dies auch derselbe Fall ist, wenn Winston einige Objekte nicht richtig protokolliert und als [object Object]
druckt, während andere Objekte ohne Probleme drucken
@jleverenz
Danke, toller Fund! Hat eine einfache Problemumgehung für mein Problem ergeben, die mit https://github.com/winstonjs/winston/issues/1758 identisch war
Hilfreichster Kommentar
Ich glaube, dies kann auf das inkonsistente Verhalten zwischen Winston-Loggern und Transportunternehmen beim Anwenden von Formaten zurückzuführen sein. In winston-transport macht ein Teil der TransportStream _write-Funktion dies:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
Der entsprechende Code in winston/logger.js sieht so aus:
this.push(this.format.transform(info, this.format.options));
Hier ist eine vereinfachte Reproduktion des Problems.
Mir ist nicht klar, welches Verhalten bevorzugt werden soll.