SpringBoot日志应用
1 SpringBoot中日志简介
1.1 日志作用
- 记录程序的运行过程,为调试和错误分析提供依据
- 为数据分析提供原始材料
1.2 日志介绍
在 Spring Boot 中,日志框架的配置和使用是十分灵活且强大的。Spring Boot 默认集成了多种流行的日志框架,并提供了统一的日志抽象层(
spring-jcl或spring-logback),使得开发者可以方便地选择和切换不同的日志实现。
日志抽象层
Spring Boot 使用 SLF4J (Simple Logging Facade for Java) 作为其日志抽象层,这意味着你可以使用任何支持 SLF4J 的日志框架,如 Logback、Log4j2 或 Java Util Logging。默认情况下,Spring Boot 使用 Logback 作为日志框架。
默认配置
默认日志级别:Spring Boot 默认设置的日志级别为
INFO,这对于大多数生产环境来说是合适的。不过,你可以通过配置文件来改变这一设置。控制台输出:默认情况下,日志信息会打印到控制台上。这对于开发和调试非常有用。
日志格式:Spring Boot 提供了默认的日志格式,包含了时间戳、日志级别、线程名称、类名以及日志消息等信息。

2 SpringBoot中Logback基本使用
2.1 日志级别
Logback(以及 SLF4J 和其他许多日志框架)支持以下标准日志级别,从低到高排序:
- TRACE:最详细的日志信息,通常只在调试问题时启用。这包括了系统运行的每一步细节。
- DEBUG:比 TRACE 级别少一些,主要用于开发阶段的调试,记录程序执行过程中的重要信息。
- INFO:一般用于确认应用程序按预期工作,比如服务启动、关闭或处理请求等重要事件。
- WARN:警告信息,表示可能存在潜在的问题,但还不至于影响系统的正常运行。
- ERROR:错误信息,表示发生了严重的错误,可能导致某些功能无法正常使用。
日志级别优先级
- 日志级别具有严格的优先级顺序,即
TRACE < DEBUG < INFO < WARN < ERROR。这意味着如果将某个 logger 的日志级别设置为INFO,那么只有INFO、WARN和ERROR级别的日志会被输出;而DEBUG和TRACE级别的日志则不会被记录。设置日志级别
你可以通过配置文件来设置全局或者特定包/类的日志级别。例如,在
logback-spring.xml或者application.properties文件中进行如下配置:
logback-spring.xml 示例
<configuration> <!-- 全局日志级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> <!-- 特定包的日志级别 --> <logger name="com.example.myapp" level="DEBUG" additivity="false"> <appender-ref ref="FILE" /> </logger> </configuration>application.properties 示例
# 设置全局日志级别为 WARN logging.level.root=WARN # 设置特定包的日志级别为 DEBUG logging.level.org.springframework.web=DEBUG logging.level.com.example.myapp=DEBUG
2.2 使用LoggerFactory构建日志记录器
@SpringBootTest(classes = Day21SsmApplication.class)
public class TestSlf4j {
//内置的日志记录器:log
Logger log = LoggerFactory.getLogger(TestSlf4j.class);
@Test
public void testSlf4j(){
// 创建日志记录器
log.info("日志记录器创建成功");
// 记录日志
log.trace("追踪信息trace");
log.debug("调试信息debug");
log.info("普通信息info");
log.warn("警告信息warn");
log.error("错误信息error");
}
}
2.3 使用@Slf4j注解
@Slf4j
@SpringBootTest(classes = Day21SsmApplication.class)
public class TestSlf4j {
@Test
public void testSlf4j(){
// 创建日志记录器
log.info("日志记录器创建成功");
// 记录日志
log.trace("追踪信息trace");
log.debug("调试信息debug");
log.info("普通信息info");
log.warn("警告信息warn");
log.error("错误信息error");
}
}
3 设置日志分组
3.1 日志分组基本概念
在 Logback 中设置日志分组可以通过使用
logger和appender的组合来实现。日志分组指的是将某些特定的日志信息定向到不同的输出目标(如文件、控制台等),这通常用于将不同模块或类别的日志分离,以便更方便地管理和查看。每个
logger可以关联一个或多个appender,而appender负责实际的日志输出。通过为不同的logger指定不同的appender,你可以有效地实现日志分组。
3.2 实现日志分组
-
logback.xml方式
<configuration> <!-- 定义 appender --> <appender name="FILE-A" class="ch.qos.logback.core.FileAppender"> <file>logs/app-a.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE-B" class="ch.qos.logback.core.FileAppender"> <file>logs/app-b.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 设置 logger --> <logger name="com.example.app.moduleA" level="DEBUG"> <appender-ref ref="FILE-A" /> </logger> <logger name="com.example.app.moduleB" level="INFO"> <appender-ref ref="FILE-B" /> </logger> <!-- 根 logger --> <root level="WARN"> <appender-ref ref="STDOUT" /> </root> </configuration> -
application.properties方式
#设置日志分组 logging.group.model=com.mytest.service,com.mytest.mapper logging.group.controller=com.mytest.controller #设置分组后日志级别 logging.level.model=debug logging.level.controller=info
4 设置日志以文件形式存储
将日志以文件形式存储是 Logback 中非常常见的需求。通过正确配置
FileAppender或其子类(如RollingFileAppender),你可以确保应用程序的日志信息被记录到指定的文件中,同时还可以根据需要设置日志滚动策略、归档旧日志等高级功能。
4.1 logback.xml
<configuration>
<!-- 定义 FileAppender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/application.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 设置 root logger -->
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
4.2 application.properties
设置以文件形式存储:logging.file.name或logging.file.path
- 注意:设置文件名称或设置文件路径,应该二选一即可
#设置日志文件(默认文件名:spring.log)
logging.file.path=e:/mytest/logs222/
logging.file.name=./ssm222.log
5 日志的归档与切割
| 配置项 | 描述 |
|---|---|
| logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式 默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
| logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档; 默认值:false |
| logging.logback.rollingpolicy.max-file-size | 每个日志文件的最大大小; 默认值:10MB |
| logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大大小 默认值:0B。 设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件 |
| logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数; 默认值:7 |
5.1 设置归档切割方式
#设置日志文件(默认文件名:spring.log)
logging.file.path=e:/mytest/logs222/
#logging.file.name=./ssm222.log
#设置单个日志文件大小
logging.logback.rollingpolicy.max-file-size=1MB
5.2 测试及效果
@Test
public void testSlf4j22() throws InterruptedException {
int i = 0;
while(true){
log.info("循环添加日志信息...i"+(++i));
Thread.sleep(1);
}
}

6 切换log4j2日志框架
6.1 调整依赖坐标
排除spring-boot-starter中的spring-boot-starter-logging
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--排除默认的日志依赖-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--手动导入日志依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
6.2 添加log4j2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>