在前两章

,



,我们大致讲了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」。转载请注明。

[翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)的更多相关文章

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

    3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...

  2. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6

    原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...

  3. [翻译]AKKA笔记 -ACTOR SUPERVISION - 8

    失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...

  4. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

    原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...

  5. [翻译]AKKA笔记 - DEATHWATCH -7

    当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...

  6. [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

    原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...

  7. [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3

    上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...

  8. [翻译]AKKA笔记 - 有限状态机 -1

    原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...

  9. 翻译:AKKA笔记 - 介绍Actors

    任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 ...

随机推荐

  1. Linux下Hadoop2.6.0集群环境的搭建

    本文旨在提供最基本的,可以用于在生产环境进行Hadoop.HDFS分布式环境的搭建,对自己是个总结和整理,也能方便新人学习使用. 基础环境 JDK的安装与配置 现在直接到Oracle官网(http:/ ...

  2. andorid frameanimation

    Android中的逐帧动画 先来说说什么是逐帧动画,逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使 ...

  3. 复合梯形公式与Simpson公式的数值积分

    #include <iostream>#include<math.h>#include<stdio.h>using namespace std; float f(f ...

  4. git 命令大全

    git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...

  5. 除法取模练习(51nod 1119 & 1013 )

    题目:1119 机器人走方格 V2 思路:求C(m+n-2,n-1) % 10^9 +7       (2<=m,n<= 1000000) 在求组合数时,一般都通过双重for循环c[i][ ...

  6. 8天入门wpf(转)

    8天入门wpf—— 第一天 基础概念介绍 8天入门wpf—— 第二天 xaml详解 8天入门wpf—— 第三天 样式 8天入门wpf—— 第四天 模板 8天入门wpf—— 第五天 数据绑定 8天入门w ...

  7. RestSharp简单扩展

    using RestSharp; using RestSharp.Deserializers; using RestSharp.Serializers; using System; using Sys ...

  8. xUtils 中的BitmapUtils 全面注释

    /** * 加载图片工具类 * @author afu * */ public class BitmapUtils implements TaskHandler { /** * 判断任务是否暂停 */ ...

  9. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  10. we are the champion!!!!