我使用的是Log4j2,有些是beta-10版本。
当您遇到异常时,很容易记录堆栈跟踪:
} catch (Exception ex) {
log.error("Doing stuff went wrong", ex);
}
假设没有Throwable
对象可用 - 我刚刚意识到存在问题并且想要记录错误:
if (stuffIsWrong()) {
log.error("Stuff went wrong");
}
如何告诉Log4j2从当前方法开始记录堆栈跟踪?
答案 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);
}
只需检查您的状况以及是否符合条件,然后在日志中打印堆栈跟踪