2012-02-10 56 views
3

通常堆棧跟蹤可以從長類路徑中得到如此詳細的信息,以致它們非常難以閱讀。這裏有一個例子:如何隱藏堆棧軌跡中的長類路徑以使其可讀?

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本身執行此操作?如果沒有,有沒有一個插件,甚至外部工具來完成呢?

回答

0

要生成更多可讀的跟蹤,請將堆棧跟蹤粘貼到Notepad ++和以下正則表達式中。同樣的表達也可以用在腳本語言中。

我將跟蹤粘貼到Notepad++並使用以下搜索和替換設置。

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

替換\1

搜索設置:啓用match caseRegular expression搜索模式。

0

如果您使用logback,那麼您可以使用佈局以任何方式輸出日誌,如 http://logback.qos.ch/manual/layouts.html

1.4.3像java.lang.String中一類作爲j.l.String是在棧相當普遍打印到System.err之前痕跡

2

您可以設置默認UncaughtExceptionHandler和修改堆棧跟蹤。您可能必須玩正則表達式,但這將工作:

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); 
     } 
    });