目录标题
前言
当前文章只是学习笔记,具体请点击超链接:视频
简介
Java中常用的日志有JUL、Log4j、logback、Log4j2。但不建议直接使用日志本身的API,因为如果每个日志的实现的功能相同但接口不一样,如果想要给项目切换日志框架就得改大量代码。阿里巴巴的Java开发手册规定,应该使用门面日志(Slf4j、JCL)。让门面日志去调用JUL、Log4j、logback、Log4j2日志的接口。
快速开始
Maven依赖
首先添加门面日志的依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.27</version>
</dependency>
老规矩,添加一些辅助测试的插件与依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
测试代码
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jTest {
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);
@Test
public void quickTest() {
LOGGER.info("info message: name:{},age:{}", "zhangsan", 30);
try {
int n = 1 / 0;
} catch (Exception e) {
LOGGER.error("Custom Exception:", e);
}
}
}
按照之前JCL门面日志的使用经验,我们只添加了Slf4j门面日志依赖,没有添加具体实现日志的依赖,Slf4j应该会调用JDK自带的JUL。但很可惜,SLF4J并不会自动调用JUL,此时日志报错了,提示需要添加操作日志的依赖,并且给出了解决这问题的链接:
我们也可以打开slf4j的用户手册:
https://www.slf4j.org/manual.html
其中有一幅图,说明了,如果要使用Log4j或JUL去输出日志,需要添加适配器。而像logback这些出现时间比较晚的日志,遵循的slf4j接口的规范,所以不需要额外添加适配器。
现在我们测试使用JDK自带的日志jul,所以再添加一个Slf4j-jdk适配器
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.31</version>
</dependency>
再次运行测试代码,成功输出日志
Slf4j整合log4j
再新建一个Maven工程,导入依赖
<!-- slf4j门面日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.27</version>
</dependency>
<!-- 实现日志功能的框架 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 门面日志整合log4j的适配器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.32</version>
</dependency>
resource目录下,添加log4j.properties配置文件
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
再次运行快速开始中的测试代码,可成功在控制台输出日志
Slf4j整合logback日志
logback日志简介
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
官方网站:https://logback.qos.ch/index.html
Logback当前分为下面几个模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j。
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
Logback使用
新创建一个Maven工程,导入依赖日志依赖。此处省略了Junit单元测试与编译插件的代码,使用上面快速开始中的代码即可。这里不再重复:
<!-- 日志实现框架logback-core + 门面日志slf4j-api -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
再次运行快速开始中的测试代码,可成功在控制台输出日志
注意:导入logback-classic依赖后,不用导入logback-core和slf4j-api。因为logback-classic中包含了logback-core和slf4j-api
logback配置
logback会依次读取以下类型配置文件:
- logback.groovy
- logback-test.xml
- logback.xml
如果均不存在会采用默认配置
(TODO,具体配置文件,有时间再记录)
Log4j项目升级成Logback+slf4j
假如项目使用了Log4j日志,也没有使用门面日志API,在项目里已经写了大量调用Log4j原生API的代码。现在想全面改用slf4j+Logback作日志框架,然后又不想修改以前写好的Log4j日志代码。这时,可以使用桥接器。
官方文档:
https://www.slf4j.org/legacy.html
假设旧项目的maven依赖只有一个log4j。
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
resource目录下,添加log4j.properties配置文件
# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
假如旧项目的代码为:
import org.apache.log4j.Logger;
import org.junit.Test;
public class Slf4jTest {
private static final Logger LOG4J_LOGGER = Logger.getLogger(Slf4jTest.class);
@Test
public void quickTest() {
LOG4J_LOGGER.info("info message ---------- log4j");
}
}
升级成slf4j+logback的具体操作是:
- 添加logback-classic(包含了日志实现框架logback-core和门面日志slf4j-api)
- 添加log4j到slf4j桥接器
- 删除旧的log4j依赖
<dependencies>
<!-- 日志实现框架logback-core + 门面日志slf4j-api -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- log4j到slf4j桥接器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
添加测试代码,旧的log4j和新的logback日志可以同时运行
import org.apache.log4j.Logger;
import org.junit.Test;
import org.slf4j.LoggerFactory;
public class Slf4jTest {
private static final Logger LOG4J_LOGGER = Logger.getLogger(Slf4jTest.class);
private static final org.slf4j.Logger SLJ4F_LOGGER = LoggerFactory.getLogger(Slf4jTest.class);
@Test
public void quickTest() {
LOG4J_LOGGER.info("info message ---------- log4j");
SLJ4F_LOGGER.info("slf4j ========= info message");
}
}