2013-02-20 55 views
1

登錄信息水平對於某些故障的原因,我想記錄所有過去的信息(例如最近20)從跟蹤級別,如果有發生一個例外,但如果代碼運行良好,我想從INFO級別登錄,以保持清除我的日誌文件免受不必要的日誌消息。登錄各級過去的一些日誌消息在例外的情況下,在正常情況下

例如:

public void m(String arg){ 
    log.trace("arg value: " + arg); 
    log.info("Hi Bob!"); 
    try{ 
     //code 
    }catch(Exception e){ 
     log.error("error msg", e); 
    } 
} 

我想在日誌類似獲得:

*INFO* Hi Bob! 

但是,如果發生錯誤,我想在日誌類似獲得:

*TRACE* arg value: test 
*INFO* Hi Bob! 
*ERROR* error msg //and stacktrace 

換句話說,我想有一個從低級別的消息清除日誌消息緩衝區,如果代碼運行良好並在出現錯誤時推送到日誌文件中。 java日誌框架可以從框中執行此操作嗎?

回答

1

我猜測,有這個問題並沒有標準配置,我會查看自定義添加器重寫你最喜歡用一種緩衝和附加在錯誤的情況下,只有元素。

在我看來,你可能比記錄過去的事情更好的記錄詳細的錯誤信息。

2

不幸的是,我懷疑你可以用log4j做這樣的事情。我覺得你可以做其他兩兩件事:

  1. 寫你在錯誤信息所需要的信息(並不總是可行的)

    log.error("error with arg value " + arg, e); 
    
  2. 配置log4j,使其最多可打印在地級信息控制檯或日誌文件,並在另一個文件中打印多達級別的跟蹤,叫什麼「detailed.log」,你會考慮只在一個錯誤的情況下。詳情如何做到這一點see this question

+0

您也可以使用MDC來追蹤整個執行軌跡 – user1428716 2013-02-21 01:44:38

1

UPDATE 這是不正確的說是沒有辦法做到這一點。看看log4j的MappedDiagnosticContextthis似乎是一個不錯的指令


有沒有辦法做到這一點。

認爲,當前跟蹤級別INFO和代碼作如下記錄來電:

  1. TRACE
  2. 信息
  3. ERROR

#1沒有辦法爲,以知道代碼將在ERROR下游落得,所以唯一的解決辦法是緩衝器吧。然後在#2記錄需要發生,因爲當前的水平是INFO

#3發生錯誤時,已發生INFO日誌#2。在#2之前沒有辦法滾回來並插入#1跟蹤。

不記錄在#2並等待方法/功能執行完成通常是一個壞主意。它可能適用於你,但你最終可能會丟失日誌行,這是不好的。

最好的選擇是存儲在內存中 - 比如在本地線程中 - 附加信息以便在出現錯誤時登錄。因此,輸出將是:

10:15 INFO 
10:20 ERROR 
     10.10: TRACE 

記錄的一筆大開銷是構建這些字符串從對象寫。所以,而不是緩衝實際的字符串,你需要說一些Callable或一些這樣的。這一切都變得非常混亂。