看Filters如何玩转日志

本文详细介绍了Log4j2中Filter的配置与使用,包括BurstFilter、DynamicThresholdFilter、CompositeFilter、RegexFilter、TimeFilter及ScriptFilter等。通过实例展示了如何控制日志输出频率、动态调整日志级别、组合多种过滤条件、基于正则表达式过滤以及自定义脚本过滤。

#前言

前面一篇博客(《繁华浮尘,倾听Appenders的故事?》)讲到的各种Appender的配置以及使用,当然还有些未写全,更多的可以去查阅官网的资料。本篇博客讲介绍各种的Filter的配置以及相应使用,Filter可以配置在全局中,可以配置在Appender或者Appender Reference中,亦可配置在Logger中,达到控制过滤不同的日志模块信息;利用这些Filter可以实现控制日志的输出、动态控制日志的级别甚至使用脚本过滤器自己实现更为复杂的过滤控制。

Filter执行时会调用其中的一个方法并返回一个结果,该结果是一个枚举,包含:ACCEPT, DENY或者NEUTRAL。Filter可以配置在如下四个作用域:

  1. 全局范围,即直接配置在configuration最外层:该作用域的Filter直接过滤日志信息而不传递至Logger做进一步处理;若配置多个全局filter,则有且仅有一个起效,同时logger定义的level也将失效(若filter中配置了level);Logger 和 Appender的filter将覆盖全局的filter;
  2. Logger范围: 配置在某个具体的Logger中,该filter不会传递至父级的Logger中,即使additivity配置为true;
  3. Appender范围:作用于Appender是否处理日志过滤操作;
  4. Appender Reference 范围:作用于Logger路由该过滤操作至某个appender上

#BurstFilter

BurstFilter用于控制每秒打印日志的数量以及设置每秒打印数量的上限; ####配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <BurstFilter level="INFO" rate="16" maxBurst="100"/>
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

#DynamicThresholdFilter

DynamicThresholdFilter用于动态控制日志的级别,有时在线上排查问题的时候,希望看到更多的日志信息来排查问题,这个filter就可以实现在不重启服务的情况下,动态去更改日志的输出级别。具体的实现方案是:新建zk node节点存放动态日志的信息并监听该节点,在log4j的配置文件中配置DynamicThresholdFilter,通过filter或者aspect设置MDC的key-value值(对应好DynamicThresholdFilter的KeyValuePair); ####配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <DynamicThresholdFilter key="loginId" defaultThreshold="ERROR"
                      onMatch="ACCEPT" onMismatch="NEUTRAL">
    <KeyValuePair key="User1" value="DEBUG"/>
  </DynamicThresholdFilter>
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <BurstFilter level="INFO" rate="16" maxBurst="100"/>
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

#CompositeFilter

若需要执行多条filter,则可以使用filters标签,配置多个filter; ####配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Filters>
    <Marker marker="EVENT" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
    <DynamicThresholdFilter key="loginId" defaultThreshold="ERROR"
                        onMatch="ACCEPT" onMismatch="NEUTRAL">
      <KeyValuePair key="User1" value="DEBUG"/>
    </DynamicThresholdFilter>
  </Filters>
  <Appenders>
    <File name="Audit" fileName="logs/audit.log">
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
    </File>
    <RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <BurstFilter level="INFO" rate="16" maxBurst="100"/>
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
  </Appenders>
  <Loggers>
    <Logger name="EventLogger" level="info">
      <AppenderRef ref="Audit"/>
    </Logger>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

#RegexFilter

RegexFilter可以实现对匹配相应的正则的日志信息做过滤,比如:选择符合正则的日志信息做格式化,其它的则过滤; ####配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <RegexFilter regex=".* test .*" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

#TimeFilter

TimeFilter可以对日志打印的时间做过滤,比如:限制在早上8:00至12:00; ####配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <TimeFilter start="08:00:00" end="12:00:00" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
   </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

#ScriptFilter

如果需要实现自定义的动能,可以通过写脚本,然后配置Script执行过滤; ####配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR">
  <Scripts>
    <ScriptFile name="filter.js" language="JavaScript" path="src/test/resources/scripts/filter.js" charset="UTF-8" />
    <ScriptFile name="filter.groovy" language="groovy" path="src/test/resources/scripts/filter.groovy" charset="UTF-8" />
  </Scripts>
  <Appenders>
    <List name="List">
      <PatternLayout pattern="[%-5level] %c{1.} %msg%n"/>
    </List>
  </Appenders>
  <Loggers>
    <Logger name="TestJavaScriptFilter" level="trace" additivity="false">
      <AppenderRef ref="List">
        <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY">
          <ScriptRef ref="filter.js" />
        </ScriptFilter>
      </AppenderRef>
    </Logger>
    <Logger name="TestGroovyFilter" level="trace" additivity="false">
      <AppenderRef ref="List">
        <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY">
          <ScriptRef ref="filter.groovy" />
        </ScriptFilter>
      </AppenderRef>
    </Logger>
    <Root level="trace">
      <AppenderRef ref="List" />
    </Root>
  </Loggers>
</Configuration>

#后记

关于其他的配置,比如 layouts的格式配置等可以去查官网的信息,就不做介绍了,log4j2的相关配置到这里就结束了。后面有时间会去探究下log4j2相应的架构以及内部的实现机制,看看log4j2的AsynLogger为何性能这么好,有兴趣的可以持续关注,一块交流学习~

转载于:https://my.oschina.net/LovingIT/blog/777518

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值