如何记录和跟踪NodeJS事件和事件处理程序调用?

时间:2012-09-29 19:37:59

标签: debugging node.js logging event-handling tracing

当事件处理程序被注册时,有没有办法记录所有其他注册事件处理程序?

是否有任何方法可以记录发出的所有事件,以及在运行时发生事件时触发的处理函数的名称?

如果nodejs应用程序触发链式事件(一个事件触发另一个事件)并且每个事件都有多个处理程序,当事件处理程序链的叶子发生异常时,stacktrace不会显示上下文的完整信息。

事件日志和处理程序信息在这种情况下非常有用。

一个hackey解决方案是添加(条件)记录到https://github.com/joyent/node/blob/master/lib/events.js,但我相信必须有更好的方法。

1 个答案:

答案 0 :(得分:3)

https://github.com/joyent/node/blob/master/lib/events.js#L142-147

它会发出一个带有名称和功能的newListener事件。

接下来,而不是更改events.js,打击原型。一旦你需要EventEmitter,你就可以在运行时对它进行monkeypatch。这通常是不好的做法,特别是对于像EventEmitter这样重要的东西,但它可以用来调试你自己的程序。

(function(){
  var old = EventEmitter.prototype.emit;
  EventEmitter.prototype.emit = ...
)();

接下来,记录其他处理程序:

console.log(emitter.listeners('eventName'));