Я на самом деле написал библиотеку (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()
Ах да, «трассировка стека из ада» согласно Cay Horstmann: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –