Spring的日志管理


一、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>

如果沒有提供log4jlog4j2之類的日志實現,那么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官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM