在akka中如何使用log
akka中显示日志不需要第三方jar, 直接使用akka的Logging即可, Logging默认是输出到STDOUT, 当然你也可以使用第三方插件如SLF4J来记录日志, Logging使用的异步方式以此来达到最小的性能损耗.
代码中使用Logging
1import akka.actor.*; 2import akka.event.Logging; 3import akka.event.LoggingAdapter; 4 5 6class MyActor extends UntypedActor { 7 LoggingAdapter log = Logging.getLogger(getContext().system(), this); 8 @Override 9 public void preStart() { 10 log.debug("Starting"); 11 } 12 @Override 13 public void preRestart(Throwable reason, Option<Object> message) { 14 log.error(reason, "Restarting due to [{}] when processing [{}]", 15 reason.getMessage(), message.isDefined() ? message.get() : ""); 16} 17 public void onReceive(Object message) { 18 if (message.equals("test")) { 19 log.info("Received test"); 20 } else { 21 log.warning("Received unknown message: {}", message); 22 } 23} }
Dead letters的log
akka中默认dead letters会以info的形式输出.你可以调整显示多少dead letter, 并在之后就不再显示这些log. 另外在程序shutdown时显示相应的dead letters.
1akka { 2 log-dead-letters = 10 3 log-dead-letters-during-shutdown = on 4}
调整logging的级别
1 akka { 2 loglevel = "DEBUG" 3}
启动时显示相应的config
1akka { 2 # Log the complete configuration at INFO level when the actor system is started. 3 # This is useful when you are uncertain of what configuration is used. 4 log-config-on-start = on 5}
如果希望非常详细的显示所有接受到的消息
1akka { 2 actor { 3 debug { 4 # enable DEBUG logging of all AutoReceiveMessages (Kill, PoisonPill et.c.) 5 autoreceive = on 6 } 7 } 8 9}
使用SLF4J
-
maven中新增配置
<!-- https://mvnrepository.com/artifact/com.typesafe.akka/akka-slf4j_2.11 -->
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.7</version> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency>1<dependency> 2 <groupId>com.typesafe.akka</groupId> 3 <artifactId>akka-slf4j_2.11</artifactId> 4 <version>2.4.17</version> 5</dependency> 6<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> -
resources/目录下新增logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 文件输出 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder>
</configuration>1 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 2 <fileNamePattern>logs\akka.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 3 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 4 <maxFileSize>50MB</maxFileSize> 5 </timeBasedFileNamingAndTriggeringPolicy> 6 </rollingPolicy> 7</appender> 8<!-- 控制台输出 --> 9<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 10 <!-- 日志输出编码 --> 11 <Encoding>UTF-8</Encoding> 12 <layout class="ch.qos.logback.classic.PatternLayout"> 13 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 14 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> 15 </layout> 16</appender> 17 18<root level="DEBUG"> 19 <appender-ref ref="FILE" /> 20 <appender-ref ref="STDOUT"/> 21</root> -
程序中使用
private Logger log = LoggerFactory.getLogger(XXX.class);