2012-03-07 5 views
22

Mis rastros de la pila de Java tienen muchas entradas que no me importan, que muestran la invocación del método a través de proxies y métodos de reflexión de Spring y cosas por el estilo. Puede hacer que sea bastante difícil elegir la parte del seguimiento de la pila que es realmente de mi código. Ruby on Rails incluye un "limpiador de seguimiento de pila" donde puede especificar una lista de patrones de seguimiento de pila para omitir los rastros de pila impresos: ¿cuál es la mejor manera de hacer algo así, universalmente, para Java?Limpiando el ruido de los rastros de la pila de Java

Sería mejor si esto funcionara en todas partes, incluso en el corredor jitit de Eclipse.

+0

Ah sí, el "stack trace from hell" según Cay Horstmann: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –

Respuesta

9

tiene una preferencia Pila patrones filtro de seguimiento (ver java> JUnit o buscar stacktrace en las preferencias). Puede ignorar paquetes (también con comodines), clases o métodos. Funciona para llamadas de prueba directas (a través de Ejecutar como Prueba), no para ejecuciones de línea de comandos como ant o maven.

+0

¡Gracias por esto! Esto definitivamente resuelve mi problema con el plugin jUnit. – bhollis

14

permite personalizar stack trace folding, especialmente útil con dynamic languages.

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

y una herramienta Analyzing external stack traces.

Puedo imaginar la herramienta general/filtro trabajando en el marco de registro (como o ) nivel. No creo que haya ningún apoyo general para eso, pero creo que es una gran idea implementar esto. Voy a echar un vistazo, tal vez no es tanto trabajo.

ACTUALIZACIÓN: Implementé filtering irrelevant stack trace lines in logs para , también sigo LBCLASSIC-325.

+0

desafortunadamente, el plugin intelliJ ya no es compatible. (al menos con 03/17 ubuntu build) – Blauhirn

1

No es exactamente lo que está buscando (y, a lo mejor de mi conocimiento, no hay una solución universal para su problema, al menos nunca he oído hablar de una famosa herramienta para limpiar y extraer información de pila stack de Java) .

De todos modos, this post from July, 05, 2011 at Faux' Blog describe un agente de Java en etapas iniciales cuyo propósito es enriquecer (y no filtrar) los rastros de pila. Esto une un enlace a un repositorio git con un proyecto mavenizado. Tal vez puedas ir desde aquí, modificar su código y rodar tu propia solución (quién sabe, tal vez incluso comenzar un proyecto de código abierto).

+0

Lo he visto, pero esperaba no tener que escribir el mío. Parece que es el camino a seguir. – bhollis

2

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

para permitir con código:

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

o con log4j.properties:

log4j.throwableRenderer=package1.FilteringThrowableRenderer 
6

De hecho, me escribió una biblioteca (https://github.com/michaelgantman/Mgnt/releases/tag/1.01) que contiene varias utilidades. Uno de ellos es un filtro stacktrace de uso general que utilicé ampliamente y lo encontré muy útil. La clase se llama TextUtils y tiene el método getStacktrace() con varias firmas anuladas. Toma una instancia Throwable y permite establecer un prefijo de paquete de los paquetes que sean relevantes.Digamos que el código de su empresa siempre reside en paquetes que comienzan con "com.plain. *" Así se establece un prefijo y hacer esto

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

este filtrará muy inteligentemente todas las partes inútiles de la traza dejando con stacktrace muy conciso. También me pareció muy conveniente para pre-configurado el prefijo y luego sólo tiene que utilizar el método de confort

TextUtils.getStacktrace(e); 

Se hará lo mismo. Para preajustar el prefijo sólo tiene que utilizar el método

setRelevantPackage("com.plain."); 

Además, si utiliza entorno de primavera se puede añadir el siguiente segmento a la configuración primavera y entonces todo listo:

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

La biblioteca viene con bien escrito (Espero) Javadoc que explica todo en detalle. Pero aquí es un poco bromista: obtendrá un siguiente 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() 

en lugar de

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

bastante agradable

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

Sólo un grep generalizada utilidad de formato de este plug-in para Eclipse consola, por lo que no hay dependencias adicionales. Formateo todo mi ruido irrelevante en texto gris.

Cuestiones relacionadas