过滤器

过滤器允许评估日志事件以确定是否或如何发布它们。过滤器将在其一个过滤器方法上被调用,并将返回一个结果,该结果是一个枚举,具有 3 个值之一 - ACCEPT、DENY 或 NEUTRAL。

过滤器可以在以下四个位置之一进行配置

  1. 上下文范围的过滤器直接在配置中配置。被这些过滤器拒绝的事件将不会传递给记录器以进行进一步处理。一旦事件被上下文范围的过滤器接受,它将不会被任何其他上下文范围的过滤器评估,也不会使用记录器的级别来过滤事件。但是,事件将被记录器和附加器过滤器评估。
  2. 记录器过滤器在指定的记录器上配置。这些在上下文范围的过滤器和记录器的日志级别之后进行评估。被这些过滤器拒绝的事件将被丢弃,并且事件将不会传递给父记录器,无论 additivity 设置如何。
  3. 附加器过滤器用于确定特定附加器是否应该处理事件的格式化和发布。
  4. 附加器引用过滤器用于确定记录器是否应该将事件路由到附加器。

BurstFilter

BurstFilter 提供了一种机制来控制 LogEvents 被处理的速率,通过在达到最大限制后静默丢弃事件。

突发过滤器参数
参数名称 类型 描述
level 字符串 要过滤的消息的级别。如果 maxBurst 已被超过,则任何低于或等于此级别的消息都将被过滤掉。默认值为 WARN,这意味着任何高于警告的消息都将被记录,无论突发的规模如何。
rate 浮点数 允许的每秒平均事件数。
maxBurst 整数 在事件被过滤以超过平均速率之前可以发生的事件的最大数量。默认值为速率的 10 倍。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

包含 BurstFilter 的配置可能如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <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

CompositeFilter 提供了一种指定多个过滤器的方法。它作为 filters 元素添加到配置中,并包含要评估的其他过滤器。filters 元素不接受任何参数。

包含 CompositeFilter 的配置可能如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <Filters>
    <MarkerFilter 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>

DynamicThresholdFilter

DynamicThresholdFilter 允许根据特定属性按日志级别进行过滤。例如,如果用户登录 ID 被捕获在 ThreadContext 映射中,那么可以仅为该用户启用调试日志记录。如果日志事件不包含指定的 ThreadContext 项目,则将返回 NEUTRAL。

动态阈值过滤器参数
参数名称 类型 描述
key 字符串 要比较的 ThreadContext 映射中项目的名称。
defaultThreshold 字符串 要过滤的消息的级别。默认阈值仅在日志事件包含指定的 ThreadContext 映射项目且其值与键值对中的任何键不匹配时才适用。
keyValuePair KeyValuePair[] 一个或多个 KeyValuePair 元素,定义键的匹配值以及键匹配时要评估的级别。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

以下是一个包含 DynamicThresholdFilter 的示例配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" >
  <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>

LevelRangeFilter

LevelRangeFilter 允许根据级别范围进行过滤,其中级别通过其关联的整数值进行比较;OFF 的整数值为 0,FATAL 为 100,ERROR 为 200,依此类推。

