web-dev-qa-db-fra.com

en utilisant winston dans plusieurs modules

J'ai plusieurs modules - par exemple, server.js, module1.js, ..., moduleN.js.

Je voudrais définir le fichier de log 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 configurer dans le fichier server.js, mais existe-t-il une meilleure solution?

Merci d'avance!

56
Alexander

Le concept de consignateur par défaut le gère bien.

Winston définit un enregistreur par défaut que toute suite nécessite (et ultérieurement) de récupérer. Ainsi, vous configurez simplement cet enregistreur par défaut une fois, et il est disponible pour une utilisation ultérieure du module via Vanilla require ('winston') dans son superbe mode multi-transports optimisé.

par exemple. Voici ma configuration complète de journalisation qui définit 3 transports. J'échange parfois Loggly contre 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 retrieves default logger which was configured in log.js
logger.info("the default logger with my tricked out transports is rockin this module");

log.js - il s'agit d'une configuration unique du consignateur 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;

Sinon, pour des scénarios plus complexes, vous pouvez utiliser les conteneurs Winston et extraire le consignateur d'un conteneur nommé dans d'autres modules. Je n'ai pas utilisé ça.

Mon seul problème avec cela était un des répertoires de journaux manquants sur mon hôte de déploiement, ce qui a été facilement résolu.

J'espère que cela t'aides.

88
Nick

Ce que je fais (ce qui peut ne pas être le meilleur moyen) est d’utiliser un module «global» dans lequel j’exporte tout ce que j’utilise par le biais de 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 de vos autres modules

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

Étant donné que le fichier est mis en cache après son premier chargement (ce que vous pouvez vérifier en incluant une instruction de journal dans votre global; il ne se connectera qu'une seule fois), l'inclure à nouveau est très léger. Tout mettre dans un seul fichier est également plus facile que d'exiger TOUS vos modules utilisés globalement sur chaque page.

11
Nick Mitchinson

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

J'ai donc supprimé le transport de console par défaut et en ai défini un

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 à partir d'autres modules:

 var logger = require('winston');        
9
user3575777

Légèrement en dehors du sujet (comme l'OP pose des questions sur Winston), mais j'aime bien l'approche de «l'enregistreur d'enfants» 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: ...});
});

Cela résout le problème de l'OP puisque le logger est disponible via l'objet req (donc, pas besoin de 'require (log)' dans chaque module). De plus, toutes les entrées de journal appartenant à une requête particulière auront un identifiant unique qui les connecte ensemble.

{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"[email protected]","time":"2014-05-26T18:27:43.530Z","v":0}

Je ne suis pas sûr que Winston l’appuie également.

5
chrisvdb

Je crée un nouvel enregistreur Winston.

log.js

'use strict';

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");
3
Kevin Struillou

Je travaille sur Winston 3.0.0 pour le moment. Et il semble que la manière de configurer l’enregistreur par défaut ait un peu changé. Voici comment cela fonctionne pour moi:

log.js // le paramétrage 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 identique. Au début de votre application, require('log.js'), ainsi que require ('winston'), Dans tous les autres fichiers, il suffit simplement de require('winston')

.

2
Haijin

si vous voulez que l'enregistreur soit une variable globale, vous devez le faire spécifiquement en l'affectant à la variable globale comme ceci

logger.js

var winston = require('winston')

var winston = winston.createLogger({
transports: [
  new (winston.transports.Console)(),
  new (winston.transports.File)({
    filename: './logs/logger.log'
  })
]
});
module.exports=winston;

app.js

let logger  = require('./logger')
global.__logger = logger

someController.js

__logger.info('created log successfully')

Remarque: Il est recommandé d’attribuer un préfixe à chaque variable globale afin de savoir qu’il s’agit d’une variable globale. J'utilise __ comme préfixe (double tiret bas)

0
veeresh yh