文章目录
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>