目录
SpringBoot中的日志使用
SpringBoot中的日志设计
▎测试Springboot底层日志实现
SpringBoot 日志配置文件
▎默认配置文件application.properties
▎指定配置文件
使用SpringBoot解析日志配置
☛ 举例说明:
SpringBoot 切换日志实现
▎切换为log4j2日志
▎配置log4j2配置文件
SpringBoot框架在企业中的使用越来越普遍,SpringBoot日志也是开发中常用的日志系统
SpringBoot 默认就是使用SLF4J作为日志门面,logback作为日志实现来记录日志
spring-boot-starter-logging
org.springframework.boot
依赖关系图:
1. 新建SpringBoot工程项目
2. 添加一个web启动器
3. 打开pom.xml文件,选中boot-starter-web启动器,查看maven关系依赖图
4. boot-starter-web 启动器当中,会依赖中我们所使用环境的一些 jar包的信息,里面就包含了slf4j日志门面和logback的日志实现
➳ 总结
在使用Springboot框架之后,其内部所有的日志实现都通过桥接器转换成slf4j日志门面进行统一的管理,最终交给logback日志实现框架进行日志输出
用代码测试下,看是否如我们所说,不管使用什么日志实现,Springboot底层最终都是通过slf4j进行统一管理,并采用logbook作为日志实现框架进行输出
1. 在当前Springboot项目下的测试方法中编写测试代码
2. slf4j 测试代码
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogApplicationTests {
// 声明日志记录器对象(slf4j包)
public static final Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
@Test
void contextLoads() {
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
}
3. 运行结果
!! 注意:因为我们没有提供任何配置文件,因此默认的日志级别就是info
使用log4j2输出日志信息
4. 增加log4j2的日志打印
import org.apache.logging.log4j.LogManager;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogApplicationTests {
// 声明日志记录器对象(slf4j包)
public static final Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
@Test
void contextLoads() {
// 使用slf4j输出日志
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
// 使用log4j2输出日志, 底层会使用桥接器切换为slf4j门面和logback日志实现
org.apache.logging.log4j.Logger logger2 = LogManager.getLogger(SpringbootLogApplicationTests.class);
logger2.fatal("log4j2 fatal");
logger2.error("log4j2 error");
logger2.warn("log4j2 warn");
logger2.info("log4j2 info");
logger2.debug("log4j2 debug");
logger2.trace("log4j2 trace");
}
}
5. 输出结果
➳ 说明:使用log4j2获取logger进行日志打印,但控制台输出的日志格式与slf4j 打印一致,说明springboot底层调用了log4j的桥接器,将log4j2转换成了slf4j进行统一管理,最终由logback日志实现框架进行日志输出
其实从日志输出级别也可以看出,log4j2 输出fatal的日志信息时,前面显示的级别是error
Springboot 支持对日志进行具体的配置,可以直接在application.properties配置文件中简单定义,也可以导入具体日志实现的配置文件
Springboot默认提供的配置文件可以进行简单的配置
▸ 指定日志输出的级别、格式
# 自定义logger对象的日志级别("com.ahead" 是自定义logger对象的名称)
logging.level.com.ahead = trace
# 指定控制台输出消息格式
logging.pattern.console = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n
输出结果 :各日志级别的信息按照指定的格式被打印出来了
▸ 指定日志信息输出到文件
# 自定义logger对象的日志级别("com.ahead" 是自定义logger对象的名称)
logging.level.com.ahead = trace
# 指定控制台输出消息格式
logging.pattern.console = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n
# 指定存放日志文件的具体路径和生成的日志文件名称(指定的目录和文件可无需存在,会自动生成)
logging.file.name = /Users/wpf011/log/springboot.log
# 指定日志文件消息格式
logging.pattern.file = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n
➳ 说明:既指定了输出到控制台的console,也指定了输出到文件file,因此控制台也会输出日志内容,指定的文件目录也会产生日志文件
▸ 指定日志文件存放目录
# 指定存放日志文件的具体路径和生成的日志文件名称(指定的目录和文件可无需存在,会自动生成)
#logging.file.name = /Users/wpf011/log/springboot.log
# 指定日志文件存放的目录,默认生成spring.log文件(指定的目录和文件可无需存在,会自动生成)
logging.file.path = /Users/wpf011/log/springboot/
# 指定日志文件消息格式
logging.pattern.file = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n
# 注意:file.name和file.path不能同时使用,如果同时使用,默认使用file.name
# file.name 指定了日志文件的存放目录和生成的日志文件名称
# file.path 仅指定日志文件目录
SpringBoot提供的默认配置文件无法进行复杂的配置
比如所有日志都放到一个文件当中,不易于后期维护和管理,希望是按照一定的规则进行滚动拆分,比如文件大小,时间等。通过简单的SpringBoot提供的配置文件还不够,通常在企业开发中会导入具体某个日志实现相应的配置文件
☛ 给类路径下放上每个日志框架自己的配置文件,SpringBoot就不使用默认配置的了
日志框架 | 配置文件 |
---|---|
Logback | logback-spring.xml、logback.xml |
Log4j2 | log4j2-spring.xml、log4j2.xml |
JUL | logging.properties |
★ 举例:指定logback配置文件
在类路径下新建logback的配置文件:logback-spring.xml 或 logback.xml
1. 配置文件内容如下
System.err
${pattern}
2. 运行测试用例,查看日志输出结果
上传了具体日志实现的配置文件后,默认的SpringBoot配置信息就会作废
在上述指定配置文件中,对于logback配置文件,logback-spring.xml 和 logback.xml 都能够被加载识别,增加了-spring 的配置文件会被SpringBoot框架解析,而不是由logback解析
被SpringBoot框架解析的文件,只需修改SpringBoot的全局参数,就能对配置文件进行灵活调整,而不需要再修改logback提供的核心配置文件了
在开发环境输出的消息格式是详细信息(行号、类名),在生产环境下只需输出时间和日志具体内容即可,那么我们可以如下操作
1. logback-spring.xml 默认由SpringBoot框架解析日志配置
${pattern}
%d{yyyy-MM-dd HH:mm:ss} [%-5level] %m%n
2. application.properties 配置文件
spring.profiles.active = dev
▎具体操作如下
调整logback配置文件为SpringBoot 框架所解析
1. 将logback.xml 文件修改为logback-spring.xml
2. 增加
说明:如果是dev开发环境,输出的消息格式是${pattern},即
标签中定义的值,消息详细,如果是pro开发环境,则消息格式相对简单,只输出时间、日志级别、日志内容
3. 增加application.properties 配置文件的全局参数
4. 测试用例输出结果
➳ 结论:通过SpringBoot默认配置文件全局参数设置,可控制针对不同环境日志输出的具体格式
SpringBoot框架默认使用slf4j的统一API进行日志的管理,具体实现日志框架用的是logback
在目前企业开发中,log4j2的性能已经远超于logback了,通过SpringBoot也可以使用log4j2来进行日志的实现处理。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
执行测试用例:我们上述配置了logback.xml文件失效了,说明底层使用的日志换成了log4j2
上述指定配置文件也讲述过了,由于我们更换了log4j2,因此我们也可以设置log4j2-spring.xml、log4j2.xml 相应的配置文件
1. 在classpath目录下增加配置文件
2. 配置文件具体内容
3.测试用例执行结果