首先举个例子来说明日志框架的演变
1、某公司的小王正在开发一个大型系统,开发过成功为了调试程序,代码中有许多的System.out.println("");来打印一些关键的数据到控制台上用来调试程序,但是上了生产之后这些都是无用的代码,小王需要一个一个注释掉。后来生产中程序出现异常有需要将打印的数据打开重新上生产去通过数据调试问题。问题找到并解决之后哪些打印有没有用了... ... ... ...这样做是不是很麻烦
2、小王为了解决这个问题,于是自己开发了一个日志框架,用来记录系统运行时的一些日志,并且可以随意控制打印的开启和关闭,比如这个框架叫做 log_wang.jar
3、但是随着时代的进步和系统的升级自己原来的写的日志框架已经不能满足基本的需求,比如需要打印到不同的目的地,需要根据日志的大小进行日志的分割... ...于是小王又开发了一套日志框架叫做 log_wang_1.jar,但是这需要吧原来的log_wang.jar这套日志框架替换下来,并且程序中的日志代码都需要更换... ...显然这也很麻烦
4、于是小王突然想到了JDBC和数据库驱动的关系,想到了只要写一套统一的日志层接口就行,使日志框架去实现这套接口,代码中日志记录方法的调用直接调用抽象层的方法就行,于是小王开发了一套统一的日志接口log_interface.jar, log_wang.jar和log_wang_1.jar去实现log_interface.jar,程序中引入log_interface.jar,记录日志的时候用log_interface.jar的日志记录方法,如果你程序想用log_wang.jar的日志框架就引入此jar包就可以,如果想用log_wang_1.jar的日志框架就引入相关jar包就行,日志调用的代码无需改变,这样也能实现日志框架的切换。岂不快哉
市面上的日志框架
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....日志门面 (日志的抽象层) |
日志实现 |
JCL(Jakarta Commons Logging) jboss-logging SLF4j(Simple Logging Facade for Java) |
JUL(java.util.logging) Log4j Log4j2 Logback |
其中log4j/log4j2/logback都是SLF4j的实现
Spring框架,Spring框架默认是用JCL;
SLF4j和Logback的使用
1、如何在系统中使用SLF4j https://www.slf4j.org以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;
给系统里面导入slf4j的jar和 logback的实现jar
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
问题:我们现在用的日志框架是(slf4j+logback),但是项目中我们会引用好多框架如 Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、... ...但是Spring用的是commons-logging日志框架,Hibernate用的是jboss-logging日子框架;
我们如何统一日志记录,即使是别的框架和我一起统一使用slf4j进行输出?
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现
例如:SpringBoot日志关
SpringBoot使用它来做日志功能 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐logging</artifactId> </dependency>
总结:
1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录
2)、SpringBoot也把其他的日志都替换成了slf4j;
3)、中间替换包?
4)、如果我们要引入其他框架?一定要把这个框架的默认日志依赖移除掉?
Spring框架用的是commons-logging;
<dependency> <groupId>org.springframework</groupId> <artifactId>spring‐core</artifactId> <exclusions> <exclusion> <groupId>commons‐logging</groupId> <artifactId>commons‐logging</artifactId> </exclusion> </exclusions> </dependency>SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要 把这个框架依赖的日志框架排除掉即可