Winston: 使用不同的标签共享相同的传输

创建于 2015-10-30  ·  4评论  ·  资料来源: winstonjs/winston

我希望我的所有日​​志都有一个前缀,表示日志的来源。 这种方式为同一个文件创建了多个传输,这显然是一个

var config = require('config')
var winston = require('winston')

var loggers = {}


function getLogger(moduleName) {
  if (!loggers[moduleName]) {
    loggers[moduleName] = createNewLogger(moduleName)
  }

  return loggers[moduleName]
}

function createNewLogger(moduleName) {
  var logger = new winston.Logger()

  //https://github.com/winstonjs/winston/blob/master/docs/transports.md#console-transport
  logger.add(winston.transports.Console,
    {
      colorize: true,
      timestamp: true,
      label: moduleName,
      level: config.get('log.level')
    }
  )

  logger.add(winston.transports.DailyRotateFile,
    {
      filename: config.get('log.filename'),
      level: config.get('log.level')
    }
  )

  return logger
}

module.exports = getLogger

我基本上希望我的所有日​​志都放在一个文件/控制台中,但前缀不同。 有任何想法吗?

所有4条评论

我相信你想要这个: https ://github.com/winstonjs/winston#working -with-multiple-loggers-in-winston

谢谢你! 我以前见过它,但我的印象是正在为每个记录器重新创建传输。

例如下面的代码:

function getLogger(moduleName) {
  console.log('Initializing logger for: ' + moduleName)
  winston.loggers.add(moduleName, {
    //https://github.com/winstonjs/winston/blob/master/docs/transports.md#console-transport
    Console: {
      colorize: true,
      timestamp: true,
      label: moduleName,
      level: config.get('log.level')
    },
    DailyRotateFile: {
      filename: config.get('log.filename'),
      level: config.get('log.level')
    }
  })

  return winston.loggers.get(moduleName)

}

会给Error: Transport already attached: console

我做错了什么?

@indexzero

我在温斯顿3.0.0

我也试过这个,不确定这是否正确; 基本上,我想要一种更简单的方法来为每个日志消息添加前缀,或者根据正在记录的模块/功能为每个日志附加一个默认字段(对于某些结构)。 这是代码(通过文档中的示例进行):

const loggers = {};
module.exports.getModuleLogger = (moduleName, methodName) => {
    const categoryName = [moduleName, methodName].join(':');
    if (!loggers[categoryName]) {
      loggers[categoryName] = winston.loggers.add(categoryName, {
        console: {
          label: categoryName,
        },
        file: {
          filename: './log/test.log',
          label: categoryName,
        },
      });
    }
    return winston.loggers.get(categoryName);
  };

但我收到以下警告:

[winston] Attempt to write logs with no transports {"message":"yolo","
level":"info"}

您可以通过在日志函数的参数中添加一个包含字段“标签”的对象来实现此目的,例如:
对于以下格式:

常量 imLogFormat = printf(info => {
返回${info.timestamp} [${info.label}] ${info.level}: ${info.message} ;
});

您可以执行以下操作:

logger.error('我有以下错误' + err, {label: "Class1"})
logger.error('我有以下错误' + err, {label: "Class2"})

此页面是否有帮助?
0 / 5 - 0 等级