javascript
Spring全家桶中的日志框架
Spring全家桶中的日志框架
spring-jcl
spring-jcl是spring的日志框架,spring-jcl底層使用的日志框架是有優先級的優先級為:LOG4J2 級是最高的,其次是SLF4J (>=1.3)、SLF4J(<1.3)、JUL 。
根據spring-jcl中的LogAdapter可以得知,選擇哪個日志框架是根據優先級來選定底層的日志框架的。
當項目里面沒有其他日志框架時,默認使用Java提供的JUL(java.util.logging包)。
private static final String LOG4J_SPI = "org.apache.logging.log4j.spi.ExtendedLogger";private static final String LOG4J_SLF4J_PROVIDER = "org.apache.logging.slf4j.SLF4JProvider";private static final String SLF4J_SPI = "org.slf4j.spi.LocationAwareLogger";private static final String SLF4J_API = "org.slf4j.Logger";private static final LogApi logApi;static {if (isPresent(LOG4J_SPI)) {if (isPresent(LOG4J_SLF4J_PROVIDER) && isPresent(SLF4J_SPI)) {// log4j-to-slf4j bridge -> we'll rather go with the SLF4J SPI;// however, we still prefer Log4j over the plain SLF4J API since// the latter does not have location awareness support.logApi = LogApi.SLF4J_LAL;}else {// Use Log4j 2.x directly, including location awareness supportlogApi = LogApi.LOG4J;}}else if (isPresent(SLF4J_SPI)) {// Full SLF4J SPI including location awareness supportlogApi = LogApi.SLF4J_LAL;}else if (isPresent(SLF4J_API)) {// Minimal SLF4J API without location awareness supportlogApi = LogApi.SLF4J;}else {// java.util.logging as defaultlogApi = LogApi.JUL;} }spring-boot-starter-logging
spring-boot-starter-logging是spring boot的一個默認日志啟動器,許多spring-boot啟動器中都使用spring-boot-starter-logging作為日志實現,讓你可以快速在spring-boot中引入的日志功能,而不用選擇Java默認提供的JUL。
許多的springboot啟動器都使用了spring-boot-starter-logging,如:spring-boot-starter,spring-boot-starter-web
spring-boot-starter-logging底層使用logback做為底層日志框架,spring-boot-starter-logging本身并沒有實現日志功能,只不過是導入了一系列的日志API和logback日志框架
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><version>2.2.5.RELEASE</version> </dependency>spring-boot-starter-log4j2
如果你想在springboot中使用log4j2,可以使用spring-boot-starter-log4j2去導入log4j2。
如果你想替換掉spring-boot-starter的默認日志框架,可以通過導入spring-boot-starter-log4j2,移除spring-boot-starter-logging來實現底層框架的更換。
更換spring-boot-starter底層日志框架時,記得移除spring-boot-starter-logging,否則Lombok會拋出Class path contains multiple SLF4J bindings警告。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.2.5.RELEASE</version><!--移除spring-boot-starter-logging--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions> </dependency><!--導入spring-boot-starter-log4j2--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>2.5.4</version> </dependency>springboot項目中使用Lombok的slf4j
如果你在springboot項目中使用Lombok的@Slf4j注解來生成log類,那么默認使用的是spring-boot-starter-logging里面的logback。(以為spring-boot-starter默認引入logback)
當項目存在多個slf4j日志接口的實現框架,會拋出Class path contains multiple SLF4J bindings警告。此時應該要主要是否引入復數的slf4j日志接口的實現框架。
總結
以上是生活随笔為你收集整理的Spring全家桶中的日志框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 170Hz+FastIPS:优派 27
- 下一篇: 解决Could not load dyn