我有一段java代码可以捕获顶级异常,如下所示 `
public Class myTest {
@Test
public void test() {
try {
callSomeMethod()
} catch (Exception e) {
LOGGER.error ("Exception occured", e);
LOGGER.error (e,e);
}
}
private callSomeMethod() throws Exception {
...
...
}
}
不知何故,我无法捕获整个堆栈跟踪。这是归因于Logger吗? 我正在使用org.apache.log4j.Logger;我尝试了两种版本的Logger方法,但仍然缺少整个堆栈跟踪。我只收到Exception消息。 而上面的方法实际上是用@Test注释的testng测试 `
提前感谢您的时间。
以下专家提出的整个代码供参考。 请注意,在我使用ByteArrayStream将堆栈跟踪作为字符串传递给下面给出的每个答案之后,这是有用的。
`
@Test
public void importLocalCertsOnSecondary () {
LOGGER.info("Certificate Import URI-" + URIs.IMPORT_LOCAL_CERTIFICATE.getUri());
try {
LOGGER.info ("@@ Importing Local Cert for node=>" + TestEnvironment.getIPs().get(0).getIp());
Util.importCertificates (URIs.IMPORT_LOCAL_CERTIFICATE.getUri(),
Constants.IMPORT_LOCAL_CERT_XML.getValue(),
Constants.DIRECTORY_PATH.getValue(),
Constants.LOCAL_CERT_CRT_FILE.getValue(),
Constants.constants.LOCAL_CERT_KEY.getValue(),
ipAddress,"local");
} catch (Exception er) {
ByteArrayOutputStream os = new ByteArrayOutputStream ();
er.printStackTrace (new PrintStream (os));
LOGGER.error(new String(os.toByteArray ()));
//LOGGER.error(er);
LOGGER.error(" Exception importing certs-"+ er.getLocalizedMessage());
Assert.fail(new String(os.toByteArray ()));
}
}
`
答案 0 :(得分:1)
我对只接受字符串的记录器使用这种小技术:
ByteArrayOutputStream os = new ByteArrayOutputStream ();
e.printStackTrace (new PrintStream (os));
LOGGER.error(new String(os.toByteArray ()));
答案 1 :(得分:1)
首先,我不认为这是由日志框架引起的。标准PatternLayout是硬连线的,用于打印堆栈跟踪。你无法“配置”它。 (如果你使用了不同的布局类,这不适用。但我认为你知道你是否这样做了。)
那为什么堆栈跟踪丢失了?我可以想到两个可能的原因:
HotSpot Server JVM的优化使用预先分配的异常对象,而不是每次都分配新的异常对象。 (保存可能很重要。)缺点是这些预分配的异常不记录堆栈跟踪信息,因此如果您需要堆栈跟踪进行诊断,则不存在。
也可以声明一个例外来抑制它自己的堆栈跟踪。你所做的是覆盖异常的Throwable.fillInStackTrace()
方法。
参考文献: