2017-04-26 49 views
1

我最近偶然發現了現有應用程序中以下幾行日誌代碼。此代碼看起來完全錯誤的我在很多方面這個記錄語句有什麼問題?

Method method = ...;// passed in as parameter 
//... 
String className = method.getDeclaringClass().getName(); 
String methodName = method.getName(); 
long id = Thread.currentThread().getId(); 
String name = Thread.currentThread().getName(); 
String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
LOGGER.debug("xxxxxxxx {}", msg); 

我想知道

  • 什麼都錯了這段代碼?
  • 什麼對性能影響最大?
  • 寫這種日誌語句的最佳方式是什麼?

(注:爲{}表示,這是一個SLF4J記錄器和xxxxxxxx是一個獨特的串以識別代碼庫這個格外logging語句)

+0

*「這個代碼看起來完全錯誤的我在很多方面」 * - 有什麼辦法?反射被認爲是緩慢的,所以這可能是一個性能上的衝擊 – MadProgrammer

+1

使用適當的日誌記錄模式而不是重新發明輪子會更容易和更有效率...... – assylias

回答

3

日誌是在應用程序中的交叉問題。
因此,對於一般情況,我使用攔截器/方面模式來做到這一點。

String className = method.getDeclaringClass().getName(); 
String methodName = method.getName(); 
long id = Thread.currentThread().getId(); 
String name = Thread.currentThread().getName(); 
String msg = String.format("some text, for: %s %s in thread %d %s", 
       className, methodName, id, name); 

做這些計算,而不當前logger的有效級別之前檢查是一種無感,因爲它即使日誌不寫應用。
此外,所有這些信息可以由API記錄器檢索,如果需要並在appender的模式中指定。

除了這是無效或者:

String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
LOGGER.debug("xxxxxxxx {}", msg); 

它還檢查格式化前的水平字符串。

隨着實際的代碼,這是更好的:

if (LOGGER.isDebugEnabled()){ 
    String className = method.getDeclaringClass().getName(); 
    String methodName = method.getName(); 
    long id = Thread.currentThread().getId(); 
    String name = Thread.currentThread().getName(); 
    String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
    LOGGER.debug("xxxxxxxx {}", msg); 
} 

但是,一個更加強大的解決方案是使用附加器的圖案裝飾與線程ID,方法等日誌信息...


最後作爲檢查當前等級(此處:if (LOGGER.isDebugEnabled()){)未包含測井處理的一般方法,例如:

String msg = String.format("some text, for: %s %s in thread %d %s", className, methodName, id, name); 
LOGGER.debug("xxxxxxxx {}", msg); 

使用採用var args的log方法會更有效,因爲它是爲您的樣本設計的,而不是用於您的示例,因爲它違背了它的目的。

通過這種方式,不遺餘力計算,如果有效記錄水平不匹配:

LOGGER.debug("some text, for: {} {} in thread {} {}", className, methodName, id, name);