對於 Spring 日誌是很是重要的依賴,由於:a)它是惟一的外部強制性的依賴;b)每一個人都喜歡從他們使用的工具看到一些輸出;c)Spring 結合不少其餘工具都選擇了日誌依賴。應用開發者的一個目標是在一個應用程序的中心位置有統一的日誌配置,包括全部的外部元件。而有太多能夠選擇的日誌框架又增長了它的難度。java
Spring 強制性的日誌依賴 是 Jakarta Commons Logging API(JCL)。咱們編譯 JCL,也使 JCL Log對象對 Spring Framework 的擴展類可見。全部版本的 Spring 使用一樣的日誌庫,這對於用戶來講是很重要的:遷移就會變得容易,由於即便擴展Spring的應用程序仍然保留向後兼容性。咱們達到之一目標的方式是使Spring中的一個模塊明確地依賴於commons-logging(JCL的規範實現),而後在編譯時使全部其餘模塊依賴於它。使用 Maven 爲例,Spring的中心模塊 spring-core 依賴了 commons-logging 。算法
commons-logging 的好處是你不須要任何東西就能讓你的應用程序程序運行起來。它有一個運行時發現算法,該算法在classpath路徑下尋找其餘的日誌框架而且使用它認爲適合的(或者你能夠告訴它你須要的是哪個)。若是沒有其餘的日誌框架存在,你能夠從JDK(Java.util.logging 或者JUL 的簡稱)得到日誌。在大多數狀況下,你能夠在控制檯看到你的Spring 應用程序運行起來和並查看它的日誌,這是很重要的。spring
Log4j 1.2 已經中止維護,Log4j 2.3是最後一個 Java 6 兼容發行版,Log4j 2.x 最新的發行版須要Java 7 以上。apache
許多開發者出於配置和管理的目的使用Log4j做爲日誌框架。它是高效且成熟的,實踐上在構建Spring時,在運行時也是使用的Log4j。Spring也提供了一些配置和初始化Log4j的工具,所以在一些模塊中Log4j是可選的編譯時依賴。api
爲了讓 Log4j 1.2 與默認的JCL依賴一塊兒工做,只須要將Log4j放入classpath,並提供一個配置文件(classpath根目錄下的log4j.properties或log4j.xml)。Maven 依賴聲明以下:app
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.9.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
如下是將日誌寫入控制檯的log4j.properties的例子:框架
log4j.rootCategory=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n log4j.category.org.springframework.beans.factory=DEBUG
爲了讓 Log4j 2 與默認的JCL依賴一塊兒工做,只須要將Log4j放入classpath,並提供一個配置文件(classpath根目錄下的log4j2.properties、log4j2.xml 或其它支持的文件格式)。Maven 依賴聲明以下:工具
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.6.2</version> </dependency> </dependencies>
若是想使用SLF4J做爲Log4j的代理,例如其它庫默認使用SLF4J,須要神明如下依賴:spa
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.6.2</version> </dependency> </dependencies>
下面是一個日誌寫到控制檯的log4j2.xml的例子:代理
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Logger name="org.springframework.beans.factory" level="DEBUG"/> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
不幸的是,commons-logging 的運行時日誌框架發現算法方便了最終用戶,但倒是有問題的。若是你不想使用JCL的標準查找,有兩種方法來關閉它:
排除 commons-logging,添加如下的內容到 dependencyManagement 部分:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
如今,這個應用程序可能運行不了,由於在類路徑上沒有實現的 JCL API,所以要修復它就必須提供一個新的日誌框架。
Simple Logging Facade for Java (SLF4J) 是Spring其餘庫使用的流行API。它常常與LogBack( SLF4J API 的一個本地實現)一塊兒使用。
SLF4J 能夠與許多日誌框架綁定,包括Log4j,它也作了反向工做:是其餘日誌框架和它本身之間的橋樑。所以在 Spring 中使用 SLF4J 時,你須要使用 SLF4J-JCL 橋接替換掉 commons-logging 的依賴。一旦你這麼作了,Spring 調用日誌就會調用 SLF4J API,所以若是在你的應用程序中的其餘庫使用這個API,那麼你就須要有個地方配置和管理日誌。
一個常見的選擇就是橋接 Spring 和 SLF4J,提供顯示的綁定 SLF4J 到Log4J 上。你須要支持一些依賴(排除現有的 commons-logging):JCL bridge,SLF4J 綁定 Log4J 和 Log4J 實現自身。在 Maven 中你能夠這樣作:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies>
對於SLF4J用戶來講,一個更常見的選擇是,使用更少的步驟和產生更少的依賴,那就是直接綁定 Logback。這消除了多餘的綁定步驟,由於 Logback 直接實現了 SLF4J,所以你只須要依賴兩個庫jcl-over-slf4j and logback
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> </dependencies>
Commons Logging 當在classpath中未發現log4j時,會默認代理 JUL。因此不須要創建特殊的依賴。