如何在Log4j2中过滤匹配特定正则的堆栈跟踪行?
解决Log4j2过滤堆栈跟踪中CGLIB代理类行的问题
你之前使用的RegexFilter仅作用于日志消息主体,无法处理堆栈跟踪内的行。要过滤栈帧中含$$的CGLIB代理类行,可采用以下两种方案:
方案一:使用Log4j2内置RegexStackTraceFilter
Log4j2提供了专门针对堆栈跟踪元素的RegexStackTraceFilter,可直接匹配栈元素的类名或方法名。在布局配置中指定该过滤器即可:
XML配置示例
<Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%xEx{filters(org.apache.logging.log4j.core.filter.RegexStackTraceFilter)}{regex=.*\\$\\$.*}{onMatch=DENY}{onMismatch=ACCEPT}"/> </Console> </Appenders>
YAML配置示例
Appenders: Console: name: Console target: SYSTEM_OUT PatternLayout: pattern: "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%xEx{filters(org.apache.logging.log4j.core.filter.RegexStackTraceFilter)}{regex=.*\\$\\$.*}{onMatch=DENY}{onMismatch=ACCEPT}"
该配置会让%xEx转换符渲染堆栈跟踪时,自动过滤掉类名包含$$的栈帧行。
方案二:自定义StackTraceElementFilter
若内置过滤器无法满足需求,可自定义过滤器类,实现org.apache.logging.log4j.core.filter.StackTraceElementFilter接口:
import org.apache.logging.log4j.core.filter.StackTraceElementFilter; import java.util.function.Predicate; public class CglibProxyStackTraceFilter implements StackTraceElementFilter { @Override public Predicate<StackTraceElement> getFilter() { // 过滤类名包含$$的栈元素 return element -> !element.getClassName().contains("$$"); } }
随后在布局配置中引用该自定义过滤器:
XML配置示例
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%xEx{filters(com.myapp.filter.CglibProxyStackTraceFilter)}"/>
YAML配置示例
Appenders: Console: name: Console target: SYSTEM_OUT PatternLayout: pattern: "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%xEx{filters(com.myapp.filter.CglibProxyStackTraceFilter)}"
通过上述配置,即可精准过滤Spring CGLIB生成的代理类栈帧行,同时保留其余有用的堆栈信息。
内容的提问来源于stack exchange,提问作者Flavian-Calinic Stuparu
相关产品推荐
相关产品推荐

