Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当逗号用作连接运算符时,Winston不显示文本_Javascript_Winston - Fatal编程技术网

Javascript 当逗号用作连接运算符时,Winston不显示文本

Javascript 当逗号用作连接运算符时,Winston不显示文本,javascript,winston,Javascript,Winston,我的项目现在正在使用winston logger登录到控制台。问题是,逗号在大多数区域用作连接运算符, 比如logger.info(“这里是数据”,data) 数据始终是一个字符串,但记录的只是“此处是数据”,而不是其他内容 Project在大多数地方使用逗号作为concat,所以用“+”替换是很乏味的。请注意如何在逗号本身存在的情况下显示数据基本上有两种方法 1) 手动更改logger.info函数以获取多个参数,或者编写一个记录器包装器,在传递到logger.info之前连接字符串 info

我的项目现在正在使用winston logger登录到控制台。问题是,逗号在大多数区域用作连接运算符, 比如
logger.info(“这里是数据”,data)

数据始终是一个字符串,但记录的只是“此处是数据”,而不是其他内容


Project在大多数地方使用逗号作为concat,所以用“+”替换是很乏味的。请注意如何在逗号本身存在的情况下显示数据

基本上有两种方法

1) 手动更改logger.info函数以获取多个参数,或者编写一个记录器包装器,在传递到logger.info之前连接字符串

info = (...args) => {
   const data = args.reduce((acc, item) => acc += item);
   // or such kind of manual concatenation logic
   logger.info(data);
}
2) 使用es6模板文本。因此,使用

logger.info(`here is data ${data}`)

根据Pressana answer,我在负责创建winston logger并将其导出到需要记录的模块的
createLogger
功能上创建了一个记录器中间件

这里是一个例子

let env;

exports.createLogger = (envP) => {
  env = envP;
  const logger = winston.createLogger({
    level: 'debug',
    transports: [
      new winston.transports.File({
        filename: __dirname + '/error.log',
        level: 'error'
      }),
      new winston.transports.File({
        filename: __dirname + '/combined.log'
      })
    ],
    'colorize': true
  });

  const customLogger = getCustomLoggerMiddleware(logger);

  if (env !== 'production') {
    logger.add(new winston.transports.Console({
      format: winston.format.simple()
    }));
  }
  return customLogger;
}

function getCustomLoggerMiddleware(logger) {
  const customLogger = {};
  customLogger.error = reduceLogger(logger.error)
  customLogger.warn = reduceLogger(logger.warn)
  customLogger.info = reduceLogger(logger.info)
  customLogger.http = reduceLogger(logger.http)
  customLogger.verbose = reduceLogger(logger.verbose)
  customLogger.debug = reduceLogger(logger.debug)
  customLogger.silly = reduceLogger(logger.silly)
  return customLogger;
}

function reduceLogger(loggerFun) {
  return (...args) => {
    const data = args.reduce((acc, item) => acc += item);
    loggerFun(data);
  }
}

createLogger
功能这是一个普通的winston logger builder,神奇发生在
GetCustomLogGermiddle软件上
在Mauricio上展开回答这里是另一个例子。 区别在于它还记录数组、对象(包括循环)

logger.jsm

const path=require('path');
const winston=require('winston');
const safeStringify=require('fast-safe-stringify');//温斯顿也来了
常量记录器=(forceDev)=>{
//
const DEVELOPMENT=forceDev | |(process.env.NODE_env==“DEVELOPMENT”);
const logger=winston.createLogger({
级别:(开发)“‘愚蠢’:‘信息’,
级别:winston.config.npm.levels,
格式:winston.format.combine(
winston.format.timestamp(),
winston.format.align(),
printf((info)=>`${info.timestamp}[${info.level}]${info.message}`)
),
运输:发展
? [
//将日志输出到控制台
新winston.transports.Console({
格式:winston.format.combine(
winston.format.colorize(),
winston.format.timestamp(),
winston.format.align(),
printf((info)=>`${info.timestamp}[${info.level}]${info.message}`)
)
})
]
: [
//将所有日志写入文件
//级别为'error'且低于'error.log`
新的winston.transports.File({
文件名:path.join(uu dirname,'../logs/winston error.log'),
级别:“错误”
}),
//级别为'info'且低于'combined.log`
新的winston.transports.File({
文件名:path.join(uu dirname,“../logs/winston combined.log”)
})
]
});
process.on('unhandledRejection',(错误)=>{
logger.error(error.stack);
});
process.on('uncaughtException',(错误)=>{
logger.error(error.stack);
});
常量包装器fcn=(orgFcn,…args)=>{
orgFcn(
args
//.filter((arg)=>arg!=='which')//自定义筛选器
.减少((以前,当前)=>{
const replacer=null;
常量空间=空;
返回`${previous}${(当前类型=='string'| |字符串的当前实例)?当前:安全字符串化(当前、替换、空格)}`;
}, '')
);
};
const getWrappedLogger=(loggerOrgObj)=>{
const wrappedObject=Object.create(loggerOrgObj);
Object.assign(wrappedObject{
错误:wrapperFcn.bind(wrapperFcn,loggerOrgObj.error),
警告:wrapperFcn.bind(wrapperFcn,loggerOrgObj.warn),
信息:wrapperFcn.bind(wrapperFcn,loggerOrgObj.info),
http:wrapperFcn.bind(wrapperFcn,loggerOrgObj.http),
verbose:wrapperFcn.bind(wrapperFcn,loggerOrgObj.verbose),
调试:wrapperFcn.bind(wrapperFcn,loggerOrgObj.debug),
傻瓜:wrapperFcn.bind(wrapperFcn,loggerOrgObj.傻瓜)
});
返回包装物;
};
返回getWrappedLogger(记录器);
};
module.exports=记录器;
index.js


天才!我使用了您的第一个建议,因为我维护了一个单独的logger.js,作为logger在整个项目中使用。非常感谢普拉桑娜!如何更改logger.info功能?
const logger = require('./logger.jsm')(true);

const circ = {x: 1};
circ.circ = circ;

// example of non-overridden method, which still works
logger.log({
  level: 'info',
  message: 'Logger launching.'
});

// examples of overridden methods, new behaviour
logger.error('This', 'is', 'log', 'level', 'error', 1, [2, 3], true, {foo: 'bar'}, circ);
logger.warn('This', 'is', 'log', 'level', 'warn', 1, [2, 3], true, {foo: 'bar'}, circ);
logger.info('This', 'is', 'log', 'level', 'info', 1, [2, 3], true, {foo: 'bar'}, circ);
logger.http('This', 'is', 'log', 'level', 'http', 1, [2, 3], true, {foo: 'bar'}, circ);
logger.verbose('This', 'is', 'log', 'level', 'verbose', 1, [2, 3], true, {foo: 'bar'}, circ);
logger.debug('This', 'is', 'log', 'level', 'debug', 1, [2, 3], true, {foo: 'bar'}, circ);
logger.silly('This', 'is', 'log', 'level', 'silly', 1, [2, 3], true, {foo: 'bar'}, circ);

// console.log comparison
console.log('This', 'is', 'pure', 'console', 'test', 1, [2, 3], true, {foo: 'bar'}, circ);