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

Ust*_*gat 6 logging scala 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>
Run Code Online (Sandbox Code Playgroud)

但这根本没有帮助:

INFO  akka://TradeService/user/realTimeReqListener - Declaring queue
INFO  akka://TradeService/user/restReqListener - Declaring queue
INFO  akka://TradeService/user/restReqListener - Starting listening to queue
Run Code Online (Sandbox Code Playgroud)

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

Rol*_*uhn 6

我猜你正在使用Akka 2.0里程碑,我进一步猜测你得到了这样的记录器:

val log = Logging(context.system, this)
Run Code Online (Sandbox Code Playgroud)

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

val log = Logging(context.system, getClass.getName)
Run Code Online (Sandbox Code Playgroud)

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

val log = Logging(context.system.eventStream, mangleMyName(self.path))
Run Code Online (Sandbox Code Playgroud)

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

val log = Logging(context.system, "testa") // will log as "testa(Fred)"
Run Code Online (Sandbox Code Playgroud)