2011-10-12 85 views
12

在下面的文件,事件處理程序被描述爲以日誌的地方 http://akka.io/docs/akka/1.2/general/event-handler.html爲什麼要用阿卡事件處理程序的記錄

有一個事件處理程序,這需要記錄系統的地方在阿卡:

akka.event.EventHandler

具體地,該鏈接提供瞭如何同時使用SLF4J做到這一點的一個示例: http://akka.io/docs/akka/1.2/general/slf4j.html

我的問題是'這有什麼好處? 「爲什麼我會這樣做,而不是僅僅使用標準模式的記錄器?」

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
private static Logger log = LoggerFactory.getLogger(MyActor.class); 
... 
log.info("doing something"); 

是否有某種底層的好處我會得到,基於線程或調度程序的內部結構,通過使用一個事件處理程序在那個我沒有看到上面的記錄模式?如果沒有,使用事件處理程序進行日誌記錄感覺就像沒有明確的理由偏離熟悉的模式。

感謝您的任何意見!

回答

11

日誌通常意味着IO,這可能會減慢代碼的運行速度。在每個消息都必須在接收方法中以單個文件進行處理的參與者的上下文中,這種開銷在某些情況下可能會使該方法完成的時間的量級差異(或更大)。在基於Erlang的系統中,將日誌記錄移出運行接收塊的線程控制流程(或Erlang範圍內的進程)之外已經是一種常見模式。如果您的演員不太重視接收塊的時間安排,那麼您可以總是回到標準日誌記錄模式,如果這樣可以讓事情變得更加容易,但適應基於EventHandler的方法可能是一個好主意。

+0

感謝托馬斯,那個牌子好感。我繼續前進,並更改了我的演員的日誌記錄,以使用EventHandler.info()等方法。它似乎沒有考慮我的log4j.xml文件中指定的模式佈局,但我至少看到了我的INFO級別消息。 –

+1

異步日誌記錄聽起來有點危險。我有什麼保證:a)日誌語句以正確的順序出現,以及b)EventHandler能夠跟上系統的其他部分(如果日誌記錄是系統最慢的部分,日誌隊列只會增長並增長,直到OutOfMemory發生)。同步記錄錯誤有意義嗎? –

+0

如果您依賴特定的排序順序或保證排序,可能基於演員的方法並不適合您。也就是說,由於日誌本身是由一名演員處理的,而演員們將按照他們收到的順序給出他們的消息,所以這應該不成問題。此外,Akka有一個非常穩定的消息隊列實現,它也可以根據您的需要進行調整/調整。如果你擔心溢出緩衝區(我不確定默認情況下Akka有什麼限制),你可以使用一個有界的消息隊列並創建你自己的使用它的日誌處理程序。 –

0

@DParsin,你需要有application.conf文件在classpath至少以下幾點:

akka { 
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] 
    loglevel = DEBUG 
    stdout-loglevel = INFO 
} 

,然後當然也確保您使用的logback(或SLF4J-的log4j等。 )。 如果您的類路徑中包含logback-classic-1.0.0.jar,請確保您的類路徑中沒有任何其他SLF4J適配器。

0

在Akka 1.2中小心使用Slf4jEventHandler。你失去了在每個階級基礎設置日誌記錄級別與

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
private static Logger log = LoggerFactory.getLogger(MyActor.class); 
... 
log.info("doing something"); 

推理能力是Slf4jEventHandler僅使用一個記錄器,帶有「akka.event.slf4j.Slf4jEventHandler」的名稱

相關問題