如何在堆栈跟踪中隐藏长类路径以使其可读?

时间:2012-02-10 16:27:14

标签: java eclipse debugging stack-trace readability

堆栈跟踪通常会从长类路径中变得如此冗长,以至于它们非常难以阅读。这是一个例子:

    1) No implementation for java.util.Set<
com.mydomain.myapp.android.activities.catbrowser.generalizedbrowser.listview.
helpers.databaseitem.itemmanipulators.ItemManipulator<
 com.mydomain.myapp.flash.Cat>> annotated with
 @com.google.inject.assistedinject.Assisted(value=) was bound.
      while locating
 java.util.Set<
  com.mydomain.myapp.android.activities.catbrowser.generalizedbrowser.listview.
  helpers.databaseitem.itemmanipulators.ItemManipulator<
   com.mydomain.myapp.flash.Cat>> annotated with 
   @com.google.inject.assistedinject.Assisted(value=)

...

如果我可以修剪类路径,只显示类名和方法,它将如下所示:

1) No implementation for 
   Set<ItemManipulator<Cat>> annotated with @Assisted(value=) was bound.
   while locating Set<ItemManipulator<Cat>> annotated with @Assisted(value=)

...

我首先将其称为Guice-specific question,但意识到它一般适用于堆栈跟踪。有没有办法配置Java或Eclipse本地执行此操作?如果没有,是否有插件甚至外部工具来实现这一目标?

3 个答案:

答案 0 :(得分:2)

您可以设置默认UncaughtExceptionHandler并修改堆栈跟踪,然后再打印到System.err。您可能需要使用正则表达式,但这将起作用:

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PrintStream ps = new PrintStream(baos);
            e.printStackTrace(ps);
            String withoutClasspaths = baos.toString().replaceAll("(\\w+\\.){2,}(\\w*)", "$2");
            System.err.println(withoutClasspaths);
        }
    });

答案 1 :(得分:0)

要生成更具可读性的跟踪,请将堆栈跟踪粘贴到Notepad ++和以下正则表达式中。同样的表达式也可以用在脚本语言中。

我将跟踪粘贴到Notepad++并使用以下搜索和替换设置。

搜索模式\w[a-z\d_\.]+\.([A-Z][A-Za-z\d_]*)

替换为\1

搜索设置match case已启用,Regular expression搜索模式。

答案 2 :(得分:0)

如果您使用logback,那么您可以使用布局以您喜欢的任何方式输出日志 http://logback.qos.ch/manual/layouts.html

将类似java.lang.String的类输出为j.l.String在堆栈跟踪中非常常见