2013-01-03 83 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 :( –