printStackTrace 时过滤 StackTraceElement

wal*_*rsu 4 java

我用弹簧。我有很多具有链接依赖性的捆绑包。

mvc 包--> (调用)biz 包-->核心包-->公共包-->远程 RPC 服务

所有捆绑包都加载在同一个 JVM 中。但是mvc bundle不会直接调用biz bundle的对象,而是biz bundle通过向mvc bundle暴露一个接口来发布服务。mvc Bundle有一个代理对象,代理对象调用服务实现对象。

我的堆栈跟踪如下所示:

...
at com.mycorp.kbdatacenter.common.service.integration.nomo.NomoDataServiceClientImpl.getPropertyDistribution(NomoDataServiceClientImpl.java:64) ~[kbdatacenter-common-service-integration-1.0.0.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]
at com.mycorp.sofa.runtime.service.binding.JvmBindingAdapter$JvmServiceInvoker$1.call(JvmBindingAdapter.java:87) ~[?:?]
at com.mycorp.ambush.chain.codewrapper.CodeWrapperInvocationImpl.proceed(CodeWrapperInvocationImpl.java:77) ~[ambush-1.0.10.jar:?]
at com.mycorp.guardian.client.sofa.GuardianCodeWrapperInterceptor.invokeCodeWrapper(GuardianCodeWrapperInterceptor.java:76) ~[guardian-sofa-1.1.5.jar:?]
at com.mycorp.ambush.chain.codewrapper.CodeWrapperInvocationImpl.proceed(CodeWrapperInvocationImpl.java:71) ~[ambush-1.0.10.jar:?]
at com.mycorp.ambush.catalog.AbstractCatalog.doIntercept(AbstractCatalog.java:252) ~[ambush-1.0.10.jar:?]
at com.mycorp.ambush.api.AmbushRPCUtil.invokeClient(AmbushRPCUtil.java:79) ~[ambush-1.0.10.jar:?]
at com.mycorp.sofa.runtime.service.binding.JvmBindingAdapter$JvmServiceInvoker.doInvoke(JvmBindingAdapter.java:90) ~[?:?]
at com.mycorp.sofa.runtime.service.component.ServiceProxy.invoke(ServiceProxy.java:29) ~[?:?]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at com.sun.proxy.$Proxy91.getPropertyDistribution(Unknown Source) ~[?:?]
at com.mycorp.kbdatacenter.core.service.tag.TagDataQueryServiceImpl.queryByFilterRule(TagDataQueryServiceImpl.java:105) ~[kbdatacenter-core-service-1.0.0.jar:?]
... (119 lines more)
Run Code Online (Sandbox Code Playgroud)

我的核心包有一个代理对象nomoDataServiceClient,它调用公共包中的Impl对象。

我的问题是,是否可以过滤 StackTraceElement[],忽略包com.sun.proxysun.reflect等。我希望我的 stackstace 看起来像这样干净:

...
at com.mycorp.kbdatacenter.common.service.integration.nomo.NomoDataServiceClientImpl.getPropertyDistribution(NomoDataServiceClientImpl.java:64) ~[kbdatacenter-common-service-integration-1.0.0.jar:?]
at com.mycorp.kbdatacenter.core.service.tag.TagDataQueryServiceImpl.queryByFilterRule(TagDataQueryServiceImpl.java:105) ~[kbdatacenter-core-service-1.0.0.jar:?]
... 
Run Code Online (Sandbox Code Playgroud)

Ger*_*cke 6

是的你可以。如果捕获异常,您可以获取堆栈跟踪元素,从中创建一个新的(过滤后的)数组,并覆盖异常的堆栈跟踪,例如

try {
  //your exception throwing call here
} catch(Exception e) {
  e.setStackTrace(Arrays.stream(e.getStackTrace())
                        .filter(se -> !se.getClassName().startsWith("com.sun.proxy")) //or any other filter criteria
                        .collect(toList())
                        .toArray(new StackTraceElement[0])); //create a new stacktrace from the filtered list
  //either e.printStackStrace();
  //or rethrow
}
Run Code Online (Sandbox Code Playgroud)