3

Often stack traces can get so verbose from long class paths that they are very painful to read. Here's an example:

    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=)

...

If I could trim the class path, only showing class names and methods, it would look like this:

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

...

I first asked this as a Guice-specific question, but realized it applies to stack traces in general. Is there any way to configure Java or Eclipse to do this natively? If not, is there a plugin or even external tool to accomplish this?

Community
  • 1
  • 1
Jeff Axelrod
  • 27,676
  • 31
  • 147
  • 246

3 Answers3

2

You can set the default UncaughtExceptionHandler and modify the stack trace before printing to System.err. You may have to play around with the regex, but this will work:

    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);
        }
    });
Garrett Hall
  • 29,524
  • 10
  • 61
  • 76
0

To produce more readable traces, paste the stack trace into Notepad++ and the following regular expression. The same expression could also be used in a scripting language.

I paste the trace into Notepad++ and use the following search and replace settings.

Search pattern: \w[a-z\d_\.]+\.([A-Z][A-Za-z\d_]*)

Replace with: \1

Search Settings: match case enabled, Regular expression search mode.

Jeff Axelrod
  • 27,676
  • 31
  • 147
  • 246
0

If you use logback, then you can use layout to output logs in any way you like http://logback.qos.ch/manual/layouts.html.

Outputting a class like java.lang.String as j.l.String is quite common in stack traces

Ashish
  • 3,028
  • 5
  • 28
  • 35