看Filters如何玩轉日誌

#前言node

前面一篇博客(《繁華浮塵,傾聽Appenders的故事?》)講到的各類Appender的配置以及使用,固然還有些未寫全,更多的能夠去查閱官網的資料。本篇博客講介紹各類的Filter的配置以及相應使用,Filter能夠配置在全局中,能夠配置在Appender或者Appender Reference中,亦可配置在Logger中,達到控制過濾不一樣的日誌模塊信息;利用這些Filter能夠實現控制日誌的輸出、動態控制日誌的級別甚至使用腳本過濾器本身實現更爲複雜的過濾控制。架構

Filter執行時會調用其中的一個方法並返回一個結果,該結果是一個枚舉,包含:ACCEPT, DENY或者NEUTRAL。Filter能夠配置在以下四個做用域:app

  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.net

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>

#CompositeFiltercode

若須要執行多條filter,則可使用filters標籤,配置多個filter; ####配置示例xml

<?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>

#RegexFilterblog

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爲什麼性能這麼好,有興趣的能夠持續關注,一塊交流學習~

相關文章
相關標籤/搜索