logback过滤日志

问题

logback通过配置日志level可以关闭指定class或者package输出的日志。那么,有没有办法只过滤满足某些特征的部分日志,而不是全关呢?

方法

Logback用户手册 Chapter 7: Filters

  • 普通类型的Filter都通过添加到Appender来对日志进行过滤。
  • TurboFilter绑定到logging context,所以可以对所有的log事件进行过滤,它的处理范围更广。

本文主要介绍普通类型的Filter使用。

按日志级别过滤

1
2
3
4
5
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>

按内容进行过滤

dubbo的ZookeeperRegistry会info输出订阅provider的更新信息,若想过滤掉这个日志不输出,可以这么配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<appender name="RF" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<!-- defaults to type JaninoEventEvaluator -->
<evaluator>
<expression><![CDATA[return level>=INFO
&& logger.startsWith("org.apache.dubbo.registry.zookeeper.ZookeeperRegistry")
&& message.contains("[DUBBO] Notify urls for subscribe url");
]]>
</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
</appender>

按marker进行过滤

日志输出方式:

1
2
3
4
5
6
7
8
public class LogDemo {
static final Marker CF = MarkerFactory.getMarker("cf");
static final Logger logger = LoggerFactory.getLogger(LogDemo.class);

public void doSmth(){
logger.info(CF, "hello logback");
}
}

对所有符合 marker=cf 的日志,在appender=RFbyCF 中统一输出:

1
2
3
4
5
6
7
8
9
10
<appender name="RFbyCF" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<!-- defaults to type JaninoEventEvaluator -->
<evaluator>
<expression><![CDATA[return marker.contains("cf");]]></expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>NEUTRAL</OnMatch>
</filter>
</appender>

通过marker可以对日志进行分类,然后统一输出到一个文件,方便使用处理。例如:进行统计分析。