Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日志异常和参数_Java_Slf4j - Fatal编程技术网

Java 日志异常和参数

Java 日志异常和参数,java,slf4j,Java,Slf4j,我将sl4j api 1.7.2与slf4j-log4j12一起使用 我想记录如下内容: 22:52:27345警告[class]无法加载用户1-原因: javax.ejb.EJBException:javax.persistence.NoResultException:无实体 在中找到要查询的 org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionOnourtx(CMTTxInterceptor.java:166) [jboss-as-ejb

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

我想记录如下内容:

22:52:27345警告[class]无法加载用户1-原因: javax.ejb.EJBException:javax.persistence.NoResultException:无实体 在中找到要查询的 org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionOnourtx(CMTTxInterceptor.java:166) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInurtx(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);
        }

但这两种解决方案都不起作用

第一次尝试:

未能加载用户4-原因:javax.ejb.EJBException: javax.persistence.NoResultException:未找到用于查询的实体

第二点:

Failed to load User 4 - Reason :
有可能做到吗

谢谢。

检查和。您可能正在使用1.6.0之前的SL4J版本,在该版本中,
e
将被解释为一个简单对象(即,如果您有参数占位符,SL4J将调用
e.toString()

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

您可以尝试修复类加载问题,也可以绕过旧版本行为

如果选择后一个路径,则从重载版本中,您需要自动展开堆栈跟踪的
警告(字符串msg,Throwable t))
版本:

logger.warn("Failed to load User " + userId + " - Reason",  e);
或者
警告(字符串格式,对象arg1,对象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);
}

使用slf4j和logback(默认实现)记录实现细节是不好的,它会打印出两个示例的堆栈跟踪的前8行,而且根本不需要替换“{}”。可能是您对log4j的配置,或者打印格式,或者log4j本身(尽管我对此表示怀疑)在classpath坏jboss中的错误版本:(
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);
}