Winston: Winston tidak mencatat/mengurai kesalahan yang tertangkap dari pengecualian

Dibuat pada 4 Mar 2020  ·  3Komentar  ·  Sumber: winstonjs/winston

Tolong beritahu kami tentang lingkungan Anda:

  • _ winston versi?_ 3.2.1

    • [ ] winston@2

    • [x] winston@3

  • _ node -v keluaran:_ v12.8.1
  • _Sistem Operasi?_ (Windows, macOS, atau Linux) Windows
  • _Bahasa?_ (semua | TypeScript XX | ES6/7 | ES5 | Dart) ES6

Apa masalahnya?

Winston 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)

Apa yang Anda harapkan terjadi sebagai gantinya?

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.

Informasi lainnya

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

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.

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.

Semua 3 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat