2011-05-16 73 views
19

是否可以對java.util.logging.Logger進行典型調用,並使用SLF4J將其路由到Logback?這將是很好的,因爲我不需要逐行重構舊的jul代碼。使用SLF4J發送/重定向/將java.util.logging.Logger(JUL)路由到Logback?

EG,說我們有這樣一行:

private static Logger logger = Logger.getLogger(MahClass.class.getName()); 
//... 
logger.info("blah blah blah"); 

這將是不錯的配置此通過SLF4J打電話。

+0

有一個大好處通過咬子彈和重構到slf4j。也就是說,您可以在字符串中使用{}來延遲toString()調用。 – 2011-06-01 09:06:14

+0

toString()真的是現代JVM的一個問題嗎?我意識到避免toString()調用會更有效率,但我的理解是對象創建很便宜,並且這會屬於不成熟的優化。 – 2012-05-30 11:16:26

+0

是的,如果您正在製作豐富的日誌記錄語句,那麼這真的是一個問題。在現代jvm中對2015年的生產系統進行剖析不必要的調用爲生產中未實際啓用的調試語句創建字符串是生產系統的一個cpu熱點。 – simbo1905 2015-11-28 11:52:55

回答

13

是的,這是可能的。這很簡單,你不需要改變任何源代碼。您只需更改一些.jar庫。

看看這個文章

+6

今天我學到了一些東西。儘管如此,那些短語卻十分詭詐。「因此,j.u.l.到SLF4J翻譯會嚴重影響禁用日誌語句的成本(增加60倍),並對啓用的日誌語句產生可衡量的影響(整體增長20%)。「和」請注意,對於您控制的源代碼,您應該使用slf4j-migrator。本頁中描述的基於二進制的解決方案適用於超出您控制範圍的軟件。「 – 2011-05-16 17:27:44

+0

@Anthony Accioly,很棒的一點。請務必使用移動器。 – Zombies 2011-05-16 17:28:54

+0

請參閱@ Dejan的迴應:使用LevelChangePropagator將避免停用的成本日誌 – karmakaze 2014-01-23 18:36:03

1

據我所知這是不可能的。另一種解決方案是使用Migrator Tool。它可以處理遷移中最繁瑣的部分(替換進口,替換Logger.getLoggerLoggerFactory.getLogger等)。

更新:正如@ user179437指出的那樣,確實有可能。除非您無法訪問源代碼,否則只是不推薦。

30

這是很容易的,而不是一個性能問題了。

SLF4J manual中記錄了兩種方法。如果你有logging.properties

SLF4JBridgeHandler.removeHandlersForRootLogger(); 
SLF4JBridgeHandler.install(); 

:也有在Javadocs

精確的例子。如果你沒有logging.properties(爲的java.util.logging),將它添加到您的引導代碼(並且要保持它的),將它添加到它:

handlers = org.slf4j.bridge.SLF4JBridgeHandler 

在任何情況下,加上07月到slf4j.jar到類路徑中。或通過Maven的依賴:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jul-to-slf4j</artifactId> 
    <version>1.7.0</version> 
</dependency> 

爲了避免性能下降,添加此contextListener到logback.xml(作爲的logback版本0.9.25):

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> 
     <!-- reset all previous level configurations of all j.u.l. loggers --> 
     <resetJUL>true</resetJUL> 
    </contextListener> 

    ... 

</configuration> 
+0

只需要注意 - 我必須重新加載Logback配置才能使其工作。 – 2014-03-27 16:23:43

+0

無論如何,爲了將logback配置傳播到jul記錄器,添加contextListener配置是非常必要的,因此無論性能如何提高,我們都需要這樣做。 – Brice 2016-10-13 15:55:48

+0

它可能以某種方式與該錯誤相關:http://jira.qos.ch/browse/LOGBACK-404即沒有傳播者記錄器不被保留,然後他們的級別重置。 – Brice 2016-10-13 16:06:28