SpringBoot与日志
日志框架、日志配置
1. 日志框架
JDBC和数据库驱动:
JDBC是统一的接口层(抽象层),面向JDBC进行开发,而不直接面向数据库驱动,这样的好处是数据库驱动会不断的出现新产品,如果直接面向数据库驱动开发,那么,每次更换数据库驱动,开发的代码就要做相应的调整,而面向JDBC开发,不管换成什么数据库驱动,我们的代码都不需要再改了
日志框架也是沿用了JDBC和数据库驱动的思维,与他们相对于,分为日志门面(JDBC)和日志实现(数据库驱动)。
我们在使用日志框架时,就从日志门面中选一个,再从日志实现中选一个,就可以进行开发了。
目前常见的日志门面和日志实现如下
SpringBoot的底层是Spring,Spring的日志门面选用的是JCL,而SpringBoot选用的是SLF4j+Logback
1.1 slf4j使用原理
1.1.1 如何在项目中使用SLF4j
- 以后开发的时候,日志记录方法的调用,不应该直接调用日志实现的方法,而是调用日志门面(抽象层)的方法
- 在项目中导入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以后,配置文件还是使用日志实现框架本身的配置文件。
1.2 遗留问题(其他日志框架统一转换为slf4j)
问题:我们在开发系统时,假如日志框架选用了SLF4j+Logback,但当前系统又依赖于其他框架,比如Spring、Hibernate、MyBatis、...,依赖的这些框架有的又会依赖自己的日志框架,比如Spring依赖JCL,Hibernate依赖Jboss-logging,这样就出现了日志框架不统一的问题,项目依赖于多个框架,而每个框架会有自己的日志门面和日志实现
我们的解决方法是:让系统中所有的日志框架都统一到SLF4j。
- 将系统中其他日志框架排除出去
- 用原有日志框架的中间包来替换原有的日志框架
- 使用我们选定的日志实现框架
1.3 SpringBoot日志关系
SpringBoot使用spring-boot-starter-logging来做日志功能。
SpringBoot在底层的日志依赖关系
总结:
- Spring Boot底层使用slf4j+logback的方式进行日志记录
- Spring Boot也把其他的日志框架都替换成了slf4j(导入了中间包,统一框架)
- 如果我们要引入其他框架,一定要把这个框架的默认日志框架依赖移除掉
比如,我们使用了Spring框架,就要这么做
<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的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉。
2. SLF4j+Logback日志使用
2.1 日志级别
TRACE
DEBUG
INFO
WARN
ERROR
注:上述级别自上而下由低到高,我们设定日志级别后,日志输出时只会输出设定级别及以上级别的日志信息。
2.2 默认配置
SpringBoot默认配置好了日志,默认的日志级别是INFO,通过logging.level指定了包的日志级别的就用指定的,没有指定的包就用SpringBoot默认规定的级别:root级别
2.3 常用配置
日志的默认配置是在主配置文件里的,所以我们要修改默认配置,也需要在主配置文件中修改
2.3.1 logging.level.XXX
设置某个包/类的日志级别,XXX写包/类结构,值为五个日志级别之一
2.3.2 logging.file
生成日志文件,不指定路径只给出日志文件名默认在当前项目根目录下生成
指定具体路径,在指定路径下生成日志文件
2.3.3 logging.path
在指定路径下生成日志文件,日志文件默认文件名为springboot.log
注:当同时指定logging.file和logging.path,生效的总是logging.file
2.3.4 logging.pattern.console和logging.pattern.file
logging.pattern.console 指定控制台输出的日志格式
logging.pattern.file 指定日志文件输出的日志格式
日志格式参考
示例如下
2.4 自定义日志配置文件
给类路径下放上每个日志框架自己的配置文件即可,这样,Spring Boot就不会使用自己的默认配置了
每个日志实现框架与配置文件的对应关系如下
logback.xml和logback-spring.xml的区别
logback.xml会绕过SpringBoot,直接被日志框架识别
logback-spring.xml由Spring Boot解析,可以使用SpringBoot提供的日志Profile功能(日志的多环境配置)
注:上述代码直接在相应的日志配置文件中使用即可,Spring Boot会对这部分内容进行解析。
示例
2.5 切换日志框架
spring-boot-starter-logging的底层是slf4j+Logback,假如我们需要切换为其他的日志框架组合,该怎么做呢,有两种方式可以实现。
- 根据slf4j的日志适配图
以slf4j+Logback转为slf4j+log4j(reload4j)为例进行说明
注:图中的reload4j就是log4j
首先将log4j-over-slf4j和logback-classic排除掉
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
然后增加log4j适配包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
<version>1.7.35</version>
</dependency>
如果需要自定义log4j的配置文件,再把log4j的配置文件放到类路径下就可以,否则就用Spring Boot默认的
- 场景启动器
以slf4j+Logback转为slf4j+log4j2为例进行说明
首先排除掉spring-boot-starter-logging
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
然后引入spring-boot-starter-log4j2即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
如果需要自定义log4j2的配置文件,再把log4j2的配置文件放到类路径下就可以,否则就用Spring Boot默认的
排除jar包时,可以使用IDEA的依赖视图快速排除,pom文件下右键点击Diagrams 》Show Dendendencies
选中要排除的jar包,右键点击Exclude即可,然后重新加载maven依赖