winston
versi?_ 3.2.1winston@2
winston@3
node -v
keluaran:_ v12.8.1Winston tampaknya tidak mencatat pengecualian, tampaknya tidak mengurai objek kesalahan dengan benar.
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
}
Debug lebih lanjut menggunakan debugger VSCode
// 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)
Saya berharap Winston mencatat kesalahan yang tertangkap dari blok try...catch. Jika saya memasukkan ex.message
alih-alih hanya ex
, itu menghasilkan dengan benar. ex
didefinisikan di seluruh blok catch, tetapi Winston tampaknya tidak dapat menguraikannya karena alasan tertentu.
Lebih jauh lagi, jika saya return ex
dari dalam blok tangkap, dan kemudian mengelilingi semua yang ada di dalam blok tangkap lain, tampaknya menampilkannya dengan benar. Untuk lebih lanjut tentang perilaku yang tidak biasa ini, silakan lihat inti di sini dari pos dukungan yang saya buat di Discord sebelum saya menyadari ini adalah bug dengan Winston.
Selain itu, saya pikir kesalahan ini juga menyebabkan masalah yang dialami pengguna lain selama sebulan terakhir di #1758
Saya percaya ini mungkin karena perilaku yang tidak konsisten antara penebang dan pengangkutan winston saat menerapkan format. Di winston-transport, bagian dari fungsi TransportStream _write melakukan ini:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
Kode yang relevan di winston/logger.js terlihat seperti ini:
this.push(this.format.transform(info, this.format.options));
Berikut adalah repro yang disederhanakan dari masalah ini.
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'
Tidak jelas bagi saya perilaku mana yang harus disukai.
Saya ingin tahu apakah ini juga kasus yang sama ketika winston tidak mencatat beberapa objek dengan benar dan mencetaknya sebagai [object Object]
sementara objek lain mencetak tanpa masalah
@jleverenz
Terima kasih, penemuan yang bagus! Menghasilkan solusi sederhana untuk masalah saya, yang sama dengan https://github.com/winstonjs/winston/issues/1758
Komentar yang paling membantu
Saya percaya ini mungkin karena perilaku yang tidak konsisten antara penebang dan pengangkutan winston saat menerapkan format. Di winston-transport, bagian dari fungsi TransportStream _write melakukan ini:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
Kode yang relevan di winston/logger.js terlihat seperti ini:
this.push(this.format.transform(info, this.format.options));
Berikut adalah repro yang disederhanakan dari masalah ini.
Tidak jelas bagi saya perilaku mana yang harus disukai.