1、 slf4j与其余日志框架的区别和联系
几个有名的Java日志框架:
- log4j
- commons-logging
- jdk-logging
- slf4j
- logback
- log4j2
上面几个日志框架简单分为两类: - 日志门面 commons-logging,slf4j
- 日志实现 log4j,jdk-logging,logback,log4j2
所谓的日志门面就是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。
slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独的slf4j是不能工作的,必须搭配其他具体的日志实现方案,比如log4j或者log4j2,要在系统中使用slf4j,我们需要引入的核心包为:slf4j-api-1.6.4.jar。
如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以在方法前用注解@Slf4j,然后直接使用log.info去打印日志。如果注解@Slf4j注入后找不到变量log,那就给IDE安装lombok插件(idea中:1、File → settings → Plugins, 然后点击“Browse repositories”;2、输入 lombok 搜索插件, 点install安装,安装完重启idea)。
2、Hello World
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>yuan</groupId>
<artifactId>slf4j_01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
新建log4j.properties,位于resourses目录下
log4j.rootLogger=ERROR,console,file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=d:/test.log
log4j.appender.file.DatePattern='_'yyyyMMdd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss,SSS} %p %c (%L) -%m %n
#设置指定包的level等级(rootLogger代表所有),但是不能再指定appender,否则每个appender会打印两次
log4j.logger.org.smart4j=DEBUG
测试类PropsUtil :
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class PropsUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);
public static void main(String[] args) throws IOException {
/*测试日志*/
LOGGER.error("Hello World");
}
}
执行结果:
3、注解方式使用slf4j
如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以在方法前用注解@Slf4j,然后直接使用log.info去打印日志。如果注解@Slf4j注入后找不到变量log,那就给IDE安装lombok插件(idea中:1、File → settings → Plugins, 然后点击“Browse repositories”;2、输入 lombok 搜索插件, 点install安装,安装完重启idea)。
对上面的Hello World例子进行如下修改:
pom.xml中添加lombok依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
测试类PropsUtil改为:
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
public class PropsUtil {
// private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);
public static void main(String[] args) throws IOException {
/*测试日志*/
// LOGGER.error("Hello World");
log.error("Hello World");
}
}
在类前面使用@Slf4j注解后为该类自动生成log日志对象,执行可以看到与刚才相同的效果。
4、日志系统桥接器
这部分由于时间关系没有全部验证,先记录于此。
日志系统桥接器说白了就是一种偷天换日的解决方案。
比如log4j-over-slf4j,即log4j -> slf4j的桥接器,这个库定义了与log4j一致的接口(包名、类名、方法签名均一致),但是接口的实现却是对slf4j日志接口的包装,即间接调用了slf4j日志接口,实现了对日志的转发。
slf4j+log4j
如果我们在系统中需要使用slf4j和log4j来进行日志输出的话,我们需要引入下面的桥接jar包:
log4j核心jar包:log4j-1.2.17.jar
slf4j核心jar包:slf4j-api-1.6.4.jar
slf4j与log4j的桥接包:slf4j-log4j12-1.6.1.jar,这个包的作用就是使用slf4j的api,但是底层实现是基于log4j.
private static final Logger logger = LoggerFactory.getLogger(Slf4jTest2.class);
slf4j+log4j2
如果我们在系统中需要使用slf4j和log4j2来进行日志输出的话,我们需要引入下面的jar包:
log4j2核心jar包:log4j-api-2.7.jar和log4j-core-2.7.jar
slf4j核心jar包:slf4j-api-1.6.4.jar
slf4j与log4j2的桥接包:log4j-slf4j-impl-2.7.jar,这个包的作用就是使用slf4j的api,但是底层实现是基于log4j2.
private static final Logger logger = LoggerFactory.getLogger(Slf4jTest2.class);
slf4j+log4j不修改代码升级到log4j2
如果我们系统中刚开始用的是slf4j和log4j,然后出于性能考虑,要升级到slf4j和log4j2,并且不需要改动任何代码的话(因为我们系统可能是一个大工程,然后基本上每个类都会有日志输出,改动代码可能牵一发而动全身),出于这个考虑,我们可以这样来进行修改(修改依赖):
1、删除项目中存在的Log4j1.x所必须的log4j和slf4j-log4j12等依赖,例如从我们上面做的去升级的话,需要删除log4j-1.2.17.jar和slf4j-log4j12-1.6.1.jar
2、添加log4j2和slf4j桥接包:log4j-slf4j-impl-2.7.jar替换log4j和slf4j桥接包:slf4j-log4j12-1.6.1.jar
3、如果我们在系统中使用了log4j的api去获取Logger的话:
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Log4jTest.class);
我们需要添加log4j-1.2-api-2.7.jar去替换log4j-1.2.17.jar
4、将log4j的properties文件修改为log4j2的xml文件
然后,同样在系统中使用slf4j的方式获取日志:
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Self4jTest.class);