2012-03-07 5 views
22

Moje ślady stosu Java mają wiele wpisów, na których mi nie zależy, pokazujące wywoływanie metod przechodzących przez proxy i metody odbicia wiosennego i podobne. Może to sprawić, że trudno będzie wskazać część śladu stosu, która faktycznie pochodzi z mojego kodu. Ruby on Rails zawiera "Cleaner czyszczenia stosu", w którym można określić listę wzorców śledzenia stosu w celu pominięcia wydrukowanych śladów stosu - jaki jest najlepszy sposób na zrobienie czegoś podobnego, uniwersalnie, dla Javy?Czyszczenie szumu ze śladu stosu Java

Najlepiej byłoby, gdyby działało to wszędzie, w tym w biegaczu jUnit Eclipse.

+0

Ach tak, "ślad stosu z piekła rodem" według Cay Horstmann: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –

Odpowiedz

9

ma preferencji Stos wzorców filtrów ślad (zobacz java>junit lub wyszukać stacktrace w preferencjach). Możesz zignorować pakiety (także z symbolami wieloznacznymi), klasy lub metody. Działa dla bezpośrednich wywołań testowych (poprzez Uruchom jako Test), a nie dla linii komend, takich jak ant lub maven.

+0

Dzięki za to! To zdecydowanie rozwiązuje mój problem z jUnit. – bhollis

14

umożliwia dostosowywanie stack trace folding, szczególnie przydatne z dynamic languages.

IntelliJ http://blogs.jetbrains.com/idea/wp-content/uploads/2010/07/screen-shot-2010-07-12-at-100921-pm.png

i narzędziem Analyzing external stack traces.

Potrafię sobie wyobrazić ogólne narzędzie/filtr działający na poziomie struktury logowania (np. lub ). Nie sądzę, aby było ogólne poparcie dla tego, ale myślę, że jest to świetny pomysł, aby to wdrożyć. Będę musiał rzucić okiem, może to nie za dużo pracy.

AKTUALIZACJA: Zaimplementowałem filtering irrelevant stack trace lines in logs dla , również śledzić LBCLASSIC-325.

+0

Niestety, wtyczka intelliJ nie jest już kompatybilna. (przynajmniej z 03/17 ubuntu build) – Blauhirn

1

Nie dokładnie to, czego szukasz (i, według mojej najlepszej wiedzy, nie ma uniwersalnego rozwiązania dla twojego problemu, przynajmniej nigdy nie słyszałem o znanym narzędziu do czyszczenia i wydobywania informacji z zestawów stosów Java) .

W każdym razie, this post from July, 05, 2011 at Faux' Blog opisuje agenta Java na wczesnych etapach, którego celem jest wzbogacenie (a nie filtrowanie) śladów stosu. To evens zapewnia link do repozytorium git z mavensed projektu. Może uda Ci się odejść stąd, podkręć jego kod i przetasuj własne rozwiązanie (kto wie, może nawet uruchom projekt open source).

+0

Widziałem to, ale miałem nadzieję, że nie będę musiał pisać sam. Wygląda na to, że trzeba iść tą drogą. – bhollis

2

Dla log4j:

package package1; 

public class FilteringThrowableRenderer implements ThrowableRenderer { 
    private static final String PACKAGES_SEPARATOR = "\\s*,\\s*"; 

    private final static String TRACE_PREFIX = "\tat "; 

    private static final String FILTERED_WARNING = " [Stacktrace is filtered]"; 

    ThrowableRenderer defaultRenderer = new EnhancedThrowableRenderer(); 

    List<String> skippedLinePrefixes; 

    public FilteringThrowableRenderer() { 
     String skippedPackagesString = "java,org"; // TODO: move it to config 
     String[] skippedPackages = 
      skippedPackagesString.trim().split(PACKAGES_SEPARATOR); 
     skippedLinePrefixes = new ArrayList<String>(skippedPackages.length); 
     for (String packageName : skippedPackages) { 
      skippedLinePrefixes.add(TRACE_PREFIX + packageName); 
     } 
    } 

