匹配过滤器后可以修改日志事件吗?
我有一个Web容器(Jersey),可以在ERROR级别记录未捕获的异常。但是,对于服务器(Jetty)抛出的某些异常(EofException),我想将它们记录在较低级别(INFO)。
我可以使用与异常类型(EofException)匹配的Logback过滤器完全删除这些消息。但我没有找到一种受支持的方法来修改日志事件,例如,更改日志级别。
答案 0 :(得分:15)
您可以使用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"));
}
}