文章目录
- 1. property
- 2. springProperty
- 3. appender
- 4. logger
- 4.1. 通过包路径控制日志
- 4.2. 通过类名控制日志
- 4.3. 按自定义 Logger 名称控制日志
- 5. root
- 6. springProfile
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 ErrorHandlerBase1. 确保备用 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>