我想使用 log4j 从堆栈跟踪中过滤掉某些行(如
net.sf.cglib.*
和 org.springframework.*
)。可以用log4j
来配置吗?
在 Eclipse 中,junit 插件允许您添加过滤器来修改 junit 选项卡中显示的堆栈跟踪,但这不会更改输出到控制台的堆栈跟踪。
使用此过滤布局 log4j 插件: http://www.openmindlab.com/lab/tools/openutilslog4j/layout.html
他们在该页面上有一个带有 log4j.xml 的示例。只需使用 it.openutils.log4j.FilteredPatternLayout 而不是 log4j PatternLayout,然后放置一些条目,如
<param name="Filter" value="net.sf.cglib"/>
<param name="Filter" value="org.springframework"/>
如下。
将此内容发布给未来使用 log4j2 的观众,他们可能会想知道这一点。 (在撰写本文时我正在使用 log4j2 v2.20.0)
要从堆栈跟踪中过滤某些包,您需要指定包列表,并在模式中使用
%xEx{filters(${filters})}
指令来指定要过滤的行:
<Configuration>
<Properties>
<Property name="STACKTRACE_EXCLUDE">
java.base,
java.lang,
javax.servlet,
jdk.internal,
org.apache,
org.springframework,
</Property>
<Property name="LOG_PATTERN">
%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=green, DEBUG=green bold, TRACE=blue} %style{${sys:PID}}{magenta} [%15.15t][%X{dd.trace_id}][%X{dd.span_id}] %style{%-40.40C{1.}}{cyan} : %m%xEx{filters(${STACKTRACE_EXCLUDE})}%n
</Property>
</Properties>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.mongodb.driver" level="warn"/>
<Root level="info">
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>
添加后,您应该看到堆栈跟踪开始如下所示:
java.lang.RuntimeException: oh no test exception
at com.company.controller.MyController.doGet(MyController.java:262) [classes/:?]
at com.company.controller.MyController$$FastClassBySpringCGLIB$$d73ec01b.invoke(<generated>) [classes/:?]
... suppressed 11 lines
at com.company.controller.MyController$$EnhancerBySpringCGLIB$$3de58f01.doGet(<generated>) [classes/:?]
... suppressed 85 lines