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?
essayez de changer le paramètre prettyPrint en
prettyPrint: function ( object ){
return JSON.stringify(object);
}
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
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
}
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.
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.
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 '{}'