    @Override 
    public String[] doRender(Throwable throwable) { 
     String[] initialTrace = defaultRenderer.doRender(throwable); 
     if (!skippedLinePrefixes.isEmpty()) { 
      List<String> result = new ArrayList<String>(initialTrace.length); 

      boolean filtered = false; 
      trace: for (String element : initialTrace) { 
       for (String skippedLinePrefix : skippedLinePrefixes) { 
        if (element.startsWith(skippedLinePrefix)) { 
         filtered = true; 
         continue trace; 
        } 
       } 
       result.add(element); 
      } 
      if (filtered && result.size() > 0) { 
       result.set(0, result.get(0) + FILTERED_WARNING); 
      } 
      return result.toArray(new String[result.size()]); 
     } else { 
      return initialTrace; 
     } 
    } 
} 

umożliwienia jej kodu:

ThrowableRendererSupport loggerRepository = 
    (ThrowableRendererSupport) LogManager.getLoggerRepository(); 
loggerRepository.setThrowableRenderer(new FilteringThrowableRenderer()); 

lub log4j.properties:

log4j.throwableRenderer=package1.FilteringThrowableRenderer 
6

I rzeczywiście napisał biblioteki (https://github.com/michaelgantman/Mgnt/releases/tag/1.01) zawiera kilka narzędzi. Jednym z nich jest filtr stosu ogólnego zastosowania , którego użyłem szeroko i uznałem za bardzo użyteczny. Klasa nazywa się TextUtils i ma metodę getStacktrace() z kilkoma nadpisanymi sygnaturami. Trwa wykonanie instancji Throwable i umożliwia ustawienie prefiksu pakietów dla pakietów , które są istotne.Powiedzmy kod Twojej firmy zawsze przebywa w pakietach, które zaczynają się od „com.plain. *” Więc można ustawić takiego prefiksu i zrobić to

logger.info(TextUtils.getStacktrace(e, true, "com.plain.")); 

będzie odfiltrować bardzo elegancko wszystkie bezużyteczne części śladu pozostawiając Ty z bardzo zwartym stacktrace. Również uważam, że to bardzo wygodnym wstępnie ustawić prefiks a potem po prostu użyć metody wygodą

TextUtils.getStacktrace(e); 

Będzie to zrobić to samo. Aby zaprogramować prefiks wystarczy użyć metody

setRelevantPackage("com.plain."); 

Również w przypadku korzystania wiosna środowisko można dodać następujące segment do konfiguracji wiosny i wtedy wszystko jest gotowe:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetClass" value="com.mgnt.utils.TextUtils"/> 
    <property name="targetMethod" value="setRelevantPackage"/> 
    <property name="arguments" value="com.plain."/> 
</bean> 

Biblioteka Pochodzi z dobrze napisana (Mam nadzieję) Javadoc, który wyjaśnia wszystko szczegółowo. Ale tutaj jest trochę Teaser: otrzymasz następujące StackTrace:

at com.plain.BookService.listBooks() 
at com.plain.BookService$$FastClassByCGLIB$$e7645040.invoke() 
at net.sf.cglib.proxy.MethodProxy.invoke() 
... 
at com.plain.LoggingAspect.logging() 
at sun.reflect.NativeMethodAccessorImpl.invoke0() 
... 
at com.plain.BookService$$EnhancerByCGLIB$$7cb147e4.listBooks() 
at com.plain.web.BookController.listBooks() 

zamiast

at com.plain.BookService.listBooks() 
at com.plain.BookService$$FastClassByCGLIB$$e7645040.invoke() 
at net.sf.cglib.proxy.MethodProxy.invoke() 
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed() 
at com.plain.LoggingAspect.logging() 
at sun.reflect.NativeMethodAccessorImpl.invoke0() 
at sun.reflect.NativeMethodAccessorImpl.invoke() 
at sun.reflect.DelegatingMethodAccessorImpl.invoke() 
at java.lang.reflect.Method.invoke() 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs() 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod() 
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept() 
at com.plain.BookService$$EnhancerByCGLIB$$7cb147e4.listBooks() 
at com.plain.web.BookController.listBooks() 
0

całkiem miły

https://marketplace.eclipse.org/content/grep-console 

Tylko uogólnione grep formatowania użytkowego Ta wtyczka dla Eclipse konsola, więc nie ma dodatkowych zależności. Formatuję cały mój nieistotny szum na szary tekst.