前言
在企业级项目里,日志框架种类杂乱不一,尤其是接手一些有些年头的老项目时,各种各样的日志框架依赖和使用让人看的头大。
如何解决各种各样日志框架的大一统呢?神器Slf4j
。
spring-boot如何利用Slf4j
集成其他日志框架?本文将以Log4j2
为例。
Slf4j简单介绍
去Slf4j官网瞧一瞧:
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.
Slf4j:Simple Logging Facade for Java.
它并不是一个类似java.util.logging, logback, log4j等的日志框架实现,而是作为一个门面服务于这些各种日志框架。如同字面含义,类似外观设计模式,提供了一组简单统一的API接口,隐藏了各种日志不一致的复杂性。
日志框架选型
几种日志框架简单对比:
log4j
:元老级日志框架。它定义的Logger、Appender、Level等概念如今已经被广泛使用,里程碑式的日志框架java.util.logging
:简称j.u.l
。java1.4版本引入,功能不如log4j
,性能和可用性有限。logback
:log4j
升级版。它比log4j
增加了不少功能,比如:原生实现了Slf4J
,支持XML、Groovy方式配置等,主要是性能比log4j
提升不少。log4j2
:同样是log4j
升级版。也比log4j
添加不少功能,比如多线程下的异步日志等。性能也提升不少。
至于logback
和log4j2
性能比对,可以参考网上博文:
根据官方推荐是Slf4j
+logback
,此处我使用Slf4j2
+log4j2
来集成日志框架。
集成Log4j2
三步完成Log4j2的集成:
- maven依赖
- 配置日志文件
- 测试日志
maven依赖
pom.xml:
<!-- 需要排除logback -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
配置日志文件
classpath下添加log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<properties>
<property name="LOG_HOME">../logs/</property>
<property name="STDOUT_FILE_NAME">stdout</property>
</properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingRandomAccessFile name="stdout-log"
fileName="${LOG_HOME}/${STDOUT_FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${STDOUT_FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
</appenders>
<loggers>
<root level="error">
<AppenderRef ref="stdout-log"/>
<AppenderRef ref="Console"/>
</root>
<logger name="com.crw" level="info" additivity="false">
<AppenderRef ref="stdout-log"/>
<AppenderRef ref="Console"/>
</logger>
</loggers>
</configuration>
修改应用日志文件路径,application.yml
:
logging.config: classpath:log4j2.xml
测试日志
增加一个EchoController:
@RestController
@Slf4j
public class EchoController {
@GetMapping("/echo/hello")
public String echo(String msg) {
log.debug("DEBUG ----> echo:{}", msg);
log.info("INFO ----> echo:{}", msg);
log.warn("WARN ----> echo:{}", msg);
log.error("ERROR ----> echo:{}", msg);
return "hello, " + msg;
}
}
调用接口地址:
curl http://127.0.0.1:8080/echo/hello?msg=world
页面输出:
hello, world
stdout.log文件输出:
2018-07-12 22:56:04.023 INFO [http-nio-8080-exec-3][EchoController.java:17] - INFO ----> echo:world
2018-07-12 22:56:04.024 WARN [http-nio-8080-exec-3][EchoController.java:18] - WARN ----> echo:world
2018-07-12 22:56:04.024 ERROR [http-nio-8080-exec-3][EchoController.java:19] - ERROR ----> echo:world
debug级别的日志并未输出和打印在控制台,info级别以上日志打印并输出控制台。可见日志测试成功。
结束语
本文简单介绍了日志框架的种类已经统一日志API框架Slf4j
,除此之外,apache下也有与Slf4j
同一职能的框架commons-logging
。之后可自行研究一下。