在前两章

,



,我们大致讲了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. .NET J2EE APP全局会话架构运用场景

    .NET J2EE APP全局会话架构运用场景, 全局会话运用拓扑图代码核心架构为.NET架构开发C#语言为主代码架构分为全局会话中心.ASP.NET会话节点..NET会话节点针对WCF服务器与APP ...

  2. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  3. python第一天基础1-2

    python入门 1 第一个python代码: 在linux上创建第一个.py脚本 #!/usr/bin/env python #-*- coding:utf-8 -*- print "He ...

  4. Android上dip、dp、px、sp等单位说明(转)

    dip  device independent pixels(设备独立像素). 不同设备不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. 在 ...

  5. Ubuntu 14.04 配置静态IP

    命令行手工配置静态IP比较麻烦,记录于此备查. 1,ubuntu的网络配置文件在: # /etc/network/interfaces //这个文件里 2,默认安装时,网络配置是使用DHCP自动分配I ...

  6. UVALive 2191 Potentiometers (树状数组)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. SAS零散知识总结

    1,变量名命名规范:以字母或者下划线开始,可包含字母.下划线.数字,且不超过32个字符: 2,INFILE用于读取外部数据文件,一般于FILENAME(和LIBNAME用户一致,但路径要精确到文件名( ...

  8. pushState 和 replaceState

    使用此方法浏览器前进后退仍然可查看对应内容 设置值 history.pushState({}, "页面标题", "xxx.html"); history.rep ...

  9. js中,var 修饰变量名和不修饰的区别

    js中 允许在定义变量的时候 不加var 修饰符.js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存.当且将其视为window的成员. 也就是全局变量. 如果加了va ...

  10. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...