Spring Boot学习教程(二)
3. Spring Boot与日志
3.1 日志框架
市面上常用的的日志框架:
| 日志门面(日志的抽象层) | 日志实现 |
|---|---|
| JCL()、SLF4J()、jboss-logging | Log4J、JUL()、Log4J2、Logback |
当我们要使用完整的日志框架功能时,我们只需要选一个日志门面 + 一个日志实现的组合即可 如:SLF4J + Logback
一般的,Spring框架默认使用JCL门面;Spring Boot默认使用的是SLF4J + Logback
3.2 SLF4J的使用
3.2.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 + logback的组合,其他组合情况使用slf4j的时候,需要这样导包:
每个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件依旧是只为日志实现框架本身而编写
3.2.2 统一其他日志框架为slf4j
假设系统A(使用slf4j + logback)使用了Spring框架(使用的是commons-logging日志门面)和Hibernate框架(使用的是jboss-logging日志门面),于是系统A内部日志框架不统一,非常混乱。 所以,我们就需要进行日志记录的统一,也就是说,即使是使用了别的框架,也能统一使用slf4j进行输出
看图总结:
如何让系统中所有的日志都统一到slf4j呢?
- 先将系统中其他日志框架排除出去
- 用中间包来替换原有的日志框架
- 最后再导入slf4j其他的实现
3.3 Spring Boot日志关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- Spring Boot使用它来实现日志功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
Spring Boot日志底层依赖关系:
总结:
- Spring Boot底层也使用slf4j + logback的方式进行日志记录
- Spring Boot也把其他的日志都替换成了slf4j
- 中间替换包:
举jul-to-slf4j-1.7.30.jar为例,其中的SLF4JBridgeHandler类:
public static void install() {
LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
}
- 如果我们要引入其他框架,一定要把这个框架的默认日志依赖移除,否则会导致jar包冲突
3.4 Spring Boot日志使用
3.4.1 默认配置及其修改
Spring Boot默认帮我们配置好了日志
package com.taotao.springboot0;
import org.junit.jupiter.api.Test;
import org.junit.platform.commons.logging.Logger;
import org.junit.platform.commons.logging.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBoot03LoggingApplicationTests {
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
//日志的级别:由低到高:trace < debug < info < warn < error
//可以调整需要输出的日志级别
logger.trace(()->"这是trace日志");
logger.debug(()->"这是debug日志");
logger.info(()->"这是info日志");
logger.warn(()->"这是warn日志");
logger.error(()->"这是error日志");
}
}
测试结果:
由此可见,Spring Boot默认使用 info 级别的日志
不过我们可以手动调整输出的日志级别,调整以后高于该日志级别的才会生效:
| logging.file.name | logging.file.path | example | 说明 |
|---|---|---|---|
| (none) | (none) | 只在控制台输出 | |
| 指定文件名 | (none) | my.log | 输出日志到my.log文件 |
| (none) | 指定目录 | /var/log | 输出到指定目录的spring.log文件中 |
举几个例子:
# 在当前磁盘的根目录下创建spring文件夹和里面的log文件夹,使用spring.log作为默认文件名
logging.file.path=/spring/log
# 在当前项目下(或指定路径下)生成springboot.log日志文件
logging.file.name=springboot.log
运行结果:
通过修改配置文件来修改日志的格式:
# 在当前磁盘的根目录下创建spring文件夹和里面的log文件夹,使用spring.log作为默认文件名
logging.file.path=/spring/log
# 在当前项目下(或指定路径下)生成springboot.log日志文件
#logging.file.name=springboot.log
# 指定在控制台输出的日志的格式
# %d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50} - %msg%n
# 原来的格式:日期&时间 + 线程名 + 级别 + logger的全类名 + 日志消息 + 换行
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定在文件中输出的日志的格式
logging.pattern.file=%d{yyyy-MM-dd} ====== [%thread] ====== %-5level %logger{50} - %msg%n
运行结果:
3.4.2 用户指定配置
给类路径下放入每个日志框架自己的配置文件即可,Spring Boot便会不使用其默认配置
| 日志框架 | 对应的指定配置文件 |
|---|---|
| logback | logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy |
| log4j2 | log4j2-spring.xml, log4j2.xml |
| JDK(Java Util Logging) | logging.properties |
如果使用的是 logback.xml ,会直接被日志框架识别 而使用 logback-spring.xml 的话,日志框架就不会直接加载日志的配置项,而是由Spring Boot解析日志配置,因而可以使用Spring Boot的 springProfile 高级功能
<springProfile name="dev">
<!-- 可以指定某段配置只在某个环境下生效 -->
</springProfile>
3.5 切换日志框架
可以按照slf4j的日志适配图,进行相关的切换:
举个例子:从 slf4j + log4j 切换到 slf4j + log4j2:
slf4j + log4j :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
slf4j + log4j2:
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
Spring Boot入门介绍部分到此结束!接下来就开始实战的部分(Web开发)!敬请期待!