温斯顿日志框架是否真正异步?

12
我正在使用Node.js中的winston开发日志框架,我已经检查过winston是否使用了Async模块,但我需要验证它是否真正具有异步特性。
请建议。

1
点赞 - 这是一个好问题,尽管写得不太好。 - Alexander Mills
1个回答

11
我对Winston没有任何经验,只是知道它的作用。在快速查看github上的源代码后,我认为winston不是在所有方面都真正异步的。
  • 它会发出信号,但EventEmitter不是异步的。
  • 方法具有基于异步风格的签名(使用callback),但并非总是异步的。

Console传输调用callback而没有nextTick - 它具有异步风格的签名,但仍然在同一个tick内,例如:

Console.prototype.log = function (level, msg, meta, callback) {
  if (this.silent) {
    return callback(null, true);
  }
  //...
  if (level === 'error' || level === 'debug') {
    process.stderr.write(output + '\n');
  } else {
    process.stdout.write(output + '\n');
  }

  //
  // Emit the `logged` event immediately because the event loop
  // will not exit until `process.stdout` has drained anyway.
  //
  self.emit('logged');
  callback(null, true);
};

LoggerConsole 类似,如前所述,它会立即回调而不需要 nextTick(或其他真正的异步操作)。它确实使用了async 模块,但在某些情况下也不是完全异步的,即:

  function cb(err) {
    if (callback) {
      if (err) return callback(err);
      callback(null, level, msg, meta);
    }
    callback = null;
    if (!err) {
      self.emit('logged', level, msg, meta);
    }
  }

  async.forEach(this._names, emit, cb);

我会承认,File 传输器是异步的,但这只是因为 fs 是异步的。

不要忘记,无论如何,“控制台函数在目标是终端或文件时都是同步的”。


5
哈哈,如果所有东西都是异步的,那什么也不会发生,因为一切都将“在未来返回” :) 使用事件发射器并不意味着是非异步操作。重要的是I/O是异步的。 - Alexander Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接