Logback:通过filter修改消息?

匹配filter后可以修改日志事件吗?

我有一个Web容器(Jersey),它在ERROR级别记录未捕获的exception。 但是,对于服务器(Jetty)抛出的某些exception(EofException),我想将它们记录在较低级别(INFO)。

我可以使用与exception类型(EofException)匹配的Logbackfilter完全删除这些消息。 但是我没有找到一种支持的方法来修改日志事件,例如,更改日志级别。

您可以使用TurboFilter模拟此行为,方法是使用提供的记录器记录您自己的已修改消息,并拒绝原始记录。

不过,我不相信这种黑客行为是个好主意。

package com.example.logback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; public class LogbackTest { private static class ModifyingFilter extends TurboFilter { @Override public FilterReply decide( Marker marker, ch.qos.logback.classic.Logger logger, Level level, String format, Object[] params, Throwable t) { if (level == Level.ERROR && logger.getName().equals("com.example.logback.LogbackTest") && format.equals("Connection successful: {}")) { logger.debug(marker, format, params); return FilterReply.DENY; } return FilterReply.NEUTRAL; } } public static void main(String[] args) { LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); lc.addTurboFilter(new ModifyingFilter()); Logger logger = LoggerFactory.getLogger(LogbackTest.class); logger.error("Connection successful: {}", "no problem", new RuntimeException("Hi")); } }