2011-10-12 51 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”的名称

相关问题