2012-08-15 63 views
0

我不想用這樣的:記錄器/服務中使用的Log4j(集中式日誌記錄)

Logger.getLogger(MyClass.class).info("Info message"); 
每次我想記錄的東西

我試圖實現具有類似方法測井服務:

public void info(final Object aMessage, final Object aSender); 

這讓我基於發件人的類獲得Logger實例,但它隱藏日誌源類的方法和路線。

我知道AOP或Slf4j等替代品。第一種是不完全是我想要的,第二個引入了類似的第一行代碼的東西:

LoggerFactory.getLogger(HelloWorld.class).info("Info message"); 

所以,我的擔心是不是隱藏Log4j的依賴,這是關於統一日誌記錄調用在整個應用程序,像這樣:

//loggingController instance was injected previously 
loggingControler.info("Info message",this); 

有什麼辦法可以實現這個嗎?

回答

0

好,似乎有解決這個問題至少有一種方式:

例如有LoggingService和LoggingController。第一個是直接使用Log4j,第二個只是服務和整個應用程序之間的一個層。

public class LoggingService implements ILoggingService{ 

    //other methods here. 

    @Override 
    public void warn(final Object aMessage, final Object aSender, final Throwable aThrowable) { 
     log(aMessage, aSender, Level.WARN, aThrowable); 
    } 


    private void log(final Object aMessage, final Object aSender, final Level aLevel, final Throwable aThrowable) { 
     final String className = getClassNameBy(aSender); 
     Logger.getLogger(className).log(className, aLevel, aMessage, aThrowable); 
    } 
} 

public class LoggingController implement ILoggingController{ 
    //logging service is injected previously 
    @Override 
    public void warn(final Object aMessage, final Throwable aThrowable) { 
     loggingService.warn(aMessage, this, aThrowable); 
    } 
} 

因此,在這種情況下,你允許用戶使用記錄的東西:

loggingController.warn("A warning", null); 

使用這種方式:

  1. 用戶並不瞭解底層的日誌功能
  2. 你總是如果不需要它,可以提供虛擬記錄器,或者環境不允許。
  3. 日誌記錄功能在整個應用程序中是統一的
  4. 類別名稱和代碼行在日誌中顯示爲正確
  5. 您不能使用Log4j最有用的功能之一 - 按包/類名稱過濾。