在几个模块中使用Winston

我有几个模块 – 比如说server.js,module1.js,…,moduleN.js。

我想在我的server.js中定义日志文件:

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

然后在我的所有模块中使用它。

什么是最好的办法呢? 我可以exports.winston=winston; 在每个模块中,然后将其设置在server.js中,但有没有更好的解决scheme?

先谢谢你!

默认的logging器概念处理这很好。

温斯顿定义了一个默认的logging器,任何直接需要(和后续要求)winston将检索。 因此,您只需configuration一次这个默认的logging器,并通过vanilla require('winston')以其光荣的多传输模式进行后续模块的使用。

例如这里是我完整的日志logging设置,定义3个传输。 有时候我把Loggly换成MongoDB。

server.js

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

所有其他.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 – 这是DEFAULTlogging器的一次性configuration

 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; 

或者,对于更复杂的场景,您可以使用winston容器,并从其他模块中的指定容器中检索logging器。 我没有用过这个。

我唯一的问题就是我的部署主机上缺less一个日志目录,这个目录很容易修复。

希望这可以帮助。

我想使用自定义的颜色和水平。

所以我删除了默认的控制台传输并设置了一个彩色的

这里是我的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; 

从app.js载入:

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

从其他模块加载:

  var logger = require('winston'); 

我所做的(这可能不是最好的方法)是使用“全局”模块,在那里我通过我的应用程序导出所有的东西。 例如:

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

现在只需要从其他模块中使用这个全局使用的模块

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

因为文件在第一次被加载之后被caching了(你可以通过在你的全局文件中包含一个日志语句来validation它,它只会logging一次),所以再次包含它的开销很小。 把它全部放到一个文件中比在每个页面上要求所有全局使用的模块要容易得多。

稍微偏离主题(正如OP询问Winston一样),但是我喜欢Bunyan的“儿童logging器”方法:

 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: ...}); }); 

它解决了OP的问题,因为logging器通过req对象是可用的(因此在每个模块中不需要“require(log)”)。 此外,属于特定请求的所有日志条目将具有将它们连接在一起的唯一ID。

 {"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} 

我不确定温斯顿是否也支持这一点。

我正在创build一个新的Winstonlogging器。

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");