javascript - 使用 winston 记录 moment.js

标签 javascript node.js momentjs winston

我想在我的 Node.js 应用程序中记录一些包含 moment.js 对象的对象。

var moment = require('moment');
var myObject = {
    anything: 'This is metadata',
    moment: moment()
}

当我使用 console.log(myObject) 将该对象记录到我的控制台时,我得到以下输出:

{ anything: 'This is metadata',
  moment: moment("2017-03-02T09:35:04.612") }

请注意 moment.js 对象如何打印为紧凑且可读的字符串。

现在,当我使用 winston 使用此对象记录事件时......

var winston = require('winston');
winston.configure({
    transports: [
        new (winston.transports.Console)({ prettyPrint: true })
    ]
});
winston.info('Test Log Message', myObject);

...它在我的控制台中转储了一个巨大的对象:

info: Test Log Message 
{ anything: 'This is metadata',
  moment: 
   { _isAMomentObject: true,
     _isUTC: false,
     _pf: 
      { empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -2,
        charsLeftOver: 0,
        nullInput: false,
        invalidMonth: null,
        invalidFormat: false,
        userInvalidated: false,
        iso: false,
        parsedDateParts: [],
        meridiem: null },
     _locale: 
      { _calendar: 
         { sameDay: '[Today at] LT',
           nextDay: '[Tomorrow at] LT',
           nextWeek: 'dddd [at] LT',
           lastDay: '[Yesterday at] LT',
           lastWeek: '[Last] dddd [at] LT',
           sameElse: 'L' },
        _longDateFormat: 
         { LTS: 'h:mm:ss A',
           LT: 'h:mm A',
           L: 'MM/DD/YYYY',
           LL: 'MMMM D, YYYY',
           LLL: 'MMMM D, YYYY h:mm A',
           LLLL: 'dddd, MMMM D, YYYY h:mm A' },

        etc, etc, etc…

这不是我希望在我的日志中看到的内容。我更喜欢由 console.log(myObject) 生成的紧凑字符串。

请注意我是如何将 prettyPrint 设置为 true 的。根据 winston 的文档,这意味着将使用 util.inspect 打印元数据(我的对象)

prettyPrint: Boolean flag indicating if we should util.inspect the meta (default false).

所以我很自然地尝试了以下方法:

console.log(require('util').inspect(myObject));

令我惊讶的是,它输出与 console.log(myObject) 完全相同的字符串。这是否意味着 winston 没有像我那样使用 util.inspect?还有什么我想念的吗?

更新

this line有关在 winston 的 common.js 文件中。当我执行以下代码片段时,会在我的控制台中生成一个大对象。

var meta = require('cycle').decycle(myObject);
console.log(meta);

最佳答案

当我四处摆弄时,我找到了完美的解决方案:

var winston = require('winston');
winston.configure({
    rewriters: [
        function (level, msg, meta) {
            return winston.clone(meta);
        }
    ],
    transports: [ new (winston.transports.Console)({
        level: 'debug',
        colorize: true,
        prettyPrint: true
    }) ],
});

通过复制/克隆原始元对象并返回它,输出正是我想要的,并且传输选项(如着色)得到尊重。

结果:

info: Test Log Message  
{ anything: 'This is metadata',
  moment: moment("2017-03-04T19:02:25.578") }

我很惭愧管理员我偶然发现了这个解决方案。我发现我的重写器正在修改我试图记录的实际对象,而没有先复制它。所以我添加了一行来克隆我的元对象,发现不再需要扫描我的对象并自己修改内容。

如果有人能阐明这一点并能够解释为什么这个解决方案确实有效,我将不胜感激。

关于javascript - 使用 winston 记录 moment.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550701/

相关文章:

javascript - 基于不存在的元素中断循环

javascript - 如何在日期时间选择器中使用两个验证器

javascript - 如何将数据附加到 mongodb 中的对象属性

javascript - Moment.js 问题格式方法无法正常工作

javascript - 使用 Moment JS 解析序数时的莫名其妙行为。漏洞?

javascript - 使用 jquery 循环遍历 div 中的子项并制作动画

javascript - ("[object Promise]") 无法序列化为 JSON

javascript - Vanilla js 无法在我的 Rails 应用程序上运行?

javascript - Sails JS - 添加文档并在响应中返回整个集合

javascript - 无法使用 Mongoose 模型