目录
SpringBoot中的日志使用
SpringBoot中的日志设计
▎测试Springboot底层日志实现
SpringBoot 日志配置文件
▎默认配置文件application.properties
▎指定配置文件
使用SpringBoot解析日志配置
☛ 举例说明:
SpringBoot 切换日志实现
▎切换为log4j2日志
▎配置log4j2配置文件
SpringBoot中的日志使用
SpringBoot框架在企业中的使用越来越普遍,SpringBoot日志也是开发中常用的日志系统
SpringBoot 默认就是使用SLF4J作为日志门面,logback作为日志实现来记录日志
SpringBoot中的日志设计
<dependency>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>
依赖关系图:
1. 新建SpringBoot工程项目
2. 添加一个web启动器
3. 打开pom.xml文件,选中boot-starter-web启动器,查看maven关系依赖图
4. boot-starter-web 启动器当中,会依赖中我们所使用环境的一些 jar包的信息,里面就包含了slf4j日志门面和logback的日志实现
➳
- SpringBoot底层默认使用logback作为日志实现
- 使用了SLF4J作为日志门面
- 将JUL也转换成slf4j
- 也可以使用log4j2作为日志门面,但是最终也是通过slf4j调用logback
在使用Springboot框架之后,其内部所有的日志实现都通过桥接器转换成slf4j日志门面进行统一的管理,最终交给logback日志实现框架进行日志输出
▎测试Springboot底层日志实现
用代码测试下,看是否如我们所说,不管使用什么日志实现,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 日志配置文件
Springboot 支持对日志进行具体的配置,可以直接在application.properties配置文件中简单定义,也可以导入具体日志实现的配置文件
▎默认配置文件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. 配置文件内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 配置集中管理属性
作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
<!-- 1.配置日志的输出格式,name:自定义名称 value:具体格式值 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m %n"/>
<!-- 2.配置控制台输出的appender, name:自定义appender名称 class:appender类型-->
<appender name="myConsole" class="ch.qos.logback.core.ConsoleAppender">
<!-- 2.1控制输出流对象,默认System.out控制台黑色字体,修改为System.err红色字体 -->
<target>System.err</target>
<!-- 2.2日志消息的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 3.自定义logger 对象,additivity:是否继承父元素RootLogger的属性配置-->
<logger name="com.ahead" level="info" additivity="false">
<appender-ref ref="myConsole" />
</logger>
</configuration>
2. 运行测试用例,查看日志输出结果
上传了具体日志实现的配置文件后,默认的SpringBoot配置信息就会作废
使用SpringBoot解析日志配置
在上述指定配置文件中,对于logback配置文件,logback-spring.xml 和 logback.xml 都能够被加载识别,增加了-spring
被SpringBoot框架解析的文件,只需修改SpringBoot的全局参数,就能对配置文件进行灵活调整,而不需要再修改logback提供的核心配置文件了
☛ 举例说明:
在开发环境输出的消息格式是详细信息(行号、类名),在生产环境下只需输出时间和日志具体内容即可,那么我们可以如下操作
1. logback-spring.xml 默认由SpringBoot框架解析日志配置
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 如果是开发环境,使用默认的消息格式 -->
<springProfile name="dev">
<pattern>${pattern}</pattern>
</springProfile>
<!-- 如果是生产环境,使用简单的消息格式输出消息 -->
<springProfile name="pro">
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level] %m%n</pattern>
</springProfile>
</encoder>
2. application.properties 配置文件
spring.profiles.active = dev
▎具体操作如下
调整logback配置文件为SpringBoot 框架所解析
1. 将logback.xml 文件修改为logback-spring.xml
2. 增加<springProfile> 标签设置
说明:如果是dev开发环境,输出的消息格式是${pattern},即<property>标签中定义的值,消息详细,如果是pro开发环境,则消息格式相对简单,只输出时间、日志级别、日志内容
3. 增加application.properties 配置文件的全局参数
4. 测试用例输出结果
➳ 结论:通过SpringBoot默认配置文件全局参数设置,可控制针对不同环境日志输出的具体格式
SpringBoot 切换日志实现
SpringBoot框架默认使用slf4j的统一API进行日志的管理,具体实现日志框架用的是logback
在目前企业开发中,log4j2的性能已经远超于logback了,通过SpringBoot也可以使用log4j2来进行日志的实现处理。
▎切换为log4j2日志
- 排除logback:将默认启动器的logging进行排除,其内部的logback就被移除了
- 新增 log4j2 依赖:添加log4j2 启动器。底层日志门面也是slf4j,但日志实现换成了log4j2,底层也是使用转换器和桥接器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 1.排除logback -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 2.增加log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
执行测试用例:我们上述配置了logback.xml文件失效了,说明底层使用的日志换成了log4j2
▎配置log4j2配置文件
上述指定配置文件也讲述过了,由于我们更换了log4j2,因此我们也可以设置log4j2-spring.xml、log4j2.xml 相应的配置文件
1. 在classpath目录下增加配置文件
2. 配置文件具体内容
<?xml version="1.0" encoding="UTF-8" ?>
<!-- status:日志框架本身的输出日志级别
monitorInterval:自动加载配置文件的间隔时间,不低于5秒(生产环境修改了配置文件也无需重启服务)
-->
<Configuration status="debug" monitorInterval="5">
<!-- 日志处理 -->
<Appenders>
<!-- 输出到控制台的appender 该appender的名称为console 输出流类型为:SYSTEM_ERR 红色字体输出在控制台 -->
<Console name="console" target="SYSTEM_ERR">
<!-- 消息输出格式的表达式 -->
<PatternLayout pattern="%d{HH:mm:ss} [%t] [%-5level] %c{36}:%L --------%m%n" />
</Console>
</Appenders>
<!--logger 定义 -->
<loggers>
<!-- 使用RootLogger配置日志级别 -->
<Root level="trace">
<!-- 指定日志使用的appender处理器 -->
<Appender-Ref ref="console" />
</Root>
</loggers>
</Configuration>
3.测试用例执行结果