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>
相关推荐
NE_STOP2 小时前
SpringBoot--简单入门
java·spring
seventeennnnn2 小时前
谢飞机的Java高级开发面试:从Spring Boot到分布式架构的蜕变之旅
spring boot·微服务架构·java面试·分布式系统·电商支付
超级小忍3 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
张小洛4 小时前
Spring AOP 设计解密:代理对象生成、拦截器链调度与注解适配全流程源码解析
java·后端·spring·spring aop·aop
时间会给答案scidag4 小时前
报错 400 和405解决方案
vue.js·spring boot
Wyc724094 小时前
SpringBoot
java·spring boot·spring
ladymorgana6 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
neoooo6 小时前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
GJCTYU7 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
linweidong8 小时前
七牛云Java开发面试题及参考答案(60道面试题汇总)
spring·读写分离·aop·cap·java开发·spring ioc·java面经