[翻译]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」。转载请注明。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2014-09-30 一则JVM memory leak解决的过程