evaluatorfilter 可基于 groovy 表达式精准过滤日志中的特定异常,前提是 logger 显式记录带 throwable 的日志(如 error("msg", e)),再通过 event.getthrowableproxy() 获取异常类名、消息或遍历异常链进行匹配。

在 Logback 中,EvaluatorFilter 可以基于自定义 Groovy 表达式对日志事件进行过滤,包括判断异常类型。当你用 throw new XxxException() 抛出异常时,Logback 的 LoggingEvent 会携带该异常对象(即 event.getThrowableProxy()),我们正是利用这一点来精准过滤特定异常。
确认异常是否被记录到日志事件中
Logback 默认只在调用 logger.error("msg", e) 或 logger.warn("msg", e) 等带 Throwable 参数的方法时,才会将异常附加到日志事件里。单纯 throw 不会自动打日志 —— 必须配合 logger 记录操作,否则 EvaluatorFilter 无法获取异常信息。
- ✅ 正确:
logger.error("业务失败", new IllegalArgumentException("参数非法")); - ❌ 无效:
throw new IllegalArgumentException("参数非法");(没记录日志,Filter 无从过滤)
配置 EvaluatorFilter 匹配特定异常类名
在 logback.xml 中使用 EvaluatorFilter,通过 Groovy 表达式检查 event.getThrowableProxy().className 是否匹配目标异常全限定名:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"><evaluator class="ch.qos.logback.core.boolex.GroovyEvaluator"><expression>
def t = event.throwableProxy
t != null && t.className == 'java.lang.IllegalArgumentException'
</expression></evaluator><onmatch>DENY</onmatch><onmismatch>NEUTRAL</onmismatch></filter>
注意:t.className 返回的是类似 "java.lang.IllegalArgumentException" 的字符串,需严格匹配(含包名)。若要支持子类,可用 t.fullClassName.startsWith("com.example.MyBizException") 或借助 event.getThrowableProxy().getThrowable().getClass().isAssignableFrom(...)(但需确保 Throwable 已加载,且 Groovy 环境允许反射)。
过滤带特定消息的异常实例
如果想进一步按异常消息内容过滤(例如屏蔽 “用户未登录” 类型的 SecurityException),可在 Groovy 表达式中访问 throwable.message:
<expression>
def t = event.throwableProxy
t != null &&
t.className == 'com.example.SecurityException' &&
t.message != null &&
t.message.contains('用户未登录')
</expression>
⚠️ 注意:t.message 是 ThrowableProxy 封装的字符串,已做安全处理;若原始异常 message 为 null,t.message 也为 null,需判空避免 NPE。
替代方案:用 ThrowableProxy 判断异常链
某些异常是包装异常(如 ExecutionException 包裹 TimeoutException),此时仅检查顶层异常可能不够。可通过 t.cause 向下遍历异常链:
<expression>
def t = event.throwableProxy
if (t == null) return false
def current = t
while (current != null) {
if (current.className == 'java.util.concurrent.TimeoutException') return true
current = current.cause
}
return false
</expression>
该逻辑返回 true 表示匹配,配合 <onmatch>DENY</onmatch> 即可屏蔽整个异常链中的目标异常。
不复杂但容易忽略:EvaluatorFilter 生效的前提是日志语句显式传入了异常对象,且 Groovy 表达式中对 throwableProxy 的访问要严谨判空和类型。只要结构清晰、路径准确,就能稳定拦截指定异常日志。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











