utiliser winston dans plusieurs modules

J’ai plusieurs modules – disons server.js, module1.js, …, moduleN.js.

Je voudrais définir le fichier journal dans mon server.js:

winston.add(winston.transports.File, { filename: 'mylogfile.log' }); 

et ensuite l’utiliser dans tous mes modules.

Quelle est la meilleure façon de le faire? Je pourrais exports.winston=winston; dans chaque module, puis le définir dans le server.js, mais existe-t-il une meilleure solution?

Merci d’avance!

    Le concept de logger par défaut gère cela agréablement.

    Winston définit un enregistreur par défaut que toute demande directe (et toute demande ultérieure) doit récupérer. Ainsi, vous configurez simplement cet enregistreur par défaut une seule fois, et il est disponible pour une utilisation ultérieure du module via vanilla require («winston») dans son mode de transport multi-fonctions amélioré.

    Par exemple, voici ma configuration de journalisation complète qui définit 3 transports. J’échange parfois Loggly pour MongoDB.

    server.js

     var logger=require('./log.js'); // requires winston and configures transports for winstons default logger- see code below. 

    tous les autres fichiers .js

     var logger=require('winston'); // this resortingeves default logger which was configured in log.js logger.info("the default logger with my sortingcked out transports is rockin this module"); 

    log.js – il s’agit d’une configuration unique du logger DEFAULT

     var logger = require('winston'); var Loggly = require('winston-loggly').Loggly; var loggly_options={ subdomain: "mysubdomain", inputToken: "efake000-000d-000e-a000-xfakee000a00" } logger.add(Loggly, loggly_options); logger.add(winston.transports.File, { filename: "../logs/production.log" }); logger.info('Chill Winston, the logs are being captured 3 ways- console, file, and Loggly'); module.exports=logger; 

    Pour les scénarios plus complexes, vous pouvez également utiliser des conteneurs Winston et extraire l’enregistreur d’un conteneur nommé dans d’autres modules. Je n’ai pas utilisé ça.

    Mon seul problème avec cela était un manque de répertoires de journaux sur mon hôte de déploiement, ce qui était facile à corriger.

    J’espère que cela t’aides.

    Ce que je fais (ce qui n’est peut-être pas le meilleur moyen) est d’utiliser un module «global» où j’exporte tout ce que j’utilise via mes applications. Par exemple:

     //Define your winston instance winston.add(winston.transports.File, { filename: 'mylogfile.log' }); exports.logger = winston; exports.otherGlobals = .... 

    Maintenant, juste besoin de ce module utilisé globalement à partir de vos autres modules

     var Global = require(/path/to/global.js); 

    Étant donné que le fichier est mis en cache après la première fois qu’il est chargé (ce que vous pouvez vérifier en incluant une instruction de journal dans votre fichier global; il ne se connectera qu’une seule fois), il est très rare de l’inclure à nouveau. Mettre tout cela dans un seul fichier est également plus simple que d’exiger TOUS vos modules utilisés globalement sur chaque page.

    Je voulais utiliser des couleurs et des niveaux personnalisés.

    J’ai donc enlevé la console de transport par défaut et défini une couleur

    voici mon logger.js

     var logger = require('winston'); logger.setLevels({ debug:0, info: 1, silly:2, warn: 3, error:4, }); logger.addColors({ debug: 'green', info: 'cyan', silly: 'magenta', warn: 'yellow', error: 'red' }); logger.remove(logger.transports.Console); logger.add(logger.transports.Console, { level: 'debug', colorize:true }); module.exports = logger; 

    Chargement depuis app.js:

     var logger = require('./lib/log.js'); 

    Chargement depuis d’autres modules:

      var logger = require('winston'); 

    Un peu hors sujet (comme le demande l’OP sur Winston), mais j’aime bien l’approche de l’enregistreur d’enfant de Bunyan:

     var bunyan = require('bunyan'); var log = bunyan.createLogger({name: 'myapp'}); app.use(function(req, res, next) { req.log = log.child({reqId: uuid()}); next(); }); app.get('/', function(req, res) { req.log.info({user: ...}); }); 

    Il résout le problème de l’OP, car l’enregistreur est disponible via l’object req (donc pas besoin de “requirejs (log)” dans chaque module). De plus, toutes les entrées de journal appartenant à une requête particulière auront un identifiant unique qui les connectera.

     {"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"...@gmail.com","time":"2014-05-26T18:27:43.530Z","v":0} 

    Je ne suis pas sûr que Winston le soutienne également.

    Je crée un nouveau enregistreur Winston.

    log.js

     'use ssortingct'; const winston = require('winston'); module.exports = new(winston.Logger)({ transports: [ new(winston.transports.Console)({ level: 'info' }) ] }); 

    a.js

     const log = require('./log'); log.info("from a.js"); 

    b.js

     const log = require('./log'); log.info("from b.js"); 

    Je travaille actuellement sur Winston 3.0.0 . Et il semble que la façon de configurer le logger par défaut a un peu changé. La façon dont cela fonctionne pour moi suit:

    log.js // le paramètre de l’enregistreur global

     const winston= require('winston'); winston.configure({ level:"debug", format: winston.format.combine( winston.format.colorize(), winston.format.simple() ), transports: [ new winston.transports.Console() ] }); 

    L’autre partie est la même. Dans la demande de votre application, require this **log.js.** , et require ('winston'), aussi require ('winston'), que dans tous les autres fichiers, il suffit de require('winston')

    .