2014-03-19 61 views
0

假設我有一個包含20個類的程序,每個類都有private static Logger logger = LoggerFactory.getLogger(SomeClass.class);。這20個類將記錄警告,信息,調試或錯誤。如何獲取所有的logback錯誤到字符串中

在其中一個類中,我如何才能訪問到目前爲止(在所有類中)記錄在程序中的所有錯誤?注意:我不想將所有這些轉儲到.log,我想從Java程序中訪問它們。

回答

0

當所有類都將日誌記錄到.log文件中或想要在日誌記錄發生時繼續訪問時,是否要訪問它?

如果您想在日誌功能後訪問這20個類中的所有日誌,那麼爲什麼不在以後的其他java程序中讀取.log文件來訪問所有日誌。

但我想你需要在你的日誌文件中的一個指標來確定那些語句已被這20個類記錄下來。比方說在是ConsoleAppender配置一些字符串

+0

訪問正在記錄直接從Logger或LoggerFactory發生。我根本不想去.log文件,但將它全部保存在Java程序中。 – user2763361

+0

我想你爲什麼要這樣做,當你有一個記錄器。對我來說似乎是一個奇怪的要求通過java代碼實現這個邏輯將會很困難。可以創建一個HashMap >,其中Key爲Logger級別,列表包含該級別的所有錯誤。但是你必須通過這些我認爲不好的地圖 – vikeng21

-1

不是很困難 - 要麼 讀取日誌文件 或 Overrider your log4j framework所以不是記錄到文件,它應該將數據記錄到Java對象(這將是非常內存密集型)。

3

使用自定義appender添加到列表,這是單例列表使用您可以訪問所有不匹配。

CustomAppender.java

public class CustomAppender extends UnsynchronizedAppenderBase<ILoggingEvent> { 

    @Override 
    protected void append(ILoggingEvent eventObject) { 
     if(eventObject.getLevel() == Level.WARN){ 
     { 
      KPLogHolder.addData(eventObject.getMessage); 
     } 
    } 
} 

一個Singleton java類來承載消息KPLogHolder.java

public class KPLogHolder { 

    private static List<String> holder; 

    public static List<String> getLog(){ 
     if(holder== null){ 
      return new ArrayList<String>(); 
     } 
     return holder; 
    } 

    public static void addData(String item){ 
     getLog().add(item); 
    } 

} 

和訪問mssage。

public class KPTest{ 

    @Test 
    public void testLog(){ 
     LOG.warn("Warning!!!!"); 

     for(String str: KPLogHolder.getLog()){ 
       System.out.println(str); 
     } 
    } 
} 

注意我沒有使用的同步需要實現那些爲ArrayList的不同步。不知道爲什麼這個要求,但要小心。大多數情況下,這些都會導致錯誤的實現,這種情況會導致服務器失效。如果沒有正確執行。

相關問題