在几个模块中使用winston

Ale*_*der 60 node.js winston

我有几个模块 - 比如说server.js,module1.js,...,moduleN.js.

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

winston.add(winston.transports.File, { filename: 'mylogfile.log' });
Run Code Online (Sandbox Code Playgroud)

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

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

先感谢您!

Nic*_*ick 93

默认的记录器概念处理得很好.

Winston定义了一个默认记录器,任何直接需要(以及后续要求)的winston都将检索.因此,您只需配置一次此默认记录器,并可通过vanilla require('winston')在其光荣的调整多传输模式下使用后续模块.

例如,这是我完整的日志记录设置,定义了3个传输.我有时会将Loggly换成MongoDB.

server.js

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

所有其他.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");
Run Code Online (Sandbox Code Playgroud)

log.js - 这是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;
Run Code Online (Sandbox Code Playgroud)

或者对于更复杂的场景,您可以使用winston容器并从其他模块中的命名容器中检索记录器.我没用过这个.

我唯一的问题是我的部署主机上缺少日志目录,很容易修复.

希望这可以帮助.

  • 对于那些和我一样没有让它在其他模块中工作的人的快速提示.**不要**创建一个`new winston.Logger`,配置你首先包含的实际`logger` var.返回它并且它不仅可以在您调用它的模块中使用,而且可以在您需要winston的任何其他模块中使用. (9认同)
  • 不在其他文件中工作.它重置为winston的默认配置. (3认同)
  • 如果我想修改控制台传输,这似乎不起作用: var logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ timestamp: true, level: 'verbose', colorize : 真的 }) ] }); module.exports = 记录器;然后,如果我在另一个文件中使用 require('winston') ,则控制台记录器不正确。 (2认同)

Nic*_*son 12

我所做的(可能不是最好的方式)是使用"全局"模块,我通过我的应用程序导出我使用的所有东西.例如:

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

exports.otherGlobals = ....
Run Code Online (Sandbox Code Playgroud)

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

var Global = require(/path/to/global.js);
Run Code Online (Sandbox Code Playgroud)

因为文件在第一次加载后被缓存(您可以通过在全局中包含日志语句来验证它;它只会记录一次),再次包含它的开销很小.将所有内容放在一个文件中也比在每个页面上要求所有全局使用的模块更容易.


use*_*777 10

我想使用自定义颜色和级别.

所以我删除了默认的console-transport并设置了一个彩色的

这是我的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;
Run Code Online (Sandbox Code Playgroud)



从app.js加载:

var logger = require('./lib/log.js');  
Run Code Online (Sandbox Code Playgroud)



从其他模块加载:

 var logger = require('winston');        
Run Code Online (Sandbox Code Playgroud)


chr*_*vdb 6

稍微偏离主题(正如OP询问温斯顿),但我喜欢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: ...});
});
Run Code Online (Sandbox Code Playgroud)

它解决了OP的问题,因为记录器可以通过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}
Run Code Online (Sandbox Code Playgroud)

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


Hai*_*jin 6

我现在正在开发Winston 3.0.0。似乎配置默认记录器的方式发生了一些变化。对我有用的方法如下:

log.js // 全局记录器的设置

const winston= require('winston');

winston.configure({
  level:"debug",
  format: winston.format.combine(
    winston.format.colorize(),
    winston.format.simple()
  ),
  transports: [
    new winston.transports.Console()
  ]
});
Run Code Online (Sandbox Code Playgroud)

另一部分是一样的。在您应用程序的开头require('log.js'),以及require ('winston'), 在所有其他文件中,只需require('winston')

.


Kev*_*lou 5

我正在创建一个新的 Winston 记录器。

日志文件

'use strict';

const winston = require('winston');

module.exports = new(winston.Logger)({
    transports: [
        new(winston.transports.Console)({
            level: 'info'
        })
    ]
});
Run Code Online (Sandbox Code Playgroud)

js

const log = require('./log');

log.info("from a.js");
Run Code Online (Sandbox Code Playgroud)

js

const log = require('./log');

log.info("from b.js");
Run Code Online (Sandbox Code Playgroud)