web-dev-qa-db-fra.com

Comment enregistrer une trace de pile complète avec Winston 3?

Mon enregistreur est configuré comme suit:

const myFormat = printf(info => {
   return `${info.timestamp}: ${info.level}: ${info.message}: ${info.err}`;
 });


 const logger =
   winston.createLogger({
   level: "info",
   format: combine(timestamp(), myFormat),

   transports: [
     new winston.transports.File({
     filename:
      "./logger/error.log",
        level: "error"
    }),
     new winston.transports.File({
       filename:
       "./logger/info.log",
       level: "info"
   })
  ]
})

Ensuite, je me connecte une erreur comme celle-ci: 

logger.error(`GET on /history`, { err });

Comment est-il possible de consigner la trace complète de la pile pour les erreurs via le transport d'erreur? J'ai essayé de passer dans le err.stack et il est sorti comme indéfini. 

Merci ! 

8
Anthony Xie

Vous pouvez écrire un formateur pour passer error.stack à enregistrer.

const errorStackFormat = winston.format(info => {
  if (info instanceof Error) {
    return Object.assign({}, info, {
      stack: info.stack,
      message: info.message
    })
  }
  return info
})

const logger = winston.createLogger({
  transports: [ ... ],
  format: winston.format.combine(errorStackFormat(), myFormat)
})

logger.info(new Error('yo')) // => {message: 'yo', stack: "Error blut at xxx.js:xx ......"} 

(la sortie dépend de votre configuration)

9
Ming

La réponse de @ Ming m'a en partie expliquée, mais pour avoir une description de la chaîne avec l'erreur, voici comment j'ai obtenu le traçage complet de la pile sur le nôtre:

import winston from "winston";

const errorStackTracerFormat = winston.format(info => {
    if (info.meta && info.meta instanceof Error) {
        info.message = `${info.message} ${info.meta.stack}`;
    }
    return info;
});

const logger = winston.createLogger({
    format: winston.format.combine(
        winston.format.splat(), // Necessary to produce the 'meta' attribute
        errorStackTracerFormat(),
        winston.format.simple()
    )
});

logger.error("Does this work?", new Error("yup"));

// The log output:
//   error: Does this work? Error: Yup
//       at Object.<anonymous> (/path/to/file.ts:18:33)
//       at ...
//       at ...
8
Mike Richards

logger.error (GET on /history, {err}); 

la variable err est un objet d'erreur?

sinon, vous pouvez obtenir la trace en utilisant new Error().stack et passez à winston.

0
Elad

Voici mon logger.js avec winston": "^3.1.0

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf, colorize, splat } = format;

const myFormat = printf((info) => {
  if (info.meta && info.meta instanceof Error) {
    return `${info.timestamp} ${info.level} ${info.message} : ${info.meta.stack}`;
  }
  return `${info.timestamp} ${info.level}: ${info.message}`;
});

const LOG_LEVEL = process.env.LOG_LEVEL || 'debug';
const logger = createLogger({
  transports: [
    new (transports.Console)(
      {
        level: LOG_LEVEL,
        format: combine(
          colorize(),
          timestamp(),
          splat(),
          myFormat
        )
      }
    )
  ]
});
module.exports = logger;
0
vanduc1102