我实际上编写了一个开源库 MgntUtils(可在 Github 和 maven central 获得)
包含几个实用程序。这是关于图书馆文章的链接:MgntUtils Open Source Java library。其中一个实用程序是通用堆栈跟踪
我广泛使用并发现它非常有用的过滤器。该类被称为
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>
该库附带写得很好(我希望)Javadoc,它详细解释了所有内容。但这里有一个小插曲:您将获得以下堆栈跟踪:
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()