Winston: In 3.0.0 kann ich keine Objekte protokollieren, ohne JSON.stringify zu verwenden

Erstellt am 22. Feb. 2018  ·  18Kommentare  ·  Quelle: winstonjs/winston

Ich bin auf Version 3, aber seit ich aktualisiert habe, besteht die einzige Möglichkeit zum Protokollieren von Objekten darin, zuerst das Objekt zu stringifizieren.
Aber mit Fehlern ist es noch schlimmer, weil ich den Fehler überhaupt nicht protokollieren kann, ich muss error.message oder direkt die Konsole verwenden.

Dies ist meine Konfiguration für die Entwicklungsumgebung:

`` const { createLogger, format, transports } = require('winston');
const { Combine, Timestamp, 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
        })
    ]
});

Dies tun:

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

Ich habe nur:

[mylabel] Error sending contact message:

Aber es ist nervig, alles aneinanderreihen zu müssen, und das bei Fehlern. Was mache ich falsch?, denn in früheren Versionen war es einfach.

Hilfreichster Kommentar

Im Ernst, das scheint ein Downgrade zu sein. Mit Winston 2 konnte ich einfach alle console.X durch winston.X ersetzen. Warum plötzlich die hässlichen Format-Tags?

Alle 18 Kommentare

+1

@eyp kannst du das versuchen?

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

Die zugrunde liegende Quelle ist hier:

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

was Sie sehen können, verwenden Sie util.format vom Knoten

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

also %o , %O und %j erledigt die Arbeit

%o

funktioniert wie ein Zauber, ich wusste nicht, dass Winston die gleichen Formatierungsparameter verwendet wie util.format.

Danke schön!

Winston 3.1.0
Ich versuche dies hier zu schreiben:
const debugConsole = new winston.transports.Console({
Ebene: 'debuggen',
format: winston.format.combine(winston.format.simple()),
handleExceptions: wahr
})
logger.add (debugConsole)

Im Code verwende ich: logger.debug('%o', req.query)
Ich sehe das json-Objekt, aber ich sehe auch "%o" vorher, Konsolenprotokoll unten:
debug: %o {"offset":"73000","count":"3","timestamp":"2018-10-29 15:02:08"}
Was mache ich?

Im Allgemeinen wird %o von util.format() aufgerufen, wo Sie das gewünschte Objekt angeben. Aus der Ausgabe sieht es so aus, als ob Sie %o nicht einmal benötigen, da das Objekt angezeigt wird.

Verwenden Sie stattdessen einfach logger.debug(req.query) und es sollte funktionieren. Oder Sie können es wie folgt in einer Variablen mit util.format speichern
const queryFormatted = util.format('%o', req.query)
logger.debug (queryFormatted)

@frenzymind Oder probieren Sie die Problemumgehung aus, die von @mingchuno in der ursprünglichen Ausgabe gepostet wurde.

Verwenden Sie stattdessen einfach logger.debug(req.query) und es sollte funktionieren

@eponymz In diesem Fall gibt es: debug: [object Object] {"timestamp":"2018-10-30 11:14:04"}

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

Es funktioniert, ist aber laut.

Ist die Ausgabe des zweiten das, was Sie wollten? Damit meine ich, wenn Sie die Abfrage in den Protokollen haben wollten, wird sie angezeigt. Wenn nicht, versuchen Sie die Problemumgehung, die vor dem Posten von Mingchuno erwähnt wurde.

Ja, der zweite Weg funktioniert wie ich will. Ich sehe JSON-Objektdaten.
Wenn ich das richtig verstehe, hat Mingchuno empfohlen, % o in Zeichenfolgen zu verwenden, da Winston util "unter der Haube" verwendet. Ich versuche es und das funktioniert, aber %o wird in meinem Fall auch gedruckt. Ich füge meinem Debug-Level auch das Format splat() hinzu, aber es ändert sich nichts. Verpasse ich etwas?

Ja, ich sehe %o vor der Objektinspektion. Ich nehme an, das ist eine Art Bug?

Ist das eine bewusste Designentscheidung? Es weicht ziemlich vom Standard ab (und ich habe eine gute Stunde gebraucht, um es zu finden) statt

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

müssen (Winston 3.x) alle Protokollierungsaufrufe auf ändern

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

Entschuldigung, habe ich recht? Ich bin verwirrt...

Im Ernst, das scheint ein Downgrade zu sein. Mit Winston 2 konnte ich einfach alle console.X durch winston.X ersetzen. Warum plötzlich die hässlichen Format-Tags?

Die Lösung besteht also darin, das %o an jede Protokollierungsanweisung anzuhängen, mit der ich ein Objekt ausdrucken möchte?

Ja!

Konnte nicht akzeptieren, dass ich %o immer verwenden muss und habe diese einfache Lösung gefunden:

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({})
  ],
})

Also dieser Logger....

  logger.info({ hi: 123 })

...wandelt sich in der Konsole in diese um

info: {
    "hi": 123
}

Ich hoffe, ich kann euch helfen :D Einfach schrecklich, wenn wir immer zu zweit "%o" verwenden

Konnte nicht akzeptieren, dass ich %o immer verwenden muss und habe diese einfache Lösung gefunden:

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({})
  ],
})

Also dieser Logger....

  logger.info({ hi: 123 })

...wandelt sich in der Konsole in diese um

info: {
    "hi": 123
}

Ich hoffe, ich kann euch helfen :D Einfach schrecklich, wenn wir immer zu zweit "%o" verwenden

Nett, aber es ist seltsam, muss ich es für mein ganzes Logger-Level tun?

Nur zur Information, es ist besser zu verwenden
``` Javascript
typeof info.message === 'Objekt'
````
anstatt

``` Javascript
info.message.constructor === Objekt
````
Es vermeidet Fehler, wenn die Nachricht null oder undefiniert ist, und Arrays werden richtig angezeigt
(Beispiel: [{hallo: "456"}]

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ghost picture ghost  ·  4Kommentare

anks333 picture anks333  ·  3Kommentare

pocesar picture pocesar  ·  3Kommentare

KingRial picture KingRial  ·  3Kommentare

Buzut picture Buzut  ·  3Kommentare