2012-09-29 47 views
4

當事件處理程序獲得註冊時,有沒有辦法記錄所有其他註冊的事件處理程序?如何記錄和跟蹤NodeJS事件和事件處理程序的調用?

還有什麼辦法可以記錄所有發出的事件,以及在運行時發生事件時觸發的處理函數的名稱嗎?

如果nodejs應用程序觸發鏈式事件(一個事件觸發另一個事件)並且每個事件都有多個處理程序,那麼當事件處理程序鏈的葉發生異常時,stacktrace不會顯示上下文的完整信息。

事件日誌和處理程序信息在這種情況下非常有用。

一個hackey解決方案是添加(條件)日誌記錄到https://github.com/joyent/node/blob/master/lib/events.js,但我確定必須有更好的方法。

回答

3

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

它能發出newListener事件的名稱和功能。

接下來,而不是改變events.js,打出原型。一旦你需要EventEmitter,你可以在運行時修改它。這通常是不好的做法,特別是對於像EventEmitter這樣重要的事情,但它對調試自己的程序很好。

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

接下來,登錄其他處理程序:

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

嗯,好主意:) –

+1

https://gist.github.com/bnoordhuis/1555127 – user625488