2015-10-19 2 views
1

Est-il possible de réduire la stacktrace d'une exception vers le bas pour ignorer la pile Springs? Quand une de mes méthodes lance une exception IllegalArgumentException (comme prévu) et que j'enregistre le message et la pile dans log4j, j'obtiens aussi un journal entier de la pile Springs alors que tout ce dont j'ai vraiment besoin pour mes propres exceptions est la partie concernée dans le code qui est réellement en jeu.Peut-on réduire la pile dans Spring Boot?

Par exemple, la pile ci-dessous devrait être réduite à 8 lignes, en ignorant le cadre org.spring et en avant.

ERROR 2015-10-19 13:36:38,138 ID-TESTPRVR AccountDataValidation -Failed to parse Account Data! 
java.lang.IllegalArgumentException: Unsupported String length: [4] 
com.test.util.AccountData.<init>(AccountData.java:105) 
com.test.AccountDataValidation.getAccountData(AccountDataValidation.java:61) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:606) 
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:295) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:69) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1526) 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1482) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
java.lang.Thread.run(Thread.java:745) 

aussi, bien sûr, quand le printemps jette une exception lui-même, je pense qu'elle doit montrer sa stacktrace.

Répondre

1

Il y a un Log4J add-on qui peut filtrer la trace de la pile . Avec la disposition personnalisée sur le chemin de classe, vous pouvez ensuite configurer les éléments à filtrer dans votre configuration:

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="it.openutils.log4j.FilteredPatternLayout"> 
     <param name="ConversionPattern" value="%-5p %c %F(%M:%L) %d{dd.MM.yyyy HH:mm:ss} %m%n" /> 
     <param name="Filter" value="org.apache.catalina" /> 
     <param name="Filter" value="org.apache.tomcat" /> 
     <param name="Filter" value="org.apache.coyote" /> 
     <param name="Filter" value="org.myapp.web.filters" /> 
     <param name="Filter" value="com.opensymphony.module.sitemesh.filter" /> 
     <param name="Filter" value="sun.reflect" /> 
     <param name="Filter" value="javax.servlet.http" /> 
    </layout> 
</appender> 
0

La bibliothèque Guava de Google contient de jolies méthodes utilitaires dans son API Throwables. Pour votre cas particulier, je pense que getRootCause(Throwable) ou getCausalChain(Throwable) fonctionnerait bien.

chaîne causales Goyave rend un peu plus simple d'étudier la chaîne de cause à effet d'une exception, fournissant trois méthodes utiles dont les signatures sont explicites:

Throwable getRootCause(Throwable) 
List<Throwable> getCausalChain(Throwable) 
String getStackTraceAsString(Throwable)