一、Spring Boot的默认日志
市面上的日志框架;
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
如果仅仅只有一个日志框架的话,中途要换日志框架,我们就得修改代码,维护修改非常麻烦,所以就像JDBC---数据库驱动,使用一个统一接口层,再对其接口进行实现,这样的话我们用的时候只需要使用接口层中的API,要用哪种的日志框架,直接换对应的实现jar就可以了。
日志门面(日志接口层)
JCL(Jakarta Commons Logging) :2014年就没更新了,舍弃。
jboss-logging :只有一些特定的框架在用,一般用不着,舍弃。
SLF4j(Simple Logging Facade for Java):选用SLF4j
日志实现
Log4j :有性能问题,舍弃。
Logback:与log4j,slf4j出自同一人之手,为了解决Log4j的问题,重新写了一个框架可以使
用这个
JUL(java.util.logging) :Java防止日志市场全部被Log4j抢占,勉强出个这个抵抗下,舍弃
Log4j2:与Log4j没有任何关系,只是借它之名,很好的一个日志框架,但是很多框架没有适
配起来,舍弃。
所以最后我们选用的组合是SLF4j + Logback。Spring Boot使用的也是该组合
SLF4j的使用:这里引用官网的一张图
最下面第一个就是抽象层;第二个就是日志实现,第三个是适配层,第四个还是实现。
因为log4j与JUL出现的时候太早了,那时候还没有SLF4j,所以要写一个适配层的jar包,上面实现SLF4j,使用下面jar包的API,起到承上启下的作用。
二、遗留的问题
在我们使用框架开发的时候,它们使用的框架都是不同的,SLF4j也给出了对应的解决方案
我们就拿第一个来解释:
我们的项目接口层用的是SLF4J,想让项目中所有的日志输出都使用logback,但是别的框架使用的日志框架有commons logging,log4j,java util logging,如果把它们删了的话,框架运行就会报错(比如Spring框架使用的日志框架就是commons logging),SLF4J使用了与之对应的狸猫换太子包,拿第一个来说jcl-over-slf4j.jar来说,这个jar包内部中的包名和类名与commons logging众的包名类名都是一样的,但是其实现却是使用SLF4J的API,这样的话,我们到时候使用就可以把commons logging.jar给排除,然后引入jcl-over-slf4j.jar,就可以实现所有的日志输出就是logback
总结
如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现;
三、Spring Boot中的日志
1、Spring Boot使用它来做日志功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
底层依赖关系(Spring boot 2.1.2使用了log4j-to-slf4j替换了之前的log4j-over-slf4j)
Spring Boot底层也是使用SLF4J + logback做日志
使用中间包(狸猫换太子包)把其他的日志换成了SLF4J
2、日志使用
2.1、说明Spring Boot的默认日志级别是info
2.2、可以通过全部配置文件修改日志级别,输入的格式,默认没有日志文件输出,也可以
在全局配置文件中指定输出文件目录或者路径
下面测试了日志文件的输出位置,控制台打印日志的格式,文件中的日志格式,日
志级别
2.3、默认配置在spring-boot-2.1.2.RELEASE.jar这个包下
在这里指定了默认的日志文件在哪和日志级别的确是info
2.4、在classpath路径加入logback.xml,SpringBoot就不使用它的默认配置了,这样命
命名会跳过Spring Boot的检测,Spring Boot推荐logback-spring.xml命名方式,
这样可以在里面加<springProfile name="环境名称"></springProfile>标签,这
样就可以根据不同的环境来切换不同的配置了。
此时不是dev的环境所以是下面的格式
在命令行启动的时候指定环境dev,就是上面这种格式了