我需要编写一个小的日志分析器应用程序来处理由我的项目中使用的第三方封闭源库(内部具有自定义记录器)生成的一些日志文件。
如果日志中有异常条目,我需要从堆栈顶部到异常的实际位置收集有关堆栈跟踪中所涉及方法的汇总信息。
不幸的是,默认情况下,Java printStackTrace()不会打印调用堆栈中的每个方法,但是最多可以打印一个特定的数目,其余的仅被引用为16 more...。
如果我自己可以捕获到该异常,则可以使用getStackTrace()并自己打印该异常,但是根本不会在该库引发的异常中包含根本原因。
有没有办法让Java在stacktrace中打印整个调用堆栈?
除了我的情况,通用的日志记录框架还可以选择吗?
编辑:该程序在带有JDK 1.5.0_09的Sun JVM上运行。 没有选择来改变它。
我如何停止堆栈跟踪在日志中截断的可能重复项
这是对打印迹线中"由...引起的"和" ...更多"行的说明。 另请参阅用于printStackTrace的JavaDoc。 您可能没有任何工作要做。
Note the presence of lines containing the characters"...". These lines indicate that the remainder of the stack trace for this exception matches the indicated number of frames from the bottom of the stack trace of the exception that was caused by this exception (the"enclosing" exception). This shorthand can greatly reduce the length of the output in the common case where a wrapped exception is thrown from same method as the"causative exception" is caught.
好点子。当调用堆栈太大时,我可能会误会...概念是一种简单的排序形式。我想如果有一个没有根案例的异常被嵌套100帧深度,我会在打印输出中得到那100行吗?
我希望如此,但是JavaDoc中有Throwables getStackTrace()警告:"某些虚拟机在某些情况下可能会从堆栈跟踪中忽略一个或多个堆栈帧。"在getOurStackTrace()的核心处,有两个控制此行为的本机方法:getStackTraceDepth()和getStackTraceElement(int index)
谢谢。您还可以考虑第二个问题吗?可能有一天需要分析我自己的log4j输出。进行完整打印而不用担心在原因和主要例外之间来回跳转会容易得多。
您正在寻找一种打印堆栈的方法而无视Throwable原因?
不,但是希望某些日志记录库(因为它可以访问getStackTrace())提供了将其完全打印的选项(如果有的话)。
在上面的链接中,有对Appaches Commons Lang库的引用,该库提供了ExceptionsUtils类。其中有一些助手可以上下颠倒地打印跟踪。
谢谢。我想我将为此需求量身定制一些开源日志记录框架。
您不能用Thread.currentThread().getStackTrace()做什么吗?
这是一个真实的简单示例,该示例递归调用一个方法20次,然后转储当前线程的堆栈。
public class Test {
public static void main(String[] args) {
method();
}
static int x = 0;
private static void method() {
if(x>20) {
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for(int i=0; i
System.out.println(elements[i]);
}
}
else {
x++;
method();
}
}
}
Quote:"如果我可以自己捕获异常,则可以使用getStackTrace()并自行打印"
因此,您无论如何都无法控制代码?您只是在查看日志文件?我想再读一遍你的问题。道歉!但是,如果有人觉得有用,我会保留源代码。
它是一些传统操作的第三方库。即使没有错误,也无法对其进行JAD操作。基于akfs的答案,我可能只是误解了stacktrace打印输出格式。我很少执行以编程方式分析stacktrace的任务。
"如果我可以自己捕获异常,则可以使用getStackTrace()并自行打印"-是的,但是通常将" Throwable"传递给Logger(Java Logging,SLF4J,Log4J),并且可以对可插入代码进行编码记录器实现以您想要的任何方式打印stacktrace :-)
可能是您可以尝试遍历由返回的数组:
Thread.currentThread().getStackTrace();
Quote:"如果我可以自己捕获异常,则可以使用getStackTrace()并自行打印"
Thread对象上的getStackTrace()方法应返回当前线程的完整堆栈跟踪信息,不是吗?如果在同一线程中引发了根异常,它应该工作吗?可能我缺少一些东西吗?
库内部发生异常。它将此异常堆栈跟踪记录到其日志文件中,然后实例化其自身的异常(称为LibException),其中包含根本原因(LibException:FileNotFoundException ...)的消息,但未分配根本原因。该库很可能是为Java 1.2编写的,其中没有带有根本原因参数的构造函数,而initCause()方法从1.4开始。
这篇博客探讨了如何在Java中获取完整的堆栈跟踪信息,尤其是当异常由第三方库引发并记录在日志中时。作者遇到了printStackTrace()方法只显示部分堆栈的问题,并讨论了可能的解决方案,包括使用Thread.currentThread().getStackTrace()和Apache Commons Lang的ExceptionsUtils类。此外,还提到了Java虚拟机在某些情况下可能忽略堆栈帧的情况。
352

被折叠的 条评论
为什么被折叠?



