RoutingAppender
RoutingAppender对LogEvents求值,然后将它们路由到一个从属Appender。目标Appender可以是之前配置的Appender,可以通过其名称进行引用,也可以根据需要动态创建Appender。RoutingAppender应该配置在它引用的appender之后,以允许它正确地关闭。
你也可以用脚本配置RoutingAppender:你可以在appender启动时运行脚本,也可以在为日志事件选择路由时运行脚本。
RoutingAppender Parameters
Parameter Name | Type | Description | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Filter | Filter | 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可以使用多个过滤器。 | |||||||||
name | String | Appender的名称 | |||||||||
RewritePolicy | RewritePolicy | The RewritePolicy that will manipulate the LogEvent. 操作LogEvent的重写策略。 | |||||||||
Routes | Routes | Contains one or more Route declarations to identify the criteria for choosing Appenders. 包含一个或多个路由声明,以标识选择追加器的标准。 | |||||||||
Script | Script | 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:
| |||||||||
ignoreExceptions | boolean | The default is |
在本例中,脚本将“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 Name | Type | Description |
---|---|---|
configuration | Configuration | The active Configuration. |
staticVariables | Map | A Map shared between all script invocations for this appender instance. This is the same map passed to the Routes Script. |
logEvent | LogEvent | The 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>