如何设置ThresholdFilter指定级别让info日志仅输出debug与info内容
问题原因
Logback 自带的ThresholdFilter默认逻辑为放行所有级别大于等于设置阈值的日志,仅拦截低于阈值的内容。你当前将ThresholdFilter的级别设置为INFO时,WARN、ERROR级别的日志也满足≥INFO的条件会被放行,所以会和专门输出WARN、ERROR的Appender产生重复日志。
另外你贴出的代码存在逻辑错误:两个ThresholdFilter都被添加到了同一个consoleAppenderError实例上,两个过滤器的规则叠加后也会导致日志输出异常。
解决方案
你可以通过自定义过滤器的方式快速实现仅放行指定级别的日志,不需要调整ThresholdFilter的规则,代码实现更直观:
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.Filter; import ch.qos.logback.core.spi.FilterReply; // 配置负责输出DEBUG、INFO的Appender Filter<ILoggingEvent> debugInfoFilter = new Filter<ILoggingEvent>() { @Override public FilterReply decide(ILoggingEvent event) { Level level = event.getLevel(); // 仅放行DEBUG和INFO级别 if (level == Level.DEBUG || level == Level.INFO) { return FilterReply.ACCEPT; } // 其他级别直接拒绝 return FilterReply.DENY; } }; debugInfoFilter.start(); // 注意要加给对应的INFO/DEBUG专用Appender,不要加到WARN/ERROR的Appender上 consoleAppenderInfo.addFilter(debugInfoFilter); // 负责输出WARN、ERROR的Appender配置保持不变即可 ThresholdFilter consoleFilterError = new ThresholdFilter(); consoleFilterError.setLevel("WARN"); consoleFilterError.start(); consoleAppenderError.addFilter(consoleFilterError);
如果不想自定义过滤器,也可以用官方自带的LevelFilter组合实现:
// 匹配INFO级别就放行 LevelFilter infoFilter = new LevelFilter(); infoFilter.setLevel(Level.INFO); infoFilter.setOnMatch(FilterReply.ACCEPT); infoFilter.setOnMismatch(FilterReply.NEUTRAL); infoFilter.start(); consoleAppenderInfo.addFilter(infoFilter); // 匹配DEBUG级别就放行 LevelFilter debugFilter = new LevelFilter(); debugFilter.setLevel(Level.DEBUG); debugFilter.setOnMatch(FilterReply.ACCEPT); debugFilter.setOnMismatch(FilterReply.NEUTRAL); debugFilter.start(); consoleAppenderInfo.addFilter(debugFilter); // 兜底:所有其他级别直接拒绝 Filter<ILoggingEvent> denyAllFilter = new Filter<ILoggingEvent>() { @Override public FilterReply decide(ILoggingEvent event) { return FilterReply.DENY; } }; denyAllFilter.start(); consoleAppenderInfo.addFilter(denyAllFilter);
内容的提问来源于stack exchange,提问作者gal leshem
相关产品推荐
相关产品推荐

