SpringBoot 项目中配置日志系统文件 logback-spring.xml 原理和用法介绍

在 Spring Boot 项目中,logback-spring.xml 是用于配置日志系统的文件,是基于 Logback 框架,主要有以下几点功能:

文章目录

1、日志输出控制

  • 可以指定哪些类或包的日志信息应该被输出,以及输出的日志级别。
  • 例如,可以将某些关键业务类的日志级别设置为 DEBUG,以便在开发和测试阶段进行详细的日志记录,方便调试。
  • 将一些基础类或库的日志级别设置为 INFOWARN,避免日志信息过多造成干扰。
xml 复制代码
<logger name="com.example.business" level="DEBUG"/>
<logger name="org.springframework" level="INFO"/>

这里,com.example.business 包下的日志将以 DEBUG 级别输出,而 org.springframework 包下的日志以 INFO 级别输出。

2、日志格式设置

  • 可以自定义日志的输出格式,包括时间戳、日志级别、线程名、类名、日志消息等元素的排列顺序和格式。
xml 复制代码
<encoder>
	<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>

上述代码使用 %d 表示时间戳,%thread 表示线程名,%-5level 表示日志级别,%logger{36} 表示日志记录器名称,%msg%n 表示日志消息和换行符。

3、日志输出位置

  • 可以将日志输出到不同的目的地,常见的有控制台和文件。
xml 复制代码
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
	<encoder>
		<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
	</encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
	<file>/log/info/info.log</file>
	<encoder>
		<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
	</encoder>
</appender>

上述代码中,CONSOLE 是一个将日志输出到控制台的 Appender,使用了前面定义的日志格式;FILE 是一个将日志输出到文件 /log/info/info.logAppender

4、日志滚动策略

  • 对于输出到文件的日志,可以设置日志滚动策略,以避免日志文件过大。
xml 复制代码
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<file>/log/info/info.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<fileNamePattern>/log/info/info-%d{yyyy-MM-dd}.log</fileNamePattern>
	</rollingPolicy>
	<encoder>
		<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
	</encoder>
</appender>

上述代码使用 TimeBasedRollingPolicy 实现了基于时间的日志滚动,每天会生成一个新的日志文件,文件名为 /log/info/info-%d{yyyy-MM-dd}.log

5、日志级别调整

  • 可以根据不同的环境(如开发、测试、生产)动态调整日志级别。
xml 复制代码
<springProfile name="dev">
	<logger name="com.wen" level="DEBUG"/>
</springProfile>

<springProfile name="prod">
	<logger name="com.wen" level="INFO"/>
</springProfile>

这里使用了 Spring Boot 的 springProfile 特性,在 dev 环境下将 com.wen 包的日志级别设置为 DEBUG,在 prod 环境下设置为 INFO

6、日志条件过滤

  • 可以对日志信息进行过滤,只输出符合特定条件的日志。
xml 复制代码
<appender name="FILTERED_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
	<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
		<level>INFO</level>
	</filter>
	<encoder>
		<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
	</encoder>
</appender>

上述代码使用 ThresholdFilter 过滤掉级别低于 INFO 的日志,只有 INFO 及以上级别的日志会被输出到控制台。

7、使用注意事项

1、日志文件所带来的优势:

  • 灵活性:可以根据项目的具体需求,灵活配置日志输出,满足不同阶段(开发、测试、生产)和不同场景下的日志需求。
  • 性能优化:通过合理设置日志级别和输出目的地,可以避免不必要的日志输出,提高性能。
  • 可维护性:集中管理日志配置,便于维护和修改,避免在代码中硬编码日志相关的逻辑。

2、配置文件的加载顺序:

Spring Boot 在启动时会自动查找并加载 logback-spring.xml 文件,如果找不到,会尝试加载 logback.xml 文件。建议使用 logback-spring.xml,因为它支持 Spring 的一些特殊配置,如 springProfile,可以根据不同的环境进行不同的日志配置。

  • 配置文件中的文件路径需要根据实际情况进行调整,确保日志文件的存储位置具有足够的权限。
  • 不同的 Appender 可以组合使用,如同时输出到控制台和文件。
  • 对于复杂的日志配置,可以考虑将不同部分拆分成多个 <appender><logger>,以便于维护和管理。

8、完整示例代码

下面代码是一个项目的完整示例代码,使用了上述的一些情况,可用作常见的 SpringBoot 项目。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
	<property name="log.level" value="debug" />
	<property name="log.maxHistory" value="30" />
	<property name="log.filePath" value="log/project/" />
	
	<property name="log.pattern"
		value="%d{yyyy-MM-dd HH:mm:ss:SSS} | [%thread] | [%X{request-id}] | %-5level | %class.%M %L | %msg%n" />

	<!-- 打印到控制台 -->
	<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
			<charset>UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
	</appender>

	<!-- INFO -->
	<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.filePath}/info/info.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>${log.filePath}/info/info-%d{yyyy-MM-dd}.log
			</fileNamePattern>
			<!-- 文件最大历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
			<!-- 下面这俩可不定义 -->
			<maxFileSize>1GB</maxFileSize>
			<totalSizeCap>128GB</totalSizeCap>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
			<charset>UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
	</appender>

	<!-- DEBUG -->
	<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.filePath}/debug/debug.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.filePath}/debug/%d{yyyy-MM-dd}.log
			</fileNamePattern>
			<maxHistory>${log.maxHistory}</maxHistory>
			<maxFileSize>1GB</maxFileSize>
			<totalSizeCap>128GB</totalSizeCap>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
			<charset>UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>DEBUG</level>
		</filter>
	</appender>
	
	<!-- ERROR -->
	<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/error/error.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>${log.filePath}/error/error-%d{yyyy-MM-dd}.log
			</fileNamePattern>
			<!-- 文件最大历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
			<maxFileSize>1GB</maxFileSize>
			<totalSizeCap>128GB</totalSizeCap>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
			<charset>UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>ERROR</level>
		</filter>
	</appender>

	<logger name="org.redisson" level="info" additivity="false" />

	<root level="INFO">
		<appender-ref ref="consoleAppender" />
		<appender-ref ref="debugAppender" />
		<appender-ref ref="infoAppender" />
		<appender-ref ref="errorAppender" />
	</root>
</configuration>
相关推荐
小信丶5 分钟前
Spring Boot 简单接口角色授权检查实现
java·spring boot·后端
星月昭铭1 小时前
Spring AI集成Elasticsearch向量检索时filter过滤失效问题排查与解决方案
人工智能·spring boot·spring·elasticsearch·ai
逐梦设计3 小时前
基于SpringBoot教师听评课管理系统的设计与实现(毕业设计源码+开题报告+论文+系统部署讲解+答辩指导)
spring boot
巴厘猫3 小时前
拥抱智能时代:Spring AI:在Spring生态中构建AI应用——深度剖析与实践
java·spring
loop lee3 小时前
【Spring】一文了解SpringMVC的核心功能及工作流程,以及核心组件及注解
java·后端·spring
Resean02233 小时前
SpringMVC 6+源码分析(一)初始化流程
java·后端·spring·servlet·springmvc
MacroZheng3 小时前
扔掉HttpUtil!看看人家的HTTP客户端工具,那叫一个优雅!
java·spring boot·后端
Chase_______3 小时前
redis快速入门及使用
java·数据库·redis·学习·spring·缓存
AA-代码批发V哥4 小时前
SpringBoot之多环境配置全解析
spring boot·maven
paopaokaka_luck4 小时前
个人健康管理小程序(消息订阅、Echarts图形化分析)
前端·vue.js·spring boot·电脑