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>