Winston: Di 3.0.0 saya tidak bisa mencatat objek tanpa menggunakan JSON.stringify

Dibuat pada 22 Feb 2018  ·  18Komentar  ·  Sumber: winstonjs/winston

Saya menggunakan versi 3, tetapi karena saya telah memutakhirkan, satu-satunya cara untuk mencatat objek adalah dengan merangkai objek terlebih dahulu.
Tetapi dengan kesalahan bahkan lebih buruk karena saya tidak dapat mencatat kesalahan sama sekali, saya perlu menggunakan error.message atau langsung ke konsol.

Ini adalah konfigurasi saya untuk lingkungan pengembangan:

`` const { createLogger, format, transports } = require('winston');
const { gabungkan, stempel waktu, label, printf } = format;

const environment = process.env.NODE_ENV;
const timestampFormat = 'YYYY-MM-DD HH:mm:SS';

const loggerFormat = printf((info) => {
    return `[${info.label}] ${info.message}`;
});
logger = createLogger({
    format: combine(
        label({ label: 'immoliste' }),
        format.colorize({ all: true }),
        format.splat(),
        format.simple(),
        loggerFormat
    ),
    transports: [
        new transports.Console({
            level: 'debug',
            colorized: true
        })
    ]
});

Melakukan ini:

logger.error('Error sending contact message:', JSON.stringify(err));

Saya hanya mendapat:

[mylabel] Error sending contact message:

Tetapi apakah menyusahkan karena harus merangkai segalanya, dan melakukan itu untuk kesalahan. Apa yang saya lakukan salah?, karena di versi sebelumnya itu mudah.

Komentar yang paling membantu

Serius, ini sepertinya penurunan peringkat. Dengan Winston 2, saya bisa mengganti semua console.X dengan winston.X . Mengapa tiba-tiba tag format jelek?

Semua 18 komentar

+1

@eyp bisa coba ini?

logger.error('Error sending contact message:%o', {foo: "bar"});

Sumber yang mendasari ada di sini:

https://github.com/winstonjs/logform/blob/master/splat.js

yang dapat Anda lihat menggunakan util.format dari node

https://nodejs.org/api/util.html#util_util_format_format_args

jadi %o , %O dan %j melakukan pekerjaan

%o

bekerja seperti pesona, saya tidak tahu winston menggunakan params pemformatan yang sama dari util.format.

Terima kasih!

winston 3.1.0
Saya mencoba ini sebagai menulis di sini:
const debugConsole = baru winston.transports.Console({
tingkat: 'debug',
format: winston.format.combine(winston.format.simple()),
handleExceptions: benar
})
logger.add(debugConsole)

Dalam kode yang saya gunakan: logger.debug('%o', req.query)
Saya melihat objek json, tetapi saya juga melihat "%o" sebelumnya, log konsol di bawah ini:
debug: %o {"offset":"73000","count":"3","timestamp":"29-10-2018 15:02:08"}
apa yang saya lakukan?

Umumnya %o dipanggil oleh util.format() di mana Anda menentukan objek yang Anda inginkan di sana. Dari output sepertinya Anda bahkan tidak perlu %o karena objek sedang ditampilkan.

Cukup gunakan ini sebagai gantinya, logger.debug(req.query) dan itu akan berfungsi. Atau Anda dapat menyimpannya dalam variabel dengan util.format seperti ini
const queryFormatted = util.format('%o', req.query)
logger.debug (diformat kueri)

@frenzymind Atau coba solusi yang diposting ke edisi asli oleh @mingchuno.

Cukup gunakan ini sebagai gantinya, logger.debug(req.query) dan itu akan berfungsi

@eponymz Dalam hal ini ada: debug: [object Object] {"timestamp":"30-10-2018 11:14:04"}

const queryFormatted = util.format('%o', req.query)

Ini berfungsi, tetapi berisik.

Apakah output dari yang kedua yang Anda inginkan? Maksud saya, jika Anda menginginkan kueri di log, apakah itu ditampilkan. Jika tidak coba solusi yang disebutkan sebelum mingchuno diposting.

Ya, cara kedua berfungsi seperti yang saya inginkan. Saya melihat data objek json.
Jika saya mengerti benar, mingchuno menyarankan untuk menggunakan %o dalam string, karena winston menggunakan util "di bawah tenda". Saya mencobanya dan itu berhasil, tetapi %o juga dicetak dalam kasus saya. Saya juga menambahkan format splat() ke level debug saya, tetapi tidak ada yang berubah. Apakah saya melewatkan sesuatu?

Ya, saya melihat %o telah ditambahkan sebelumnya ke inspeksi objek. Saya kira itu semacam bug?

Apakah itu pilihan desain yang disengaja? Ini sedikit menyimpang dari standar (dan saya butuh waktu berjam-jam untuk menemukannya) alih-alih

console.log('Log me plz: ', {'ok': 'logged'});

harus (winston 3.x) mengubah semua panggilan masuk ke

logger.info('Log me plz: %o', {'ok':'logged'});

Maaf, apakah saya benar? Saya bingung...

Serius, ini sepertinya penurunan peringkat. Dengan Winston 2, saya bisa mengganti semua console.X dengan winston.X . Mengapa tiba-tiba tag format jelek?

Jadi perbaikannya adalah menambahkan %o ke setiap pernyataan logging yang ingin saya cetak objek?

Ya!

Tidak dapat menerima bahwa saya harus selalu menggunakan %o dan membuat solusi sederhana ini:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

Jadi pencatat ini....

  logger.info({ hi: 123 })

... berubah menjadi ini di konsol

info: {
    "hi": 123
}

Semoga saya bisa membantu kalian :D Sangat buruk jika kita selalu memiliki dua penggunaan "%o"

Tidak dapat menerima bahwa saya harus selalu menggunakan %o dan membuat solusi sederhana ini:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

Jadi pencatat ini....

  logger.info({ hi: 123 })

... berubah menjadi ini di konsol

info: {
    "hi": 123
}

Semoga saya bisa membantu kalian :D Sangat buruk jika kita selalu memiliki dua penggunaan "%o"

Bagus, tapi aneh, apakah saya perlu melakukannya untuk semua level logger saya?

Sekedar informasi, lebih baik digunakan
```javascript
typeof info.message === 'objek'
````
dari pada

```javascript
info.message.constructor === Objek
````
Ini menghindari kesalahan ketika pesan nol atau tidak terdefinisi dan array akan ditampilkan dengan benar
(mis: [{hai: "456"}]

Apakah halaman ini membantu?
0 / 5 - 0 peringkat