SLF4J
-
提供统一的日志门面API,即图中紫色部分,实现中立的日志记录API
-
桥接功能,蓝色部分,把各种日志框架API(绿色部分)桥接到SLF4J API。这样即便你的程序中使用各种日志API记录日志,最终都可桥接到SLF4J门面API。
-
适配功能,红色部分,可实现SLF4J API和实际日志框架(灰色部分)绑定。 SLF4J只是日志标准,还是需要实际日志框架。日志框架本身未实现SLF4J API,所以需前置转换。Logback就是按SLF4J API标准实现,所以才无需绑定模块做转换。
虽然可用log4j-over-slf4j
实现Log4j桥接到SLF4J,也可使用slf4j-log4j12
实现SLF4J适配到Log4j,也把它们画到了一列,但是它不能同时使用它们,否则就会产生死循环。jcl和jul同理。
虽然图中有4个灰色的日志实现框架,但日常业务使用最多的还是Logback和Log4j,都是同一人开发的。Logback可认为是Log4j改进版,更推荐使用,基本已是主流。
Spring Boot的日志框架也是Logback。那为什么我们没有手动引入Logback包,就可直接使用Logback?
spring-boot-starter模块依赖spring-boot-starter-logging模块 spring-boot-starter-logging模块自动引入logback-classic(包含SLF4J和Logback日志框架)和SLF4J的一些适配器。其中,log4j-to-slf4j用于实现Log4j2 API到SLF4J的桥接,jul-to-slf4j则是实现java.util.logging API到SLF4J的桥接。
logback异步日志配置
<appender name="DEFAULT-APPENDER-ASYNC" class="ch.qos.logback.classic.AsyncAppender"><includeCallerData>false</includeCallerData><queueSize>512</queueSize><neverBlock>true</neverBlock><appender-ref ref="DEFAULT-APPENDER" />
</appender>
-
includeCallerData 默认false:方法行号、方法名等信息不显示
-
queueSize 控制阻塞队列大小,使用的ArrayBlockingQueue阻塞队列,默认容量256:内存中最多保存256条日志
-
discardingThreshold 丢弃日志的阈值,为防止队列满后发生阻塞。默认
队列剩余容量 < 队列长度的20%
,就会丢弃TRACE、DEBUG和INFO级日志 -
neverBlock 控制队列满时,加入的数据是否直接丢弃,不会阻塞等待,默认是false
-
队列满时:offer不阻塞,而put会阻塞
-
neverBlock为true时,使用offer
-