问题
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"> <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"> <evaluator> <expression><![CDATA[return marker.contains("cf");]]></expression> </evaluator> <OnMismatch>DENY</OnMismatch> <OnMatch>NEUTRAL</OnMatch> </filter> </appender>
|
通过marker可以对日志进行分类,然后统一输出到一个文件,方便使用处理。例如:进行统计分析。