Winston: Winston n'enregistre/n'analyse pas une erreur détectée à partir d'une exception

Créé le 4 mars 2020  ·  3Commentaires  ·  Source: winstonjs/winston

Parlez-nous de votre environnement :

  • _ winston version?_ 3.2.1

    • [ ] winston@2

    • [x] winston@3

  • _ node -v sorties :_ v12.8.1
  • _Système d'exploitation ?_ (Windows, macOS ou Linux) Windows
  • _Langue ?_ (tous | TypeScript XX | ES6/7 | ES5 | Dart) ES6

Quel est le problème?

Winston ne semble pas enregistrer les exceptions, il ne semble pas analyser correctement l'objet d'erreur.

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
}

Débogage plus poussé à l'aide du débogueur 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)

Qu'espérez-vous qu'il se passe à la place ?

Je m'attends à ce que Winston enregistre l'erreur détectée dans le bloc try...catch. Si je passe à la place ex.message au lieu de seulement ex , il sort correctement. ex est défini tout au long du bloc catch, mais Winston ne semble pas capable de l'analyser pour une raison quelconque.

Les autres informations

De plus, si je return ex partir du bloc catch, puis entourez tout dans un autre bloc catch, il semble le sortir correctement. Pour en savoir plus sur ce comportement inhabituel, veuillez consulter ici l'essentiel d'un message d'assistance que j'ai publié sur Discord avant de réaliser qu'il s'agit d'un bogue avec Winston.

De plus, je pense que cette erreur implique également le problème qu'un autre utilisateur a eu au cours du mois dernier à # 1758

Commentaire le plus utile

Je pense que cela peut être dû à un comportement incohérent entre les enregistreurs Winston et les transports lors de l'application des formats. Dans winston-transport, une partie de la fonction TransportStream _write fait ceci :

transformed = this.format.transform(Object.assign({}, info), this.format.options);

Le code correspondant dans winston/logger.js ressemble à ceci :

this.push(this.format.transform(info, this.format.options));

Voici une reproduction simplifiée du problème.

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'

Il n'est pas clair pour moi quel comportement devrait être préféré.

Tous les 3 commentaires

Je pense que cela peut être dû à un comportement incohérent entre les enregistreurs Winston et les transports lors de l'application des formats. Dans winston-transport, une partie de la fonction TransportStream _write fait ceci :

transformed = this.format.transform(Object.assign({}, info), this.format.options);

Le code correspondant dans winston/logger.js ressemble à ceci :

this.push(this.format.transform(info, this.format.options));

Voici une reproduction simplifiée du problème.

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'

Il n'est pas clair pour moi quel comportement devrait être préféré.

Je me demande si c'est également le même cas lorsque winston n'enregistre pas correctement certains objets et les imprime sous la forme [object Object] tandis que d'autres objets s'impriment sans problème

@jleverenz
Merci, belle trouvaille ! A donné une solution de https://github.com/winstonjs/winston/issues/1758

Cette page vous a été utile?
0 / 5 - 0 notes