【问题标题】:How to add prefix to socket.io logs redirected to winston?如何为重定向到winston的socket.io日志添加前缀?
【发布时间】:2013-09-02 20:14:38
【问题描述】:

在我的 node.js 应用程序中,我成功地将 socket.io 库生成的日志消息重定向到 winston 库:

var express = require('express')
  , winston = require('winston')
  , http = require('http');
var logger = new (winston.Logger)({
  transports: [
    // ... configuring transports ...
  ]
});
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server, {'logger': logger});

现在我想为所有这些重定向消息添加一个前缀(类似于“socket.io:”),以便将它们与应用程序其他部分产生的日志消息区分开来。有没有办法做到这一点?

【问题讨论】:

  • 这不是特定于 socket.io 的问题,如果只保留 Winston 来修改问题标题可能会更好。 Socket.io,在这种情况下,只是一个例子

标签: node.js socket.io winston


【解决方案1】:

在记录器传输中添加标签。

var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({
      json : false,
      timestamp : true,
      label: "socket.io:"
    })
  ]
});

日志消息将如下所示 -

2013-08-30T08:26:52.703Z - info: [socket.io:] socket.io started
2013-08-30T08:26:52.705Z - info: [socket.io:] hello

在此处查看更多有关 winston 的日志记录选项 - https://github.com/flatiron/winston

【讨论】:

  • 我是否理解正确,我必须仅为 socket.io 消息创建一个单独的记录器,并为其他所有内容使用另一个记录器?如果可能的话,我宁愿只使用一个记录器。
  • 您没有为 socket.io 使用单独的记录器。当您执行require('socket.io')...{'logger': logger}); 时,您是在告诉socket.io 使用winston 记录器。您可以在节点应用程序的任何位置使用相同的 winston 记录器。
  • 好的,但我只想为 socket.io 消息添加前缀,而不是向所有发送给 winston 的消息添加前缀。我不知道,我怎样才能删除/更改logger.log("info", "app started"); 中的标签。
  • 您可以为此创建类别。在这里查看github.com/flatiron/…
  • 我认为winston.loggers.add('category1', {...}); 创建了一个新的记录器。而且我不确定从更多记录器/类别写入一个文件是否正确。
【解决方案2】:

我通过添加以下函数解决了它

var winston = require('winston');

// Add prefix function
winston.prefix = function (filename)
{
    var label = '[' + path.parse(filename).name + ']';
    var override = function (lvl) {
        return function () {
            var args = [].slice.call(arguments);
            if (args[0]) {
                if (typeof(args[0]) === 'string')
                    args[0] = label + ' ' + args[0];
                else
                    args.unshift(label);
            }
            winston[lvl].apply(null, args);
        };
    };
    var log = { };
    for (var lvl in winston.levels) {
        log[lvl] = override(lvl);
    }
    return log;
}

然后在每个模块中

var log = require('winston').prefix(__filename);
log.debug('hello');

var log = require('winston').prefix('socket_io');
log.debug('hello');

【讨论】:

    【解决方案3】:

    这不是 Winston 特有的,而是针对前缀和中间件的通用 JS 解决方案...

    var log = console.log;
    function x(){ // optionally pass in post/pre fix here
      // caution do not put (var log = console.log()) here, the arguments will build up [ arg1 ] -> [ [arg1] , arg2 ] -> [ [ [ arg1 ] , arg2] , arg3 ] 
      console.log = function () {
            var args = Array.from(arguments);
            args.push('post fix');
            log.apply(console, args);
        }
    }
    
    new x()
    console.log(1)
    new x()
    console.log(2)
    
    OUTPUTS: 
    1 post fix
    2 post fix
    
    

    或者更好...

    const log = console.log;
    export default function middleWare(event) { // optionally pass in post/pre fix here
        console.log = (...args) => {
            log(...args, event.id);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 2018-11-21
      • 1970-01-01
      • 2012-05-03
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多