写在前面

鉴于有人留言说想要学习SpringBoot相关的知识,我这里打算写一个SpringBoot系列的相关博文,目标呢是想让看了这一系列博文的同学呢,能够对SpringBoot略窥门径,这一系列的博文初步都定下来包括SpringBoot介绍、入门、配置、日志相关、web开发、数据访问、结合docker、缓存、消息队列、检索、任务安全、分布式等等一系列的博文,工作量很大,是个漫长的过程,每一步我都尽量详细,配上截图说明,也希望对看的同学真的有用。
单纯就是想分享技术博文,还想说一句就是,如果觉得有用,请点个关注、给个赞吧,也算对我来说是个宽慰,毕竟也得掉不少头发,嘿嘿嘿

系列文章传送条

详细SpringBoot教程之入门(一)
详细SpringBoot教程之入门(二)
详细SpringBoot教程之配置文件(一)
详细SpringBoot教程之配置文件(二)
详细SpringBoot教程之日志框架
详细SpringBoot教程之Web开发(一)
详细SpringBoot教程之Web开发(二)
详细SpringBoot教程之Web开发(三)
详细SpringBoot教程之数据访问
详细SpringBoot教程之启动配置原理
详细SpringBoot教程之缓存开发

先通俗来理解日志

假设现在我们没有日志框架,那么这个时候我们有一个需求,开发一个大型的系统,那么在我们开发的过程中,我们需要检查一些代码的正确与否、是否正常运行、监控代码运行的状况,这时候我们怎么做?当然,我们在需要检查的地方使用System.out.print(“”)进行输出相关信息,当然,我们也可以控制流输出到一个文件中,不过这个方式有个问题就是,如果我们需要改动一些输出的格式或者信息,那么我们又要到项目代码的各个地方去修改,非常的麻烦,那么这个时候我们会想到进行改进。

如果改进呢,就是专门写一些输出信息的方法,然后把这些方法打包成一个jar进行引用,这样做是的我们可以对使用的方法进行统一的修改,而且还使得我们可以在其他的项目中接着使用,我们可以说已经有一个日志框架的雏形了。不过这个时候我们又有一些想法,既然已经可以输出一些日志信息了,那么我们想要增加几个高大上的功能,比如异步模式、自动扫描等等功能。这个时候我们对jar进行修改升级,加入了这些功能,这样我们的日志框架有有点样子了,可以说是一个正儿八经的日志框架了。

不过不要高兴的太早,正儿八经的日志框架并不代表成熟,我们还有一个问题需要解决,就是如果我们想要对正在使用的jar包API进行修改升级,这个时候难道我们需要对项目中使用到的地方全部 进行修改么?这样当然不行,所以这个时候日志框架就需要分层,即抽象成和实现层,我们可以像JDBC那样拥有统一的接口层,底层无论使用什么数据库都没关系,我们都可以使用。完成了抽象层和接口层的分离,这个时候的日志框架算是一个成熟的日志框架了。

SpringBoot日志框架选择

开发中存在非常多的日志框架,JUL(java.util.logging),JCL(Apche Commons Logging),Log4j, Log4j2,Logback,SLF4j,jboss-logging等。SpringBoot在框架内容部分使用JCL,spring-boot-starter-logging采用了slf4j+logback的形式,SpringBoot也能自动适配(jul,log4j2,logback)并简化配置,可以进行如下分类
| 日志的抽象层 | 日志实现 |
|–|–|
| JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |

我们要使用SpringBoot的日志框架,也就是说我们需要一个抽象层和一个实现层,我们这里选择SLF4j作为抽象层,logback作为实现层。这里要说一下的是,SpringBoot底层是Spring框架,Spring框架默认的是JCL作为抽象层。

SLF4j使用

(我们创建新项目中已经帮我们导入了slf4j和logback)如何在系统中使用SLF4j?在开发的时候不应该直接使用日志实现类,应该使用日志的抽象层。具体参考 SLF4J 官方。下图是 SLF4J 结合各种日志框架的官方示例,从图中可以清晰的看出 SLF4J API 永远作为日志的门面,直接应用与应用程序中。
slf4j官网用户手册
在这里插入图片描述
同时 SLF4 官方给出了简单示例。

1
2
3
4
5
6
7
8
9
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 的 jar 和 日志框架的实现 jar。由于每一个日志的实现框架都有自己的配置文件,所以在使用 SLF4 之后,配置文件还是要使用实现日志框架的配置文件。

思考一个问题

