天天看點

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>
           

如果沒有提供

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官方文檔