一、spring的日志依賴
Logging是spring中唯一強制的外部依賴,spring中默認使用的日志是commons-logging
,簡稱JCL
,這里說的強制性,是因為在spring-core
這個模塊中引入了該依賴。不過,引入了該依賴,也無需做任何其他的配置,它是日志門面
,它內部會有自己的算法去找日志門面的實現類,比如log4j
,如果說沒有引入其他日志依賴,它默認就會去找JDK自帶的java.util.logging
簡稱jul
作為其日志實現類,所以說用起來還是賞心悅目的!
二、使用log4j1.x和2.x和jul
log4j1.x版本已經停止更新了,log4j2.x習慣性叫做
log4j2
。
log4j
出現很久了,一直有很多人在使用,但是畢竟停止更新了,已經不再推薦使用了。
如何使用log4j
作用spring
自帶的commons-logging
的日志實現呢?
用起來也是相當簡單啊,我們以Maven為例,首先添加Log4j的jar包,另外需要一份日志配置文件 (log4j.properties
or log4j.xml
),放在類路徑的根目錄下。
下面是maven:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
下面一個簡單的log4j
的配置文件
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
同樣的如果說使用log4j2
作為JCL
的日志實現,和log4j
用法是一樣的。
下面這是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>
If you also wish to enable SLF4J to delegate to Log4j, e.g. for other libraries which use SLF4J by default, the following dependency is also needed:
<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>
如果沒有提供log4j
、log4j2
之類的日志實現,那么commons-logging
就會默認使用jdk
自帶的java.util.logging
。
二、不使用自帶的Commons Logging
如果覺得spring自帶的JCL
不合適,可以自己進行替換,有以下兩種方法:
- 直接從
spring-core
排除掉commons-logging
的依賴,因為spring-core
是唯一明確依賴JCL
的模塊 - 依賴於一個特殊
commons-logging
,它是一個空jar包,參考slf4j
// 從spring-core中排除掉
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
使用SLF4J代替jCL
需要下面幾個依賴,一個是排除掉JCL
,第二個是要架起JCL
與slf4j直接的橋梁,畢竟如spring-core
中使用了,其實這里slf4j
巧妙的將諸如spring-core
中用到的commons-logging
的類或接口,在jcl-over-slf4j
中寫了一份同名的,但在具體的方法或接口等實現類中,再去具體找其他日志實現框架,它起到了一個日志門面的作用。
第三個是slf4j對接log4j的jar包,因為Log4j早就停更了,所以啊,這又是適配Log4j與slf4j之間的Jar包,最后一個就是log4j
自身的jar包了。
下面是依賴:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.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.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
如果選用logback
作用slf4j
,那就簡單多了,因為logback
出現的比較晚,它實現了slf4j
,那就不需要中間包了,下面是Maven依賴。
<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>
以上是閱讀spring官方文檔時個人的一點點理解,記之於筆墨。
附官方文檔鏈接:spring官方文檔