是什么问题呢?这么描述,我们想要写一个SpringBoot项目,日志框架组合我们打算使用Slf4j+logback,然后项目中集成了Spring,Hibernate,MyBatis等等组件依赖,这个时候会有一个问题,就是我们集成的组件框架中存在自己的日志框架,比如Spring自带commons-logging、Hibernate(jboss-logging)等等,那么这个时候,我们的项目里面就像一个日志框架的大杂烩一样,非常的乱,那么我们就需要给我们项目中日志框架做统一,也就是说,不管我依赖的组件自带了什么日志框架,我只要配置我的Slf4j+logback就可以了。
问题当然也有解决办法,这里我们来看看官方文档
在这里插入图片描述
也就是说,我们需要分别引入我们组件日志的覆盖层,因为我们想要去除组件中的日志,不可能跑去删除组件的日志框架包,这样会导致组件崩溃,底层源码都被该了还不崩溃,所以我们在删除其他组件的日志框架jar包的时候,需要导入一层覆盖层jar包,这个jar中依旧有原来组件的日志框架的API,组件运行就不会报错,就相当于多做了一层适配,我们调用Slf4j+logback,然后通过这层适配层调用各组件的日志框架。

步骤总结:

排除系统中的其他日志框架。
使用中间包替换要替换的日志框架。
导入我们选择的 SLF4J 实现。

SpringBoot日志关系

我们从我们新创建的项目出发要阐述和研究,这样更方便我们理解和说明,首先我们来看我们新项目中的pom.xml文件中的内容,我们是一个新项目,什么都没引入,这些都是自动引入的内容。
在这里插入图片描述
发现pom.xml中引入了starter启动器,其实每个启动器都会引入大量的依赖,那么我们怎么查看呢,有两种方法,第一种如下
在这里插入图片描述
从上面的分析,Spring Boot 对日志框架的使用已经是清晰明了了,我们也可以使用 IDEA 工具查看 Maven 依赖关系,可以清晰的看到日志框架的引用。
在这里插入图片描述
在这里插入图片描述
可是话的依赖关系是不是眼前一亮,现在,我们可以来看spring-boot-starter这里,找到spring-boot-starter-logging(每个节点都可以双击点击,点击将进入对应的自动配置类)
在这里插入图片描述
进入到spring-boot-starter-logging中,可以看到如下

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.2.4.RELEASE</version>
<scope>compile</scope>
</dependency>

这就是SpringBoot的日志使用,我们前面博文说过,每一个starter都是一个场景启动器,而这个就是我们SpringBoot用于日志场景的启动器,里面有非常多的依赖
在这里插入图片描述

关系总结

SpringBoot底层也是使用slf4j+logback的方式进行日志记录,SpringBoot也把其他日志框架替换成了slf4j,默认的中间替换包如下
在这里插入图片描述
如果我们要引入其他的框架,一定要把这个框架的默认日志依赖都移除掉。

SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架的依赖的日志框架移除掉。

日志使用

logging.level

用我们新创建的项目直接运行,SpringBoot是帮我们配置了日志的。我们现在测试类中写入如下内容,说明一下的是,这里的顺序是日志的级别,由低到高。我们可以调整输出日志的级别,日志就只会在这个级别及以后的高级别生效。我们先不调整,运行一下这个测试类
在这里插入图片描述
默认是输出info级别及以上的日志,也就是说info是我们的root级别,当然我们可以在主配置文件中修改,如下
在这里插入图片描述
在这里插入图片描述

logging.file.name

在这里插入图片描述
在这里插入图片描述
当然我们还可以使用logging.path指定我们日志输出的目录,日志文件默认为spring.log。

logging.pattern.console

在这里插入图片描述
日志的输出格式如下

  • %d表示日期时间
  • %thread表示线程名
  • %-5level级别从左显示5个字符串
  • %logger{50}表示从logger名字最长50个字符,否则按照句点分隔
  • %n换行符

不过这其实是日志的一小部分功能,如果我们还需要使用异步日志等功能的话,那么我们可能需要专门进行编写日志的配置文件,可能一听到编写日志配置文件就头疼,其实不要担心,不难的,官方日志配置文件说明
在这里插入图片描述
也就是我们使用的是logback,所以我们可以创建一个logback.xml放在resources目录下,里面写着我们日志配置的相关内容,没错,直接创建就可以了,不需要配置什么,SpringBoot就会自动识别(主要要和官网的命名一样哦)

这里值得说明一下的是,我们可以创建另一种命名logback-spring.xml,这个文件依然可以被SpringBoot自动识别,但是和logback.xml的区别就是,在这个里面我们可以使用SpringBoot的高级profile功能(profile就是我们之前说的环境分发)
在这里插入图片描述

切换日志框架

如果我们想要切换日志框架(当然不建议哈,logback挺好用的,这里只是教你如果有需要的话怎么去做,依旧是打开Diagrams,然后进行如下步骤)
在这里插入图片描述
然后在依赖中就会被排除掉,这个时候我们只要在pom.xml中引入我们想要换的那个日志实现层就可以了,切换的依据记得按照上面说的各种日志框架的配置使用,不要切换错了哦。

下一篇

SpringBoot的日志框架的相关基础知识我们就讲到这里,写一篇博文我们将要正式开始写一个web应用,体验一下SpringBoot的代码乐趣。