在AKKA中使用slf4j-api

2017-08-22

最近项目用到akka的actor系统并且采用spring框架,但是采用框架的slf4j-api无法打印出对于akka调试非常有用的actor-path。又由于默认情况下,akka有自己的log实现,因此需要对其日志框架进行整合。非常幸运akka支持slf4j-api。

配置步骤

1.添加pom.xml依赖

1
2
3
4
5
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-slf4j_2.11</artifactId>
<version>${akka.version}</version>
</dependency>

其中${akka.version}配置成与当前使用的akka版本相同

2.修改akka配置文件

1
2
3
4
5
6
// application.conf
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
loglevel = "INFO"
}

其中logging-filter配置会使slf4j的日志等级过滤生效,loglevel控制全局的日志等级

3.actor-path的打印

actor-path对于akka来说可以用于定位错误来源,因此比较重要。可以按如下方式启用:

首先类中声明logger

1
LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);

这里需要注意的地方是不是采用slf4j的接口声明,而采用以下包中的类

1
2
import akka.event.Logging;
import akka.event.LoggingAdapter;

其次在日志配置文件的日志格式pattern添加%X{akkaSource},示例如下

1
2
3
4
5
6
7
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
[%-5level] [%d{MM-dd HH:mm:ss.SSS}] [%thread] [%X{akkaSource:-not akka system}] %logger{15}.%method{10} - %msg%n
</Pattern>
</layout>
</appender>

此处运用了logback支持的MDC(Mapped Diagnostic Context)功能

参考

官方文档:http://doc.akka.io/docs/akka/current/java/logging.html#slf4j