首页 文章

在几个模块中使用winston

提问于
浏览
55

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

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

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

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

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

先感谢您!

6 回答

  • 2

    默认的 Logger 概念处理得很好 .

    Winston定义了一个默认 Logger ,任何直接需要(以及后续要求)的winston都将检索 . 因此,您只需配置一次此默认 Logger ,并可通过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.
    

    所有其他.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 - 这是DEFAULT Logger 的一次性配置

    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容器并从其他模块中的命名容器中检索 Logger . 我没用过这个 .

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

    希望这可以帮助 .

  • 85

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

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

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

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

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

  • 11

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

    所以我删除了默认的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;
    

    Loading from app.js:

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

    Loading from other modules:

    var logger = require('winston');
    
  • 5

    稍微偏离主题(正如OP询问温斯顿),但我喜欢Bunyan的'儿童 Logger '方法:

    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的问题,因为 Logger 可以通过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}
    

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

  • 9

    我正在创建一个新的Winston Logger .

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

    我现在正在 Winston 3.0.0 工作 . 似乎配置默认 Logger 的方式已经发生了一些变化 . 对我有用的方法是:

    log.js //全局 Logger 的设置

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

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

    .

相关问题