2013-01-03 113 views
1

我使用sl4j-api 1.7.2和slf4j-log4j12。日誌異常和參數

我想記錄是這樣的:

22:52:27345警告[類]無法加載用戶1 - 原因: javax.ejb.EJBException異常:javax.persistence.NoResultException:無實體 發現查詢 org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as .ejb3.tx.CMT TxInterceptor.required(CMTTxInterceptor.java:304) [的jboss-AS-ejb3-7.1.1.Final.jar:7.1.1.Final] ... fullstackTrace

所以,我想

try { 
      //... 
     } catch (Exception e) { 
      logger.warn("Failed to load User {} - Reason : {}", userId, e); 
     } 

或者

try { 
       // ... 
      } catch (Exception e) { 
       logger.warn("Failed to load User {} - Reason : ", userId, e); 
      } 

但沒有這兩種解決方案的工作

第一次嘗試給予:

無法加載用戶4 - 原因:javax.ejb.EJBException異常: javax.persistence.NoResultException:未找到查詢

實體第二種:

Failed to load User 4 - Reason : 

是它可能做到了嗎?

謝謝。

+0

這是不好的記錄實施細則 – Woot4Moo

+1

我使用與的logback(默認實現)SLF4J,並打印出前8線您的兩個例子的堆棧跟蹤,也沒有「{ }「完全替代。也許這是你的配置log4j,或打印格式,或log4j本身(雖然我懷疑它) –

回答

2

檢查Logger APISL4J FAQ。如果您有一個參數佔位符,或者如果您沒有參數佔位符,那麼您可能使用的是1.6.0之前的SL4J版本,其中e將被解釋爲一個簡單對象(即,SL4J將調用e.toString())。

至於爲什麼它使用的版本不是1.7.2,以前的版本可能包含在Application Server Classpath中,並且在您啓動應用程序之前就已加載。

您可以嘗試修復Classloading問題或解決舊版本行爲。

如果你選擇後者的路徑,從重載版本,你需要要麼warn(String msg, Throwable t))版本自動擴展堆棧跟蹤:

logger.warn("Failed to load User " + userId + " - Reason", e); 

還是warn(String format, Object arg1, Object arg2)一個與代碼擴展堆棧跟蹤你。

if (logger.isWarnEnabled()) { 
    StringWriter sw = new StringWriter(); 
    PrintWriter pw = new PrintWriter(sw); 
    e.printStackTrace(pw); 
    String expanded = sw.toString(); // stack trace as a string 
    logger.warn("Failed to load User {} - Reason : {}", userId, expanded); 
} 
+0

錯誤的版本在classpath壞jboss :( –