2017-08-31 72 views
0

我的整個系統由slf4jlog4j實現記錄。
我有一個問題,當一個新的模塊使用logback-classic depression日誌記錄,因爲它打破它不能從pom.xml文件排除。Logback到log4j橋

首先,我試圖尋找解決方案在這第三方偏差,但找不到任何解決方案,所以我想也許他們之間的橋樑可以解決它的東西。

我主要是尋找是依賴的deafult控制檯記錄之間的分裂我的日誌我自己log4j.xml記錄儀和追加程序,所以我可以用separetly ..

有任何橋樑,所以我可以同時使用logback-classiclog4j在slf4j下的例子?

謝謝!

回答

0

你說:

我有一個問題,當一個新的模塊使用的logback經典depdency的記錄不能從pom.xml文件,因爲它打破它被排除在外。

這是假設還是您嘗試過?另外,如果您確實嘗試過,那麼您是否也刪除了logback-core依賴項?刪除這些依賴關係的唯一方法是會破壞模塊,因爲logback本身實現了slf4j API,所以模塊依賴於日誌實現。如果模塊確實依賴於實現而不是API /接口,我不認爲如果不移除這些依賴關係(更改模塊源代碼)或編寫模塊依賴的某些實現類的stubbed版本。

當我編寫遵循logback manual中的模式的代碼時,只要我沒有在logback實現類中引入依賴關係,就可以將實現從logback切換到log4j2,而不會有任何問題。

這裏是我寫的例子:

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class Main { 

    private Logger log = LoggerFactory.getLogger(Main.class); 

    public static void main(String[] args) { 

     Main main = new Main(); 
     main.main(); 
    } 

    public void main(){ 
     log.trace("trace msg"); 
     log.debug("debug msg"); 
     log.info("info msg"); 
     log.warn("warn msg"); 
     log.error("Error msg"); 

     log.info(log.getClass().getName()); 
    } 
} 

這裏是在POM的依賴關係:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.22</version> 
    </dependency> 

    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 

這裏是輸出:

00:48:26.378 [main] DEBUG blah.Main - debug msg 
00:48:26.380 [main] INFO blah.Main - info msg 
00:48:26.380 [main] WARN blah.Main - warn msg 
00:48:26.380 [main] ERROR blah.Main - Error msg 
00:48:26.380 [main] INFO blah.Main - ch.qos.logback.classic.Logger 

現在我改變了POM用log4j2替換logback jar:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.22</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.7</version> 
    </dependency> 

這裏的輸出進行此更改後:

2017-09-03 00:52:21,630 INFO b.Main [main] info msg 
2017-09-03 00:52:21,631 WARN b.Main [main] warn msg 
2017-09-03 00:52:21,631 ERROR b.Main [main] Error msg 
2017-09-03 00:52:21,632 INFO b.Main [main] org.apache.logging.slf4j.Log4jLogger 

因此,基於這一點,我想你應該,如果事情被實施了「正道」,能夠與log4j2和它交換的logback罐子應該「只是工作」。

您也說:

我主要找的是我的依賴關係的deafult控制檯記錄日誌之間的分裂,以我自己的log4j。XML記錄器和追加程序,所以我可以用separetly ..

現在是完全清楚我你問什麼,但我認爲你想有從模塊的日誌消息去安慰和你任何日誌與你的log4j2配置一起使用。如果這種情況與修改log4j2配置一樣簡單 - 請添加具有適當名稱的記錄器並分配相應的appender。例如,如果你的模塊的類是com.my.package.Class1,com.my.package.Class2,com.my.package.Class3等,那麼你可以創建一個com.my.package的記錄器並給它一個控制檯appender以及相應的文件appender。

希望這會有所幫助!