Springboot 学习 之 logback-spring.xml 日志打印

发布于:2025-04-19 ⋅ 阅读:(13) ⋅ 点赞:(0)

SpringBoot 项目中可以通过自定义 logback-spring.xml 中各项配置,实现日志的打印控制

1. property

定义全局变量,简化重复值

<property name="LOG_HOME" value="logs" />

2. springProperty

application.properties环境变量 中读取值,定义全局变量

<!-- 应用名称 -->
<springProperty name="APPLICATION_NAME" source="spring.application.name"/>

3. appender

Appender 负责将日志输出到指定位置

  • ConsoleAppender:控制台输出
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${LOG_PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>
  • RollingFileAppender:滚动文件输出
<!-- 滚动文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 归档策略:基于时间创建日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 日志文件名格式 -->
        <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <!-- 单个文件最大大小 -->
        <maxFileSize>50MB</maxFileSize>
        <!-- 日志最大的历史 -->
        <maxHistory>60</maxHistory>
        <!-- 启用异步压缩 -->
        <asyncCompression>true</asyncCompression>
        <!-- 设置最大临时文件大小 -->
        <maxTempFileSize>0MB</maxTempFileSize>
    </rollingPolicy>
    <encoder>
        <pattern>${LOG_PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <!-- 只允许 INFO 级别的日志通过 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!-- 过滤的级别 -->
        <level>INFO</level>
        <!-- 匹配时的操作:记录 -->
        <onMatch>ACCEPT</onMatch>
        <!-- 不匹配时的操作:不记录 -->
        <onMismatch>DENY</onMismatch>
    </filter>
    <!-- 错误处理器:当主 Appender 写入失败时,自动将日志事件转发到备用 Appender,自定义错误处理器:CustomErrorHandler extends ErrorHandlerBase
		1. 确保备用 Appender 不依赖可能失败的同类型资源
		2. 错误处理逻辑应轻量,避免在失败时加剧性能问题
		3. 备用 Appender 仅能捕获主 Appender 的错误,无法恢复已丢失的日志事件,需结合监控告警及时修复主 Appender。
	-->
   	<errorHandler class="com.example.CustomErrorHandler">
        <appender-ref ref="FAILOVER_APPENDER" />
    </errorHandler>
</appender>
  • AsyncAppender:异步文件输出
<!-- 异步打印日志:解决同步日志打印影响程序性能问题 -->
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 绑定目标 Appender(如文件、控制台) -->
    <appender-ref ref="FILE" />
    <!-- 队列容量(默认256)。队列满时,新日志事件将被阻塞或丢弃 -->
    <queueSize>512</queueSize>
    <!-- 队列剩余容量阈值,低于此值时丢弃低 TRACE/DEBUG/INFO 日志(默认队列剩余20%时丢弃),设为 0 表示永不丢弃 -->
    <discardingThreshold>0</discardingThreshold> 
    <!-- 是否包含调用者信息(如类名、方法名,默认false) -->
    <includeCallerData>true</includeCallerData> 
    <!-- 关闭 Appender 时的最大等待时间(毫秒,默认不限制)。超时后未处理的日志事件将被丢弃。-->
    <maxFlushTime>5000</maxFlushTime>
</appender>
  • KafkaAppender:Kafka 消息输出
<!-- Kafka Appender -->
<appender name="KAFKA" class="com.github.danielwegener.logback.kafka.KafkaAppender">
 	<!-- Kafka 生产者配置 -->
    <producerConfig>
        bootstrap.servers=${kafka.bootstrap.servers}
        acks=1                   <!-- 至少等待 Leader 确认 -->
        retries=3                <!-- 失败重试次数 -->
        max.block.ms=5000        <!-- 生产者阻塞超时时间 -->
    </producerConfig>
   	<!-- topic -->
    <topic>${kafka.topic}</topic>
    <encoder class="com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder">
        <layout class="ch.qos.logback.classic.layout.PatternLayout">
            <pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg</pattern>
        </layout>
    </encoder>
   	<!-- 异步发送策略 -->
    <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" />
   	<!-- 错误处理:发送失败时记录到本地文件 -->
    <appender-ref ref="ERROR_FILE" />
</appender>

4. logger

Logger 名称的层级规则,Logger 的名称通过‌点号(.)‌分割层级,例如:

  • com.example.myapp.TestApi 的父级 Logger 是 com.example.myapp
  • com.example.myapp 的父级 Logger 是 com.example
  • com.example 的父级 Logger 是 com
  • com 的父级 Logger 是 根 Logger(root)

Logback 的配置文件中,<logger> 元素用于 精细化控制 特定范围的日志输出

  • name:指定日志作用的范围 (包路径或 Logger 名称)
  • level:设置日志级别(TRACE/DEBUG/INFO/WARN/ERROR/OFF)
  • additivity:是否继承父 Logger 的 Appender (默认 true,设为 false 可避免重复输出)

4.1. 通过包路径控制日志

<!-- 
	1. 作用范围‌:org.springframework 包及其子包下的所有类
-->
<logger name="org.springframework" level="WARN" additivity="false">
    <appender-ref ref="SPRING_FILE"/>
</logger>

4.2. 通过类名控制日志

<!-- 
	1. 作用范围‌:com.example.myapp.TestApi 类
-->
<logger name="com.example.myapp.TestApi" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
</logger>

4.3. 按自定义 Logger 名称控制日志

<!-- 
	1. 作用范围‌:JOB_LOG 的日志(需结合 @Slf4j(topic = "JOB_LOG") 使用)
-->
<logger name="JOB_LOG" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
</logger>

5. root

Logger 配置,控制 全局日志级别

<root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="ASYNC_FILE"/>
</root>

6. springProfile

根据 Spring profile 不同,按环境激活配置

<springProfile name="dev">
    <!-- 仅当 Profile 包含 "dev" 时生效 -->
    <logger name="com.example" level="DEBUG" />
</springProfile>

网站公告

今日签到

点亮在社区的每一天
去签到