映射过滤器参数
参数名称 类型 描述
minLevel 级别 最小级别阈值(默认为 OFF,其整数值为 0)
maxLevel 级别 最大级别阈值(默认为 ALL,其整数值为 Integer.MAX_VALUE
onMatch Filter.Result 匹配时要返回的结果,允许的值为 ACCEPTDENYNEUTRAL(默认)
onMismatch Filter.Result 不匹配时要返回的结果,允许的值为 ACCEPTDENY(默认)或 NEUTRAL

在以下示例配置中,LevelRangeFilter 的配置中 maxLevel 设置为 INFO。对于整数值高于 INFO 的级别日志事件,过滤器将返回 onMismatch 结果(即 DENY,默认值);即 DEBUGTRACE 等。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" name="MyApp">
  <Appenders>
    <Console name="STDOUT">
      <LevelRangeFilter maxLevel="INFO"/>
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="ERROR">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>

MapFilter

MapFilter 允许根据 MapMessage 中的数据元素进行过滤。

映射过滤器参数
参数名称 类型 描述
keyValuePair KeyValuePair[] 一个或多个 KeyValuePair 元素,定义映射中的键以及要匹配的值。如果同一个键被指定多次,那么对该键的检查将自动变为“或”,因为映射只能包含一个值。
operator 字符串 如果运算符为“或”,则任何一个键值对的匹配都将被视为匹配,否则所有键值对都必须匹配。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

如本配置所示,MapFilter 可用于记录特定事件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <MapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
    <KeyValuePair key="eventId" value="Login"/>
    <KeyValuePair key="eventId" value="Logout"/>
  </MapFilter>
  <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>

此示例配置将表现出与前面示例相同的行为,因为配置的唯一记录器是根记录器。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <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">
      <MapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
        <KeyValuePair key="eventId" value="Login"/>
        <KeyValuePair key="eventId" value="Logout"/>
      </MapFilter>
      <AppenderRef ref="RollingFile">
      </AppenderRef>
    </Root>
  </Loggers>
</Configuration>

此第三个示例配置将表现出与前面示例相同的行为,因为配置的唯一记录器是根记录器,并且根记录器仅配置了一个附加器引用。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <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">
        <MapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
          <KeyValuePair key="eventId" value="Login"/>
          <KeyValuePair key="eventId" value="Logout"/>
        </MapFilter>
      </AppenderRef>
    </Root>
  </Loggers>
</Configuration>

MarkerFilter

MarkerFilter 将配置的标记值与 LogEvent 中包含的标记进行比较。当标记名称与 Log Event 的标记或其父标记之一匹配时,就会发生匹配。

标记过滤器参数
参数名称 类型 描述
marker 字符串 要比较的标记的名称。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

仅在标记匹配时才允许事件由附加器写入的示例配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <MarkerFilter marker="FLOW" 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>

MutableThreadContextMapFilter(或 MutableContextMapFilter)

MutableThreadContextMapFilter 或 MutableContextMapFilter 允许根据当前上下文中的数据元素进行过滤。默认情况下,这是 ThreadContext 映射。要比较的值是在外部定义的,并且可以定期轮询以查看是否有更改。

可变上下文映射过滤器参数
参数名称 类型 描述
configLocation 字符串 指向配置的文件路径或 URI。有关示例配置,请参见下文。
pollInterval int 检查配置是否已修改之前要等待的秒数。使用 HTTP 或 HTTPS 时,服务器必须支持 If-Modified-Since 标头并返回一个 Last-Modified 标头,其中包含文件上次修改的日期和时间。请注意,默认情况下,仅允许 https、file 和 jar 协议。可以通过在 log4j2.Configuration.allowedProtocols 系统属性中指定它们来启用对其他协议的支持
operator 字符串 如果运算符为“或”,则任何一个键值对的匹配都将被视为匹配,否则所有键值对都必须匹配。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

包含 MutableContextMapFilter 的配置可能如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <MutableContextMapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or"
    configLocation="http://localhost:8080/threadContextFilter.json" pollInterval="300">
  </MutableContextMapFilter>
  <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>

提供给过滤器的配置文件应类似于

<?xml version="1.0" encoding="UTF-8"?>
{
  "configs": {
    "loginId": ["[email protected]", "[email protected]"],
    "accountNumber": ["30510263"]
  }
}
  

NoMarkerFilter

NoMarkerFilter 检查 LogEvent 中是否包含标记。当 Log Event 中没有标记时,就会发生匹配。

无标记过滤器参数
参数名称 类型 描述
onMatch string 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch string 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

仅当没有标记时,此示例配置才允许追加器写入事件。

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

RegexFilter

RegexFilter 允许将格式化或未格式化的消息与正则表达式进行比较。

Regex 过滤器参数
参数名称 类型 描述
regex 字符串 正则表达式。
useRawMsg 布尔值 如果为 true,则使用未格式化的消息,否则使用格式化的消息。默认值为 false。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

此示例配置仅在事件包含“test”一词时才允许追加器写入事件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <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>

Script

ScriptFilter 执行返回 true 或 false 的脚本。

脚本过滤器参数
参数名称 类型 描述
script 脚本、脚本文件或脚本引用 指定要执行的逻辑的脚本元素。
onMatch 字符串 当脚本返回 true 时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 当过滤器返回 false 时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。
脚本参数
参数名称 类型 描述
configuration 配置 拥有此 ScriptFilter 的配置。
level 级别 与事件关联的日志记录级别。仅在配置为全局过滤器时存在。
loggerName 字符串 记录器的名称。仅在配置为全局过滤器时存在。
logEvent LogEvent 正在处理的 LogEvent。在配置为全局过滤器时不存在。
marker Marker 在日志记录调用中传递的标记(如果有)。仅在配置为全局过滤器时存在。
message 消息 与日志记录调用关联的消息。仅在配置为全局过滤器时存在。
parameters Object[] 传递给日志记录调用的参数。仅在配置为全局过滤器时存在。某些消息将参数作为消息的一部分包含在内。
throwable Throwable 传递给日志记录调用的 Throwable(如果有)。仅在配置为全局过滤器时存在。某些消息将 Throwable 作为消息的一部分包含在内。
substitutor StrSubstitutor 用于替换查找变量的 StrSubstitutor。

以下示例演示了如何声明脚本字段,然后在特定组件中引用它们。有关如何使用Script 元素直接在配置中嵌入脚本代码的示例,请参阅ScriptCondition

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

StructuredDataFilter

StructuredDataFilter 是一个 MapFilter,它还允许根据事件 ID、类型和消息进行过滤。

结构化数据过滤器参数
参数名称 类型 描述
keyValuePair KeyValuePair[] 一个或多个 KeyValuePair 元素,用于定义映射中的键和要匹配的值。“id”、“id.name”、“type”和“message”应分别用于匹配 StructuredDataId、StructuredDataId 的名称部分、类型和格式化的消息。如果同一个键被指定多次,那么对该键的检查将自动变为“或”,因为映射只能包含一个值。
operator 字符串 如果运算符为“或”,则任何一个键值对的匹配都将被视为匹配,否则所有键值对都必须匹配。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

如本配置所示,StructuredDataFilter 可用于记录特定事件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <StructuredDataFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
    <KeyValuePair key="id" value="Login"/>
    <KeyValuePair key="id" value="Logout"/>
  </StructuredDataFilter>
  <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>

ThreadContextMapFilter(或 ContextMapFilter)

ThreadContextMapFilter 或 ContextMapFilter 允许根据当前上下文中的数据元素进行过滤。默认情况下,这是 ThreadContext 映射。

上下文映射过滤器参数
参数名称 类型 描述
keyValuePair KeyValuePair[] 一个或多个 KeyValuePair 元素,定义映射中的键以及要匹配的值。如果同一个键被指定多次,那么对该键的检查将自动变为“或”,因为映射只能包含一个值。
operator 字符串 如果运算符为“或”,则任何一个键值对的匹配都将被视为匹配,否则所有键值对都必须匹配。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

包含 ContextMapFilter 的配置可能如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <ContextMapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
    <KeyValuePair key="User1" value="DEBUG"/>
    <KeyValuePair key="User2" value="WARN"/>
  </ContextMapFilter>
  <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>

ContextMapFilter 也可以应用于记录器以进行过滤。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <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"/>
      <ContextMapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
        <KeyValuePair key="foo" value="bar"/>
        <KeyValuePair key="User2" value="WARN"/>
      </ContextMapFilter>
    </Root>
  </Loggers>
</Configuration>
  

ThresholdFilter

如果 LogEvent 中的级别与配置的级别相同或更具体,则此过滤器返回 onMatch 结果,否则返回 onMismatch 值。例如,如果 ThresholdFilter 配置为 Level ERROR,而 LogEvent 包含 Level DEBUG,则将返回 onMismatch 值,因为 ERROR 事件比 DEBUG 更具体。

阈值过滤器参数
参数名称 类型 描述
level 字符串 要匹配的有效级别名称。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

此示例配置仅在级别匹配时才允许追加器写入事件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <ThresholdFilter level="TRACE" 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

时间过滤器可用于将过滤器限制在一天中的特定部分。

时间过滤器参数
参数名称 类型 描述
start 字符串 以 HH:mm:ss 格式表示的时间。
end 字符串 以 HH:mm:ss 格式表示的时间。指定小于开始时间的结束时间将导致不写入任何日志条目。
timezone 字符串 与事件时间戳进行比较时要使用的时区。
onMatch 字符串 过滤器匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 NEUTRAL。
onMismatch 字符串 过滤器不匹配时要采取的操作。可以是 ACCEPT、DENY 或 NEUTRAL。默认值为 DENY。

此示例配置仅允许追加器在每天上午 5:00 到 5:30 之间使用默认时区写入事件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
      <TimeFilter start="05:00:00" end="05:30: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>