web-dev-qa-db-fra.com

Comment enregistrer des objets et des tableaux JavaScript dans Winston comme le fait console.log?

Je regardais en haut Node systèmes de journalisation: npmlog, log4js, bunyan et winston et j'ai décidé d'utiliser winston pour avoir le plus de npm téléchargements mensuels.

Ce que je veux configurer, c'est un enregistreur personnalisé que je pourrai utiliser sur l'environnement de développement avec logger.debug(...) qui ne journalisera rien sur l'environnement de production. Cela m'aidera donc lorsque je serai dans un environnement de développement, je n'aurai pas besoin d'écrire quoi que ce soit car je verrai toutes les sorties.

Voici ce que j'ai maintenant:

var level = 'debug';
if (process.env.NODE_ENV !== 'development'){
  level = 'production'; // this will never be logged!
}

var logger = new winston.Logger({
  transports: [
    // some other loggings
    new winston.transports.Console({
      name: 'debug-console',
      level: level,
      prettyPrint: true,
      handleExceptions: true,
      json: false,
      colorize: true
    })

  ],
  exitOnError: false // don't crush no error
});

Un problème se produit lorsque j'essaie de connecter JavaScript Object ou Javascript Array. Avec Object, je dois faire toJSON(), et pour Array j'ai besoin d'abord JSON.stringify() puis JSON.parse().

Ce n'est pas agréable d'écrire tout le temps ces méthodes, juste pour enregistrer quelque chose que je veux. De plus, il n'est même pas convivial pour les ressources, car ces méthodes de formatage doivent être exécutées avant que logger.debug() se rende compte qu'il est en production et qu'il ne devrait pas le consigner en premier lieu (en gros, il évalue les arguments avant la fonction appel). J'aime juste la façon dont l'ancienne console.log() enregistre les objets et les tableaux JavaScript.

Maintenant que j'écris cette question, j'ai découvert qu'il y avait une façon de décrire format personnalisé pour chaque objet winston transports. Est-ce la façon de procéder ou y a-t-il une autre façon?

28
Tommz

essayez de changer le paramètre prettyPrint en

prettyPrint: function ( object ){
    return JSON.stringify(object);
}
15
Bharat Kul Ratan
logger.log("info", "Starting up with config %j", config);

Winstons utilise la bibliothèque utils.format intégrée. https://nodejs.org/dist/latest/docs/api/util.html#util_util_format_format_args

25
Leo

Dans Winston> 3, vous pouvez utiliser

logger.log('%o', { lol: 123 }')

Quoi qu'il en soit ... Je ne pouvais pas accepter que je doive toujours utiliser% o et j'ai fait cette solution simple:

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

Donc, cet enregistreur ....

  logger.info({ hi: 123 })

... se transforme en ceci dans la console

info: {
    "hi": 123
}
4
smith64fx

Utilisez la fonction intégrée Node.js util.format pour convertir vos objets en chaînes de la même manière que console.log Est-ce que.

4
Radon Rosborough

Ma recommandation est d'écrire votre propre abstraction sur Winston qui a une méthode pratique pour imprimer vos objets pour le débogage.

Vous pouvez également consulter cette réponse pour savoir comment la méthode pourrait être développée.

https://stackoverflow.com/a/12620543/221174

2
ambrons

Au lieu de faire

prettyPrint: function ( object ){
    return JSON.stringify(object)
}

il vaut mieux aller avec tils-deep-clone package

// initialize package on the top
const { toJSON } = require('utils-deep-clone')


// and now in your `prettyPrint` parameter do this
prettyPrint: function ( object ){
    return toJSON(object)
}

si vous allez avec JSON.stringify vous ne pourrez pas imprimer d'erreur

console.log(JSON.stringify(new Error('some error')))
// output will '{}'
0
Atishay Jain