Spring Boot 日志管理
默认日志配置
Spring Boot 默认已经集成了日志功能,使用的是 logback 开源日志系统。
我们新建一个项目,运行启动类,可以清楚地看到控制台打印的日志信息。Spring Boot 日志默认级别是 INFO ,下图也输出了几条 INFO 级别的日志。
Spring Boot 项目启动时控制台输出的内容
Spring Boot 默认的日志输出内容含义如下:
- 日期时间:精确到毫秒。
- 日志级别:打印 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 等级别日志信息。
- 进程 ID:当前项目进程 ID 。
- 分隔符:
---
是分隔符,分隔符后面代表具体的日志内容。 - 线程名:方括号中间的内容表示线程名称。
- 类名:当前日志打印所属的类名称。
- 日志内容:开发人员设定的日志具体内容。
日志级别控制
通过配置文件来设置。
实例:
# 设置日志级别
logging.level.root=WARN
logging.level.root=WARN
中的 root 可以改为指定包名或类名,表示设置指定包或者类的日志级别。
输出日志文件
控制台日志保存的内容十分有限,大多数情况下我们需要将日志写入文件,便于追溯。
可以通过配置文件指定日志文件,如下配置会将日志打印到 C:\logs\spring-boot-log.log
文件中。
实例:
# 设置日志文件
logging.file=C:\logs\spring-boot-log.log
也可以指定日志文件输出的目录, Spring Boot 项目会在指定输出目录下新建 spring.log
文件,并在文件中写入日志。
实例:
# 设置日志目录
logging.path=C:\logs
Tips:如果同时配置了
logging.file
和ogging.path
,则只有logging.file
生效
使用 lombok 插件简化日志代码
普通情况下,如果要打印日志,需要添加一行代码 private Logger logger = LoggerFactory.getLogger(this.getClass());
还是比较麻烦的。我们可以安装 lombok 插件,使用一个注解代替这行代码。
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Slf4j // 添加日志输出注解
public class LogTest {
// 不再需要定义 logger
// private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void testPrintLog() {
// 直接使用log输出日志
log.trace("trace log");
log.debug("debug log");
log.info("info log");
log.warn("warn log");
log.error("error log");
}
}
自定义日志配置
Spring Boot 也支持自定义日志配置,可以直接采用指定日志系统的配置文件,如 logback 、 log4j 。以 logback 为例,可以直接在 application.properties 文件中指定 logback 配置文件。
实例:
# 指定logback配置文件,位于resources目录下
logging.config=classpath:logback-spring.xml
Tips:使用 logback 日志系统后,日志级别与日志文件等信息都可以使用 logback-spring.xml 文件设置,不再需要从 properties 文件中设置了。
在生产环境,我们希望指定日志保存的位置,另外日志不能无限制一直保存,一般情况下保存最近 30 天左右的日志即可。这些都可以在 logback-spring.xml 文件中指定,此处给出一个完整实例供大家参考。
实例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- logback 配置 -->
<configuration>
<!-- 输出到控制台 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期;%thread表示线程名;%-5level:左对齐并固定显示5个字符;%msg:日志消息;%n:换行符; -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
</encoder>
</appender>
<!-- 输出到文件 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在打印的日志文件 -->
<File>C:/logs/spring-boot-log.log</File>
<encoder>
<!--格式化输出:%d表示日期;%thread表示线程名;%-5level:左对齐并固定显示5个字符;%msg:日志消息;%n:换行符; -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n
</pattern>
</encoder>
<!-- 日志文件的滚动策略 -->
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>C:/logs/spring-boot-log-%d{yyyy-MM-dd}.log
</fileNamePattern>
<!-- 保留30天日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 指定日志输出的级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>