用于使用事件处理程序配置akka记录器的记录器名称

时间:2012-01-23 20:16:29

标签: scala logging slf4j akka

所以,我正在使用 Slf4jEventHandler 和logback-classic。如何单独为不同的actor配置日志级别? [我正在使用Akka 2.0_M2]

我尝试过像

这样的事情
<configuration debug="true" scan="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="akka://TradeService" level="DEBUG" />
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

但这根本没有帮助:

INFO  akka://TradeService/user/realTimeReqListener - Declaring queue
INFO  akka://TradeService/user/restReqListener - Declaring queue
INFO  akka://TradeService/user/restReqListener - Starting listening to queue

正如您所看到的,我只是为演员提供了INFO级别的日志记录。 actor记录器的命名层次结构是什么?

2 个答案:

答案 0 :(得分:6)

我猜您正在使用Akka 2.0里程碑,我还猜测您是否获得了这样的记录器:

val log = Logging(context.system, this)

如文档所述,就日志类别而言,参与者的默认表示是其路径。遗憾的是,logback不准备处理actor层次结构,它设置为处理包名称(即以点分隔的层次结构),这就是为什么您的设置会影响错误的记录器。最近Akka master中的这个区域发生了一些变化,这将是里程碑3的一部分(现在很快就会发布),其中默认日志类别将从实际的实现类中获得(按照LoggerFactory.getLogger(someClass))。如果您想在旧的Akka版本上实现相同的功能,请使用

val log = Logging(context.system, getClass.getName)

请注意,这当然不会将您的包名称神奇地统一到actor名称层次结构,即您必须按照传统Java日志记录框架的惯例为每个actor类配置。如果您需要,请将您自己的从actor路径转换为以点分隔的层次结构名称,并将结果字符串传递给工厂:

val log = Logging(context.system.eventStream, mangleMyName(self.path))

更新到更新版本后,必须更改为使用eventStream而不是普通system,因为另一项更改是系统名称现在将附加到普通日志记录类别(如果通过)在一个系统中。假设system.name == "Fred"

val log = Logging(context.system, "testa") // will log as "testa(Fred)"

答案 1 :(得分:1)

Akka Logging并不能与开箱即用的Play完美整合。它还使用与slf4j不同的API,例如警告而不是警告,如果需要,更难以更换。

下面的特性强制使用经典的slf4j / log4j包名称结构,使得在log.conf中更容易配置记录器

import org.slf4j.LoggerFactory
import akka.actor.ActorRef

trait ActorLogger {
  implicit val self:ActorRef
  protected val log = LoggerFactory.getLogger(getClass().getName() + "_" + self.path.toString())
}

并像这样使用

class Foo extends Actor with ActorLogger {
  def run = {
    log.info("hi")
    log.warn("hi")
  }
}