springboot项目集成日志logback.xml

1.什么是 Logback?

Logback 是一个用于 Java 的日志框架,由同一个人开发,他之前开发了非常著名的 log4j 框架。Logback 通常被认为是 log4j 的后继者,提供了更好的性能和更丰富的功能。

2.为什么需要日志?

在软件开发中,日志是一种记录程序运行时信息的方式。它对于调试代码、监控应用运行状态、分析问题原因等都至关重要。日志可以帮助开发者理解应用程序的行为和可能的问题所在,尤其是在生产环境中。

3.spring boot项目中如何使用?

3.1添加依赖

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.1.8</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.8</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.22</version>
    </dependency>

3.2spring boot项目resources文件夹下,直接添加logback.xml即可。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <!-- 从 Spring Boot 配置文件中,读取 spring.application.name 应用名 -->
    <springProperty name="applicationName" scope="context" source="spring.application.name"/>
    <property name="LOG_HOME" value="/data/logs/${applicationName}"/>

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- info日志 appender  -->
    <!--这定义了一个名为 RollingInfoLogger 的 appender,其类型为 RollingFileAppender。
    RollingFileAppender 是用于将日志写入文件的,支持基于时间或文件大小的自动滚动。-->
    <appender name="RollingInfoLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--这里指定了日志文件的存储路径和文件名。${LOG_HOME} 是一个之前定义的变量,代表日志文件的基础路径。
        info.log 是此 appender 用于写入日志的主文件名。-->
        <file>${LOG_HOME}/user-service-manager.log</file>
        <!--这指定了日志文件的编码方式为 UTF-8。-->
        <encoder charset="UTF-8">
            <!-- 这定义了日志的输出格式,包括时间戳、线程名、日志级别、记录器名和消息内容。-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
        <!--这指定了一个基于时间的滚动策略。-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--这定义了滚动日志文件的命名模式。日志文件会根据时间和索引 (%i) 进行归档,并压缩成 .gz 格式。-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--这表示日志文件达到 512MB 时会触发滚动。-->
                <maxFileSize>512MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <fileNamePattern>${LOG_HOME}/archive/user-service-manager.%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
            <!--这设置了保留旧日志文件的最大历史记录数。最多保留 60 天的历史日志。-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!--这是一个级别过滤器,用于控制哪些日志级别被写入。-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
            <!--这行指定了过滤器的级别。在这个例子中,只有级别为 INFO 的日志消息会被考虑。-->
            <level>INFO</level>
            <!--这表示当日志消息与过滤器设置的级别匹配时(即为 INFO 级别),这条日志将被接受。-->
            <onMatch>ACCEPT</onMatch>
            <!--这表示当日志消息不符合过滤器设置的级别时(即不是 INFO 级别),这条日志将被拒绝。-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 出错日志 appender  -->
    <appender name="RollingErrorLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/error.log</file>
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>512MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <FileNamePattern>${LOG_HOME}/archive/error.%d{yyyy-MM-dd}-%i.log.gz</FileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- warn日志 appender  -->
    <appender name="RollingWarnLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/warn.log</file>
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>512MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <FileNamePattern>${LOG_HOME}/archive/warn.%d{yyyy-MM-dd}-%i.log.gz</FileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--这行配置了名为 com.front 的 logger 的日志级别为 INFO。
    这意味着所有在 com.front包(以及其子包)中生成的日志消息只有在 INFO 级别或以上时才会被记录。-->
    <logger name="com.front" level="INFO"/>
    <!--这行设置了 org.springframework 包中所有类的日志级别为 INFO。Spring Framework 可能会生成大量的 DEBUG 或 TRACE 级别的日志,
    这些日志对于日常开发和生产环境通常不是必需的,因此将其级别设置为 INFO 可以减少日志的数量。-->
    <logger name="org.springframework" level="INFO"/>
    <!--同样,这行为 org.apache 包中的所有类设置了 INFO 级别的日志。Apache 提供了许多不同的库,它们也可能产生大量的低级别日志。-->
    <logger name="org.apache" level="INFO"/>

    <appender name="AsyncRollingInfoLogger" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <appender-ref ref="RollingInfoLogger"/>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <includeCallerData>true</includeCallerData>
    </appender>

    <appender name="AsyncRollingWarnLogger" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <appender-ref ref="RollingWarnLogger"/>
        <includeCallerData>true</includeCallerData>
    </appender>

    <appender name="AsyncRollingErrorLogger" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <appender-ref ref="RollingErrorLogger"/>
        <includeCallerData>true</includeCallerData>
    </appender>

    <!-- root级别的日志过滤,只有级别是info级别的才会传递给RollingInfoLogger,RollingErrorLogger,RollingWarnLogger继续过滤 -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="AsyncRollingInfoLogger"/>
        <appender-ref ref="AsyncRollingWarnLogger"/>
        <appender-ref ref="AsyncRollingErrorLogger"/>
    </root>

</configuration>