最近项目用到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