Winston: Winston protokolliert/parset einen abgefangenen Fehler von einer Ausnahme nicht

Erstellt am 4. März 2020  ·  3Kommentare  ·  Quelle: winstonjs/winston

Bitte erzählen Sie uns von Ihrer Umgebung:

  • _ winston Version?_ 3.2.1

    • [ ] winston@2

    • [x] winston@3

  • _ node -v Ausgaben:_ v12.8.1
  • _Betriebssystem?_ (Windows, macOS oder Linux) Windows
  • _Sprache?_ (alle | TypeScript XX | ES6/7 | ES5 | Dart) ES6

Was ist das Problem?

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

Was erwarten Sie stattdessen?

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.

Andere Informationen

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

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.

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.

Alle 3 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen