Node Winston 用名字实例化每个实例

Node Winston instantiate each instance with a name

这是我的温斯顿记录器class:

const winston = require('winston');
const config = require('../config');
const env = process.env;

winston.setLevels({
    debug:0,
    info: 1,
    silly:2,
    warn: 3,
    error:4,
});

winston.addColors({
    debug: 'green',
    info:  'cyan',
    silly: 'magenta',
    warn:  'yellow',
    error: 'red'
});

let transports = [];
transports.push(new (winston.transports.File)({filename: config.logger.fileName}));
if (env.CONSOLE == 'true' || config.logger.consoleLog) {
    transports.push(new (winston.transports.Console)({colorize:true}));
}

winston.configure({
    transports: transports
});

if (config.logger.debug || env.DEBUG == 'true') {
    winston.level = 'debug';
}


module.exports = winston;

我是这样使用的:

const logger = require('src/logger');
logger.info("Hello there");

问题是所有文件都会毫无区别地附加到同一个文件;我希望能够设置 "name" 以便在我的日志中看到类似“[Name1] ...”“[Name2] ...”等的内容

我该如何完成?

Winston 有一个概念“categories”。但是没有简单的方法可以将类别名称放入日志消息中。

这是一个利用 'label' 属性 实现此目的的解决方法:

'use strict';

const winston = require('winston');

winston.setLevels({
 debug: 0,
 info: 1,
 silly: 2,
 warn: 3,
 error: 4,
});

winston.addColors({
 debug: 'green',
 info: 'cyan',
 silly: 'magenta',
 warn: 'yellow',
 error: 'red'
});

const getLogger = function (category) {
 //If we call .get it'll create a default logger
 //We don't need a default one, we want to configure the
 //transports/labels, so we check if it exists
 //and return only if it's configured properly
 if (winston.loggers[category]) {
  return winston.loggers.get(category);
 }

 //Apply your logic to identify log level here.
 let level = 'silly';

 //Set up the transports you need (omit console if needed)
 let transports = [
  new (winston.transports.File)({
   filename: './logs.txt',
   //Notice this 'label' property
   label: category,
   level
  }),
  new (winston.transports.Console)({
   colorize: true,
   label: category,
   level
  })
 ];

 return winston.loggers.add(category, {transports});
};

module.exports = {getLogger};

const generalLogger = getLogger('general');
const appleLogger = getLogger('apple');
const orangeLogger = getLogger('orange');

generalLogger.log('info', 'general logger');
appleLogger.log('info', 'apple logger');
orangeLogger.log('info', 'orange logger');

所以你导出 getLogger 而不是 winston 然后你会得到这样的日志消息:

info: [general] general logger
info: [apple] apple logger
info: [orange] orange logger

{"level":"info","message":"general logger","label":"general","timestamp":"2017-03-06T07:08:04.959Z"}
{"level":"info","message":"apple logger","label":"apple","timestamp":"2017-03-06T07:08:04.962Z"}
{"level":"info","message":"orange logger","label":"orange","timestamp":"2017-03-06T07:08:04.963Z"}

希望这对您有所帮助。还有一个 similar thread.