2

我正在尝试设置 winston 以与此处相同的方式在我的所有模块中工作:

在几个模块中使用winston

但我遇到了问题。

我已经设置了一个 logger.js 文件来配置控制台记录器:

var winston = require('winston');

var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({
      timestamp: true,
      level: 'verbose',
      colorize: true
    })
  ]
});

module.exports = logger;

然后我在我的主 app.js 文件中需要该记录器:

var logger = require('./logger.js');
logger.info('Starting server');  // this console log looks great, just as I configured

但是,当我在所有其他模块中尝试 require winston 时,我丢失了我在 logger.js 中为 winston 设置的配置

其他模块:

var logger = require('winston');
logger.info('in another module');  // this is back to winstons default console transport

根据我上面引用的链接,我应该能够在所有其他模块中要求 winston,并且我定义/配置的传输应该仍然是相同的。我唯一能想到的是,控制台传输并非如此。如果不是什么给?如何配置一次控制台传输,然后在所有其他模块中使用 winston?

4

1 回答 1

8

要使您当前的解决方案正常工作,您必须确保您拥有一个版本的 winston。您不应该在您的主应用程序下安装一次,在您的其他模块下再安装一次。然后在这里创建一个新的记录器实例,而不是使用默认值。

你应该而不是上面这样做:

var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {
  timestamp: true,
  level: 'verbose',
  colorize: true
});

我认为这应该有效。如果这不起作用,您可以尝试以下方法之一:

  • 让他们改用您的./logger模块。这在作为应用程序代码库一部分的内部模块中非常有效。
  • 或者使您的其他模块可配置。做类似的事情require('other-module').logger = require('./logger');require('other-module').setLogger(require('./logger'));。如果您想了解有关此方法的更多信息,可以查看此问题。
于 2014-05-17T17:04:21.323 回答