代码不打印整个堆栈跟踪

时间:2014-05-31 01:02:19

标签: java log4j stack-trace

我有一段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 ()));
    }
}

`

2 个答案:

答案 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()方法。

参考文献: