所以,我正在使用 Slf4jEventHandler 和 logback-经典。如何分别为不同的参与者配置日志级别? [我使用的是 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
如您所见,我只获取 Actor 的 INFO 级别日志记录。 Actor 记录器的命名层次是什么?
最佳答案
我猜测您正在使用 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)
请注意,这当然不会将角色名称层次结构与您的包名称神奇地统一起来,即您必须按照传统 Java 日志框架的惯例配置每个角色类。如果需要,请编写您自己的从 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)"
关于scala - 使用事件处理程序配置 akka 记录器的记录器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977983/