Tôi thực sự đã viết một thư viện (https://github.com/michaelgantman/Mgnt/releases/tag/1.01) có chứa một số tiện ích. Một trong số đó là bộ lọc ngăn xếp phổ biến mà tôi đã sử dụng rộng rãi và thấy nó rất hữu ích. Lớp này được gọi là TextUtils và nó có phương thức getStacktrace() với một số chữ ký bị ghi đè. Phải mất một trường hợp Throwable và cho phép để thiết lập một tiền tố gói của các gói có liên quan.Hãy nói rằng mã của công ty của bạn luôn luôn nằm trong gói đó bắt đầu với "com.plain. *" Vì vậy, bạn thiết lập một tiền tố đó và làm điều này
logger.info(TextUtils.getStacktrace(e, true, "com.plain."));
này sẽ lọc ra rất thông minh tất cả các phần vô dụng của các dấu vết để lại bạn với stacktrace rất súc tích. Ngoài ra tôi thấy nó rất thuận để đặt trước tiền tố và sau đó chỉ cần sử dụng phương pháp convinience
TextUtils.getStacktrace(e);
Nó sẽ làm như vậy. Để cài sẵn tiền tố chỉ cần sử dụng phương pháp
setRelevantPackage("com.plain.");
Ngoài ra nếu bạn sử dụng môi trường mùa xuân bạn có thể thêm các phân đoạn sau để cấu hình mùa xuân của bạn và sau đó bạn tất cả các thiết lập:
<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>
Thư viện đi kèm với cũng bằng văn bản (Tôi hy vọng) Javadoc giải thích mọi thứ một cách chi tiết. Nhưng đây là một lời trêu ghẹo nhỏ: bạn sẽ nhận được một stacktrace sau:
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()
thay vì
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()
Nguồn
2016-01-17 19:27:24
Có, "theo dõi ngăn xếp từ địa ngục" theo Cay Horstmann: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –