java log4j、logback簡單排查


slf4j

  •   slf4j只是日志系統的API,只是接口,稱之為日志框架,類似於JDBCDriver,具體實現由各個廠家提供,而slf4j日志框架的實現目前有兩個,一個是LOG4J,一個是logback.
  •   在代碼里我們通常會使用 Logger logger = LoggerFactory.getLogger(this.getClass());  來獲取Logger,LoggerFactory是 slf4j-api里的一個單例工廠類,最底層調用StaticLoggerBinder.getSingleton().getLoggerFactory()來獲取實現類。而StaticLoggerBinder則在各自的廠商中提供。

  那么到底使用的是哪個StaticLoggerBinder呢

private final static void bind() {
try {
Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();

reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);

// the next line does the binding

StaticLoggerBinder.getSingleton();

INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;

reportActualBinding(staticLoggerBinderPathSet);

emitSubstituteLoggerWarning();

} catch (NoClassDefFoundError ncde) {
}

....

}

 

項目中引入log4j而不是使用默認的logback_代碼

什么是slf4j

SLF4J,即簡單日志門面(Simple Logging Facade for Java),不是具體的日志解決方案,它只服務於各種各樣的日志系統。按照官方的說法,SLF4J是一個用於日志系統的簡單Facade,允許最終用戶在部署其應用時使用其所希望的日志System。

為什么使用slf4j

         上面已經介紹了slf4j,那么至於為什么使用它。Slf4j可以看成是接口,那么既然是接口,實現在哪里呢?實現就是基於你自己的系統需要引入什么日志。我這里使用了log4j作為slf4j的實現。那么就可以通過slf4j來輸出日志。

slf4j的解耦

         試想一下,如果你使用了第三方的類庫,那么比如別人使用了java.util.logging.Logger這個類庫系統,那么你的項目使用的是log4j日志系統,你是不是要重新引入2種日志系統呢?那現在就有人為了解決這個問題,就提供了slf4j這個日志接口類庫。你只要使用slf4j就可以了,至於你系統使用什么類庫作為我的實現,我不管。那么這樣問題就解決了,這也符合java的面向對象編程。

 

代碼部分,由於sprintboot 默認使用logback,如果想用log4j, 需要排除掉logback的jar,引入log4j 的jar

 

 

 

<dependencies>
        <!--slf4j和log4j日志交換包-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
        <!--log4j包-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--排除logback包 -->
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

測試,生效的是log4j:

 

 

 

如果還原依賴:

復制代碼
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
復制代碼

測試結果,看到用的是logback:

反正是就要引入這些包, 但是slf4j-api已經在springboot-web里了。所以我的代碼中沒有再引入。

//slf4j包
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.8.0-beta2</version>
</dependency>
//slf4j和log4j日志交換包
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.8.0-beta2</version>
</dependency>
//log4j包
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version><dependency>

最后講一下用intellij看依賴:

在pom.xml 鼠標右鍵 

 

 

 

https://blog.csdn.net/weixin_39541044/article/details/114539884

https://www.cnblogs.com/dayanjing/p/13800105.html


免責聲明!

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



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