前言
对于编码人员来说,在开发过程中引入第三方日志库来打印信息是必不可少的,而很多程序员也已经熟悉各种不同的日志库如java.util.logging、apache log4j、logback,那么当看到已有项目中既有slf4j和log4j而感到困惑,或者是以前没听过slf4j的话,就有必要去在你项目中学习使用slf4j了。
一、log4j和slf4j的区别
log4j( log for java )(4 同 for)
Apache的一个开源项目,可以灵活地记录日志信息,我们可以通过Log4j的配置文件灵活配置日志的记录格式、记录级别、输出格式,而不需要修改已有的日志记录代码。
slf4j:simple log facade for java 简单日志门面
slf4j不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
可以将log4j看成是一个完整的日志库,而slf4j是一个日志库的规范接口。
那么使用slf4j有什么好处呢?
1. 让日志和项目之间解耦
想象一下这种场景,目前我们的项目已经使用了log4j作为日志库,有一天我们引入了一个技术大牛编写的组件,但是这个组件使用的是logback来进行日志输出,那么问题就来了,我们就不得不需要添加两个实现同样功能的jar包并且维护两套日子配置。
而slf4j 是一个适配器,我们通过调用slf4j的日志方法统一打印我们的日志,而可以忽略其他日志的具体方法,这样,当我们的系统换了一个日志源后,不需要更改代码
2. 节省内存
log4j这些传统的日志系统里面并没有占位符的概念,当我们需要打印信息的时候,我们就不得不创建无用String对象来进行输出信息的拼接。
private void log4jTest(){
String errormsg = "something error happen...";
logger.info("错误信息为:"+errormsg);
}
slf4j可以使用占位符,这样日志输出的时候就可以避免无用字符串对象的创建
private void slf4jTest(){
logger.info("错误信息为:{}","something error happen...");
}
二、在项目中使用slf4j
1. 在项目pom文件中引入
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.13</version>
</dependency>
或者引入
<!-- 引入log4j日志依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
2. 在类中使用LogFactory创建类的log对象
注意:一般来说,我们会用static、final关键字来对日志对象进行修饰。
- 设置为private是为了防止其他类使用当前类的日志对象;
- 设置为static是为了让每个类中的日志对象只生成一份,日志对象是属于类的,不是属于具体的实例的;
- 设置成final是为了避免日志对象在运行时被修改。
参考文档:
https://blog.csdn.net/minicto/article/details/52672472
https://www.cnblogs.com/hafiz/p/5486858.html