Log4j2:没有异常的日志堆栈跟踪

时间:2014-04-28 09:58:35

标签: java log4j2

我使用的是Log4j2,有些是beta-10版本。

当您遇到异常时,很容易记录堆栈跟踪:

} catch (Exception ex) {
  log.error("Doing stuff went wrong", ex);
}

假设没有Throwable对象可用 - 我刚刚意识到存在问题并且想要记录错误:

 if (stuffIsWrong()) {
   log.error("Stuff went wrong");
 }

如何告诉Log4j2从当前方法开始记录堆栈跟踪?

3 个答案:

答案 0 :(得分:4)

只需创建一个新的例外

if (stuffIsWrong()) {
    log.error("Stuff went wrong", new Exception("Stracktracegenerator"));
}

答案 1 :(得分:1)

我对堆栈跟踪有类似的需求,即使没有任何"出错#34;。我理解你即使没有出错也不愿意使用例外。

在我的情况下,这是一个临时问题,我需要通过调用某个方法来调查某个方法。

将此堆栈跟踪与" real"分开。例外我创建了一个扩展Exception的类,名为NoProblemJustShowingStackTrace,但任何澄清你意图的名称都可以。一个好名字有点帮助,但作为开发人员,我们习惯于只在“真实”时才看到堆栈跟踪。异常被抛出/被捕获,它仍然会让阅读日志的人感到困惑。一旦临时问题得到解决,最好删除此代码。

请注意,您不必throw此例外,您只需创建对象并将其传递给记录器方法。


更永久的替代解决方案是使用带有位置信息的pattern layout,例如%location,%line,%file,%class,%method。请注意,这会对性能产生很大影响。

答案 2 :(得分:0)

可以通过以下代码打印任何方法的堆栈跟踪:

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}

只需检查您的状况以及是否符合条件,然后在日志中打印堆栈跟踪