javascript - winston.js 信息方法不传递元数据

标签 javascript node.js logging winston

当我通过 winston 传递元数据时,快捷方式 winston.info 方法不会传递元数据。

var winston = require('winston');

winston.info("winston with metadata", {cluster: "bar"});
winston.log("info", "winston with metadata", {cluster: "baz"});

输出:

info: winston with metadata
info: winston with metadata cluster=baz

我希望这两个调用都能打印出元数据?

深入研究 winston 代码,它看起来像是为每个级别(“信息”、“调试”、“错误”)动态生成快捷函数,并尝试处理其他元数据参数:

//
// ### function setLevels (target, past, current)
// #### @target {Object} Object on which to set levels.
// #### @past {Object} Previous levels set on target.
// #### @current {Object} Current levels to set on target.
// Create functions on the target objects for each level
// in current.levels. If past is defined, remove functions
// for each of those levels.
//
exports.setLevels = function (target, past, current, isDefault) {
  if (past) {
    Object.keys(past).forEach(function (level) {
      delete target[level];
    });
  }

  target.levels = current || config.npm.levels;
  if (target.padLevels) {
    target.levelLength = exports.longestElement(Object.keys(target.levels));
  }

  //
  //  Define prototype methods for each log level
  //  e.g. target.log('info', msg) <=> target.info(msg)
  //
  Object.keys(target.levels).forEach(function (level) {
    target[level] = function (msg) {
      var args = Array.prototype.slice.call(arguments, 1),
          callback = args.pop(),
          ltype = typeof callback,
          meta = args.length ? args : null;

      if (ltype !== 'function') {
        if (meta && ltype !== 'undefined') {
          meta.push(callback);
        }

        callback = null;
      }

      if (meta) {
        meta = (meta.length <= 1 && meta.shift()) || meta;
        return callback
          ? target.log(level, msg, meta, callback)
          : target.log(level, msg, meta)
      }

      return callback
        ? target.log(level, msg, callback)
        : target.log(level, msg)
    };
  });

  return target;
};

最佳答案

我认为这很可能是由于 winston v0.7.1 中的回归。

鉴于此输入:

var winston = require("winston");

var logger = new winston.Logger({
    levels: {
        debug: 0,
        info: 1,
        warn: 2,
        error: 3
    },
  transports: [
      new winston.transports.Console({
          level: 'debug',
          colorize: true
      })
  ]
});

console.log('Winston Version: ' + winston.version);

console.log('\nProxy Methods\n');
logger.info("Hello world");
logger.warn("Hello world", { winston: {
    version: winston.version
}});

console.log('\nDirect Access Methods\n')
logger.log('info', "Hello world");
logger.log('warn', "Hello world", { version: winston.version });

你得到以下输出

Winston Version: 0.6.2

Proxy Methods

info: Hello world
warn: Hello world version=0.6.2

Direct Access Methods

info: Hello world
warn: Hello world version=0.6.2

对比:

Winston Version: 0.7.1

Proxy Methods

info: Hello world
warn: Hello world

Direct Access Methods

info: Hello world
warn: Hello world version=0.7.1

我已经更新了 https://github.com/flatiron/winston/pull/246在接受 PR 之前反射(reflect)回归。

关于javascript - winston.js 信息方法不传递元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349288/

相关文章:

java - 在 Android 上清除内部存储中的文件内容

javascript - Nodejs/Express - 'title' 不呈现

node.js - Passport.js session 在重定向后丢失

c# - 将 Windsor Logging Facility 安装到图书馆中

logging - Crystal 中的全局日志级别

java - Android 和 Node.js : java. lang.OutOfMemoryError

javascript - 为什么我无法让这段 javascript 代码工作?

javascript - RxJS - 点击和计时器之间的竞赛

javascript - 对于单个 jQuery 选择器,使用 id 而不是 class 的速度有多快?

javascript - 异步等待内部如何工作?