2015-11-20 49 views
0

幾乎在每一個項目中,我請使用Log4j的或SLF4J的logback與記錄事件和幾乎無處不在我寫類似避免的Log4j/SLF4J調試啓用檢查

if (log.isDebugEnabled()) { 
    log.debug("I'm here doing this stuff"); 
} 

有時你看不到實際的方法邏輯與所有這些日誌代碼。 我無法刪除log.isDebugEnabled()檢查,因爲即使我使用Slf4j和{}功能,如果未啓用調試(或任何級別),某些日誌信息可能會計算並丟失。

log.debug("Here is the data: {}", calculateDataFromSeveralDataSourcesDuh()); 

這裏的問題是:有沒有辦法推遲登錄信息的計算,所以它只有在適當的日誌級別而無需在應用程序代碼檢查啓用計算?

如果我不能使用Java 8並且我使用Slf4j API,那麼有什麼可能的選擇,所以Log4j2不可用?

回答

1

通過使用Log4j2和Java 8,您可以很容易地使用lambda表達式here,因此在您的情況下使用debug(Message, Supplier)

log.debug("Here is the data: {}",() -> calculateDataFromSeveralDataSourcesDuh()); 

如果你不能使用log4j2或Java 8,看看在object rendering在log4j的概念。你可以爲特定的類設置你自己的對象渲染器,與渲染它相比,它的構建會很便宜(涉及calculateDataFromSeveralDataSourcesDuh調用)。 假設只有部分調試信息的計算成本很高,可能需要識別這些情況併爲它們創建自定義類(以及相應的對象渲染器)。

+0

謝謝,這是一個不錯的選擇。我希望我可以在我當前的項目中使用Java 8和Log4j2。) – Kuvaldis

+0

我編輯了答案以涵蓋log4j – muued