2012-03-07 4 views
22

Мои трассировки стека Java содержат много записей, которые мне не нужны, показывая вызов метода, проходящий через прокси и методы отражения Spring и тому подобное. Это может сделать довольно сложным выделить часть трассировки стека, которая на самом деле из моего кода. Ruby on Rails включает в себя «очиститель трассировки стека», где вы можете указать список шаблонов трассировки стека, чтобы опустить из печатных трасс стека - какой лучший способ сделать что-то подобное, универсально, для Java?Очистка шума из трассировки стека Java

Было бы лучше, если бы это работало везде, в том числе в бегуне Eclipse jUnit.

+0

Ах да, «трассировка стека из ада» согласно Cay Horstmann: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –

ответ

9

имеет предпочтение трассировки стека фильтр модели (посмотреть на Java>JUnit или искать stacktrace в настройках). Вы можете игнорировать пакеты (также с подстановочными знаками), классы или методы. Работает ли для прямых тестовых вызовов (через Запуск от Тест), а не для прогонов командной строки, например ant или maven.

+0

Спасибо! Это определенно решает проблему моего jUnit-плагина. – bhollis

14

позволяет настраивать stack trace folding, особенно полезно с dynamic languages.

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

и Analyzing external stack traces инструмент.

Я могу представить себе общий инструмент/фильтр, работающий на каркасе каротажа (например,или ). Я не думаю, что для этого есть какая-то общая поддержка, но я думаю, что это отличная идея реализовать это. Я посмотрю, может быть, это не так много.

ОБНОВЛЕНИЕ: Я внедрил filtering irrelevant stack trace lines in logs для , также следуют LBCLASSIC-325.

+0

, к сожалению, плагин intelliJ больше несовместим. (по крайней мере, с 03/17 ubuntu build) – Blauhirn

1

Не совсем то, что вы ищете (и, насколько мне известно, универсального решения для вашей проблемы нет, по крайней мере, я никогда не слышал о знаменитом инструменте для очистки и извлечения информации из Java stacktraces) ,

В любом случае, this post from July, 05, 2011 at Faux' Blog описывает Java-агент на ранних этапах, целью которого является обогащение (а не фильтрация) стековых следов. Он обеспечивает связь с репозиторием git с заученным проектом. Может быть, вы можете пойти отсюда, настроить его код и бросить свое собственное решение (кто знает, может даже начать проект с открытым исходным кодом).

+0

Я это видел, но надеялся, что мне не придется писать свои собственные. Похоже на то, как идти. – bhollis

2

Для 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; 
     } 
    } 
} 

, чтобы включить его с кодом:

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

или log4j.properties:

log4j.throwableRenderer=package1.FilteringThrowableRenderer 
6

Я на самом деле написал библиотеку (https://github.com/michaelgantman/Mgnt/releases/tag/1.01) который содержит несколько утилит. Один из них - это утилита stacktrace общего назначения , которую я использовал широко и нашел, что это очень полезно. Класс называется TextUtils и имеет метод getStacktrace() с несколькими переопределенными сигнатурами. Требуется экземпляр Throwable и позволяет установить префикс пакета пакетов , которые являются релевантными.Скажем код вашей компании всегда находится в пакетах, которые начинаются с «com.plain. *» Так вы установите такой префикс и сделать это

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

это будет отфильтровывать очень шустро все ненужные части следа оставляя вы с очень кратким стеклом. Кроме того, я нашел, что это очень удобно, чтобы предварительно установить префикс , а затем просто использовать метод

удобств
TextUtils.getStacktrace(e); 

Он будет делать то же самое. Чтобы запрограммировать префикс просто использовать метод

setRelevantPackage("com.plain."); 

Кроме того, если вы используете Spring среды вы можете добавить следующий сегмент конфигурации Spring, а затем вам весь набор:

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

Библиотека поставляется с хорошо написано (Надеюсь) Джавадок объясняет все подробно. Но вот немного тизер: Вы получите следующую трассировку стека:

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

вместо

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

довольно хороший

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

Просто обобщенным Grep форматирования утилиты этого плагина для Eclipse, консоль, поэтому никаких дополнительных зависимостей. Я отформатировал весь свой нерелевантный шум до серого текста.

Смежные вопросы