Как я могу скрыть длинные пути классов в следах стека, чтобы сделать их читаемыми? - PullRequest
3 голосов
/ 10 февраля 2012

Часто трассировки стека могут быть настолько многословными из длинных путей классов, что их очень больно читать. Вот пример:

    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 вопрос , но понял, что он применим к трассировкам стека в целом. Есть ли способ настроить Java или Eclipse, чтобы сделать это изначально? Если нет, есть ли плагин или даже внешний инструмент для этого?

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Можно установить значение по умолчанию 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);
        }
    });
0 голосов
/ 11 февраля 2012

Если вы используете logback, то вы можете использовать макет для вывода журналов любым способом, который вам нравится http://logback.qos.ch/manual/layouts.html.

Вывод такого класса, как java.lang.String, поскольку jlString довольно часто встречается в трассировке стека

0 голосов
/ 10 февраля 2012

Чтобы создать более читаемые трассировки, вставьте трассировку стека в Notepad ++ и следующее регулярное выражение. Это же выражение можно использовать и в языке сценариев.

Я вставляю трассировку в Блокнот ++ и использую следующий поиск и замену настроек.

Шаблон поиска : \w[a-z\d_\.]+\.([A-Z][A-Za-z\d_]*)

Заменить на : \1

Настройки поиска : match case включен, Regular expression режим поиска.

...