log4j2-RoutingAppender

RoutingAppender

RoutingAppender对LogEvents求值,然后将它们路由到一个从属Appender。目标Appender可以是之前配置的Appender,可以通过其名称进行引用,也可以根据需要动态创建Appender。RoutingAppender应该配置在它引用的appender之后,以允许它正确地关闭。

你也可以用脚本配置RoutingAppender:你可以在appender启动时运行脚本,也可以在为日志事件选择路由时运行脚本。

RoutingAppender Parameters

Parameter NameTypeDescription
FilterFilter

A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.

一个过滤器,用于确定事件是否应该由这个Appender处理。使用CompositeFilter可以使用多个过滤器。

nameStringAppender的名称
RewritePolicyRewritePolicy

The RewritePolicy that will manipulate the LogEvent.

操作LogEvent的重写策略。

RoutesRoutes

Contains one or more Route declarations to identify the criteria for choosing Appenders.

包含一个或多个路由声明,以标识选择追加器的标准

ScriptScript

This Script runs when Log4j starts the RoutingAppender and returns a String Route key to determine the default Route.

This script is passed the following variables:

RoutingAppender Script Parameters
Parameter NameTypeDescription
configurationConfigurationThe active Configuration.
staticVariablesMapA Map shared between all script invocations for this appender instance. This is the same map passed to the Routes Script.
ignoreExceptionsboolean

The default is true, causing exceptions encountered while appending events to be internally logged and then ignored. When set to false exceptions will be propagated to the caller, instead. You must set this to false when wrapping this Appender in a FailoverAppender.


默认值为true,追加事件时引发的异常在内部被记录,然后忽略。当设置为false时,异常将传播到调用者。当在FailoverAppender中包装这个Appender时,必须将其设置为false。

在本例中,脚本将“ServiceWindows”路由设置为Windows上的默认路由,并将“ServiceOther”路由设置为所有其他操作系统上的默认路由。注意, List Appender是我们的测试Appender之一,任何Appender都可以使用,它只是用作简写。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" name="RoutingTest">
  <Appenders>
    <Routing name="Routing">
      <Script name="RoutingInit" language="JavaScript"><![CDATA[
        java.lang.System.getProperty("os.name").search("Windows") > -1 ? "ServiceWindows" : "ServiceOther";]]>
      </Script>
      <Routes>
        <Route key="ServiceOther">
          <List name="List1" />
        </Route>
        <Route key="ServiceWindows">
          <List name="List2" />
        </Route>
      </Routes>
    </Routing>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Routing" />
    </Root>
  </Loggers>
</Configuration>

Routes

Routes元素接受一个名为"pattern"的属性pattern根据所有注册的Lookups进行评估结果用于选择路由。每个Route都可以配置一个key。如果key与pattern的计算结果匹配,则选择该Route。如果路由上没有指定key,则该路由为默认路由。只能配置一条路由为缺省路由。

Routes元素可以包含一个Script子元素。如果指定,脚本将针对每个日志事件运行,并返回要使用的字符串Route key。

必须指定pattern属性或Script元素,但不能同时指定两者。

每个路由都必须引用一个Appender。如果路由包含ref属性,那么Route将引用配置中定义的Appender。如果路由包含一个Appender定义,那么一个Appender将在RoutingAppender的上下文中创建,并且每次通过Route引用匹配的Appender名称时都会重复使用

脚本传递以下变量:

RoutingAppender Routes Script Parameters

Parameter NameTypeDescription
configurationConfigurationThe active Configuration.
staticVariablesMapA Map shared between all script invocations for this appender instance. This is the same map passed to the Routes Script.
logEventLogEventThe log event.

在这个例子中,脚本针对每个日志事件运行,并根据名为“AUDIT”的标记选择路由。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" name="RoutingTest">
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT" />
    <Flume name="AuditLogger" compress="true">
      <Agent host="192.168.10.101" port="8800"/>
      <Agent host="192.168.10.102" port="8800"/>
      <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
    </Flume>
    <Routing name="Routing">
      <Routes>
        <Script name="RoutingInit" language="JavaScript"><![CDATA[
          if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("AUDIT")) {
                return "AUDIT";
            } else if (logEvent.getContextMap().containsKey("UserId")) {
                return logEvent.getContextMap().get("UserId");
            }
            return "STDOUT";]]>
        </Script>
        <Route>
          <RollingFile
              name="Rolling-${mdc:UserId}"
              fileName="${mdc:UserId}.log"
              filePattern="${mdc:UserId}.%i.log.gz">
            <PatternLayout>
              <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <SizeBasedTriggeringPolicy size="500" />
          </RollingFile>
        </Route>
        <Route ref="AuditLogger" key="AUDIT"/>
        <Route ref="STDOUT" key="STDOUT"/>
      </Routes>
      <IdlePurgePolicy timeToLive="15" timeUnit="minutes"/>
    </Routing>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Routing" />
    </Root>
  </Loggers>
</Configuration>

Purge Policy

RoutingAppender可以配置一个PurgePolicy,其目的是停止并移除RoutingAppender动态创建的休眠appender。Log4j目前提供了IdlePurgePolicy作为清理appender的唯一可用的PurgePolicy。IdlePurgePolicy接受2个属性;timeolive是在没有任何事件发送给Appender的情况下,Appender可以存活的时间单位数,timeUnit是java.util.concurrent.TimeUnit的字符串表示形式,用于timeolive属性。

下面是一个示例配置,它使用RoutingAppender将所有审计事件路由到FlumeAppender,而所有其他事件将路由到RollingFileAppender,该RollingFileAppender只捕获特定的事件类型。注意,AuditAppender是预定义的,而RollingFileAppenders是根据需要创建的。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp">
  <Appenders>
    <Flume name="AuditLogger" compress="true">
      <Agent host="192.168.10.101" port="8800"/>
      <Agent host="192.168.10.102" port="8800"/>
      <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
    </Flume>
    <Routing name="Routing">
      <Routes pattern="$${sd:type}">
        <Route>
          <RollingFile name="Rolling-${sd:type}" fileName="${sd:type}.log"
                       filePattern="${sd:type}.%i.log.gz">
            <PatternLayout>
              <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <SizeBasedTriggeringPolicy size="500" />
          </RollingFile>
        </Route>
        <Route ref="AuditLogger" key="Audit"/>
      </Routes>
      <IdlePurgePolicy timeToLive="15" timeUnit="minutes"/>
    </Routing>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Routing"/>
    </Root>
  </Loggers>
</Configuration>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心六神通

你的鼓励是我持续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值