SpringBoot日志应用【java全端课37】

53 阅读5分钟

SpringBoot日志应用

1 SpringBoot中日志简介

1.1 日志作用

  • 记录程序的运行过程,为调试和错误分析提供依据
  • 为数据分析提供原始材料

1.2 日志介绍

在 Spring Boot 中,日志框架的配置和使用是十分灵活且强大的。Spring Boot 默认集成了多种流行的日志框架,并提供了统一的日志抽象层(spring-jclspring-logback),使得开发者可以方便地选择和切换不同的日志实现。

  1. 日志抽象层

    Spring Boot 使用 SLF4J (Simple Logging Facade for Java) 作为其日志抽象层,这意味着你可以使用任何支持 SLF4J 的日志框架,如 Logback、Log4j2 或 Java Util Logging。默认情况下,Spring Boot 使用 Logback 作为日志框架

  2. 默认配置

    • 默认日志级别:Spring Boot 默认设置的日志级别为 INFO,这对于大多数生产环境来说是合适的。不过,你可以通过配置文件来改变这一设置。

    • 控制台输出:默认情况下,日志信息会打印到控制台上。这对于开发和调试非常有用。

    • 日志格式:Spring Boot 提供了默认的日志格式,包含了时间戳、日志级别、线程名称、类名以及日志消息等信息。

image-20241207105738136转存失败,建议直接上传图片文件

2 SpringBoot中Logback基本使用

2.1 日志级别

Logback(以及 SLF4J 和其他许多日志框架)支持以下标准日志级别,从低到高排序:

  1. TRACE:最详细的日志信息,通常只在调试问题时启用。这包括了系统运行的每一步细节。
  2. DEBUG:比 TRACE 级别少一些,主要用于开发阶段的调试,记录程序执行过程中的重要信息。
  3. INFO:一般用于确认应用程序按预期工作,比如服务启动、关闭或处理请求等重要事件。
  4. WARN:警告信息,表示可能存在潜在的问题,但还不至于影响系统的正常运行。
  5. ERROR:错误信息,表示发生了严重的错误,可能导致某些功能无法正常使用。

日志级别优先级

  • 日志级别具有严格的优先级顺序,即 TRACE < DEBUG < INFO < WARN < ERROR。这意味着如果将某个 logger 的日志级别设置为 INFO,那么只有 INFOWARNERROR 级别的日志会被输出;而 DEBUGTRACE 级别的日志则不会被记录。

设置日志级别

  • 你可以通过配置文件来设置全局或者特定包/类的日志级别。例如,在 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 中设置日志分组可以通过使用 loggerappender 的组合来实现。日志分组指的是将某些特定的日志信息定向到不同的输出目标(如文件、控制台等),这通常用于将不同模块或类别的日志分离,以便更方便地管理和查看。

每个 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);
    }
}

image-20241207112110670转存失败,建议直接上传图片文件

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>