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>