转载

[翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)

在前两章 ( 一 , 二 ) ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor .

#RECAP#

这是上一节我们的Actor代码:

class TeacherActor extends Actor {    val quotes = List(     "Moderation is for cowards",     "Anything worth doing is worth overdoing",     "The trouble is you think you have time",     "You never gonna know if you never even try")    def receive = {      case QuoteRequest => {        import util.Random        //Get a random Quote from the list and construct a response       val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))        println (quoteResponse)      }   } } 

#用SLF4J给AKKA记录日志(LOGGING)#

你可能注意到我们打印了 quoteResponse 到标准控制台,这明显是个坏主意。让我们把这个日志改成是用SLF4J.

##1.将CLASS改成使用日志##

Akka提供一个不错的特性叫做 ActorLogging 来达到这个目的,让我们把他加进去:

class TeacherLogActor extends Actor with ActorLogging {     val quotes = List(     "Moderation is for cowards",     "Anything worth doing is worth overdoing",     "The trouble is you think you have time",     "You never gonna know if you never even try")    def receive = {      case QuoteRequest => {        import util.Random        //get a random element (for now)       val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))       log.info(quoteResponse.toString())     }   }    //We'll cover the purpose of this method in the Testing section   def quoteList=quotes  } 

这里有点绕:

当我们给一条消息打日志,ActorLogging中的 logging方法发布(publishes)一条log消息到 EventStream 。是的,我说的是publish。 所以,这个EventStream是什么呢?

EventStream and Logging

EventStream 的行为就像是一个消息代理,我们可以收发消息。跟常规的 MOM (面向消息的中间件)的区别就是EventStream的订阅者只能是一个Actor。

在logging meassage的场景中,所有的日志消息都会发布给EventStream。而缺省的订阅这些消息的Actor是 DefaultLogger ,其就是简单的将消息打印到标准控制台。

class DefaultLogger extends Actor with StdOutLogger {       override def receive: Receive = {         ...         case event: LogEvent ⇒ print(event)     } } 

所以,这就是我们启动 StudentSimulatorApp 的原因,我们看到日志消息被打印到了控制台。

这就是说,EventStream不只是能做logging。他是在VM中的ActorWorld里的一个通用的发布-订阅机制。

回到SLF4J配置:

##配置AKKA使用SLF4J##

akka{       loggers = ["akka.event.slf4j.Slf4jLogger"]     loglevel = "DEBUG"     logging-filter = "akka.event.slf4j.Slf4jLoggingFilter" } 

我们将这个信息保存在你classpath上的一个叫 application.conf 的文件中。在我们sbt的目录结构中,我们应该放在你的 main/resources 目录中。

在配置文件中,我们可以看出:

1. loggers 的属性指出Actor要去订阅log events。而 Slf4jLogger 干的就是简单的消费log messages并且将其带离给SLF4J日志facade。 2. loglevel 属性指出了logging的最小级别。 3. logging-filter 比较当前配置的 loglevel 和进来的log消息级别并且将低于配置的log级别的消息截断后发送给EventStream。

但在之前的例子中我们为什么没有application.conf?

简单的解释就是Akka提供一种默认机制所以我们不需要写一个配置文件。这个文件里我们有很多可以定制的东西。在 application.conf 中我们有一大堆有趣的参数可以做定制化。 这里 是一些细节信息。

未完待续

原文链接: http://rerun.me/2014/09/29/akka-notes-logging-and-testing/

文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

正文到此结束
Loading...