Java 基于条件截断记录器中异常的堆栈跟踪

Java 基于条件截断记录器中异常的堆栈跟踪,java,exception,logging,logback,slf4j,Java,Exception,Logging,Logback,Slf4j,我使用slf4j在控制台和自定义文件中记录自定义异常及其堆栈跟踪。我遇到了一种情况,我必须截断一些非关键异常的堆栈跟踪 使用,我在我的logback.xml文件中添加了以下配置 <evaluator name="DISPLAY_EX_EVAL"> <expression>throwable != null &amp;&amp; throwable instanceof com.abc.NonCriticalException</express

我使用
slf4j
在控制台和自定义文件中记录自定义异常及其堆栈跟踪。我遇到了一种情况,我必须截断一些非关键异常的堆栈跟踪

使用,我在我的
logback.xml
文件中添加了以下配置

<evaluator name="DISPLAY_EX_EVAL">
    <expression>throwable != null &amp;&amp; throwable instanceof com.abc.NonCriticalException</expression>
    </evaluator>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-30(%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]) %-5level
                %logger{150} -%msg%n%ex{full, DISPLAY_EX_EVAL}
            </pattern>
        </encoder>
    </appender>

可扔掉的!=空&空&;com.abc.NonCriticalException的可丢弃实例
%-30(%d{yyyy-MM-dd HH:MM:ss.SSS}[%thread])%-5级
%记录器{150}-%msg%n%ex{full,DISPLAY_ex_EVAL}
但是,上述配置会在记录配置的异常期间删除所有堆栈跟踪。有没有办法记录匹配异常的截断堆栈跟踪(1行或2行)?

但为什么要截断堆栈跟踪?为什么不记录完整的堆栈跟踪呢。毕竟,这是重要而有用的信息。对吧?


我想你是在想你必须这么做。这是一个错误。您应该只记录异常的堆栈跟踪,这些异常指示被调用代码中存在bug(意外异常)。当然,您的程序记录这些堆栈跟踪是不常见的,当它记录这些堆栈跟踪时,您将需要完整的堆栈跟踪来帮助您调试问题。

有一个开源库(由我编写)提供智能堆栈跟踪过滤。我在自己的项目中使用它,效果非常好。以下是关于库的文章:。具体查找段落“堆栈跟踪噪声过滤器”。基本上,它根据您感兴趣的包前缀过滤stacktrace。您可以在上找到该库(包括源代码和javadoc)。这是。这里有一个例子。假设您的代码位于包“
com.plain.*
”中。因此,如果将前缀设置为“
com.plain.
”,则原始堆栈跟踪:

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()
将替换为:

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()

该实用程序可以很好地处理整个stacktrace,包括“由”和“抑制”部分,还可以动态地(从异常本身)或从包含原始stacktrace的字符串进行过滤。这对你来说还是个问题吗?让我看看我是否理解您的问题:在控制台上,您希望堆栈跟踪消息被截断,但仍然希望它们完全记录到文件中。这是正确的吗?请看一下我关于日志记录的另一个答案。也许它对你有任何帮助。我不太明白你的问题,虽然。。。