2009-11-20 35 views
0

我在寫一個庫。該庫可以被使用log4j記錄器和java.util.logging記錄器的應用程序使用。圍繞log4j記錄器和java.util.logging的java包裝

所以,我寫了一個快速封裝類,封裝了兩個記錄器。我允許應用程序設置一個或兩個記錄器。在我的庫中,我使用封裝的類打印到記錄器。

我的問題是,因爲許多線程可以同時使用包裝類的相同實例來使用類的方法(例如:下面的fatal())記錄消息,所以應該採取什麼步驟來使這些方法成爲線程安全?

public class MultiLogger { 
    private static org.apache.log4j.Logger _log4jLogger = null; 
    private static java.util.logging.Logger _javaUtilLogger = null; 

    private MultiLogger() { 
    } 

    // log4j FATAL, log util SEVERE 
    public void fatal (Object message) { 
     if (_log4jLogger != null) { 
      _log4jLogger.log("", Level.FATAL, message, null); 
     } 

     if (_javaUtilLogger != null) { 
      _javaUtilLogger.severe((String) message); 
     } 
    } 
    ... 
} 

其他意見也讚賞。

+4

在繼續使用此庫之前,您應該檢出slf4j。它包裝了所有主要的日誌庫,並且質量非常高。 – ghempton 2009-11-20 01:10:26

+0

看起來非常好,但我不能在我的庫中使用任何外部庫 – rouble 2009-11-20 01:12:13

+5

嗯,外部是如何外部的?那麼log4j不是外部庫嗎?這種對「外部」庫的反感來自哪裏? – BalusC 2009-11-20 01:13:50

回答

1

看到我的評論,但我認爲你的包裝類將以與它包裝的記錄器相同的方式使用。在這種情況下,被包裝的類應該爲你處理同步。

3

選項1:slf4j,根據問題的評論。

選項2:cxf.apache.org中有這樣一個設備。我們使用它來代替slf4j,因爲slf4j缺乏國際化支持。歡迎您獲取代碼。

0

假設您只是使用log4j和util Logger,如上所示,我認爲您不會遇到任何同步問題。