1

我将 sl4j-api 1.7.2 与 slf4j-log4j12 一起使用。

我想记录这样的事情:

22:52:27,345 WARN [class] 无法加载用户 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] 在 org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) [jboss- as-ejb3-7.1.1.Final.jar:7.1.1.Final] 在 org.jboss.as.ejb3.tx.CMTTxInterceptor.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 :

有可能做到吗?

谢谢。

4

1 回答 1

2

检查Logger APISL4J 常见问题解答。您可能正在使用 1.6.0 之前的 SL4J 版本,如果您有一个参数占位符,e它将被解释为一个简单的对象(即 SL4J 将调用e.toString()),如果没有,则被忽略。

至于为什么它使用不同于 1.7.2 的版本,以前的版本可能包含在您的应用程序服务器类路径中,并且在您启动应用程序之前就已加载。

您可以尝试修复类加载问题或解决旧版本的行为。

如果您选择后一种路径,则从重载版本中您需要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);
}
于 2013-01-03T22:32:21.170 回答