什么是 Logback 异步日志?
Logback 是 Java 社区广泛使用的日志框架之一,基于 SLF4J 接口实现。
在高并发或 I/O 密集型应用中,同步写日志可能成为性能瓶颈。
通过使用 AsyncAppender,可以将日志事件放入队列,由后台线程异步写入,
从而显著减少主线程的阻塞时间,提升系统吞吐量。
基本配置示例
以下是一个典型的 logback-spring.xml 配置,启用异步日志:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
</appender>
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志。默认 queueSize=256,当队列满时丢弃 TRACE/DEBUG/INFO 级别日志 -->
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<includeCallerData>false</includeCallerData>
<appender-ref ref="FILE" />
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_FILE" />
</root>
</configuration>
关键参数说明
- queueSize:内部阻塞队列大小,默认 256。建议根据负载调整(如 1024)。
- discardingThreshold:当日志队列剩余容量低于此值时,开始丢弃低优先级日志(默认为 queueSize 的 20%)。设为 0 可禁止丢弃。
- includeCallerData:是否包含调用位置信息(如类名、行号),开启会降低性能,建议设为 false。
- neverBlock:若设为 true,当日志队列满时直接丢弃日志而不阻塞生产者线程(慎用)。
注意事项
- 异步日志适用于高吞吐场景,但会增加内存占用。
- 应用关闭时需确保日志队列被正确 flush,避免丢失最后几条日志(Logback 默认会处理)。
- 不建议在异步 appender 中嵌套另一个异步 appender。