blob: 2d4b7529b6977616370716c2f0bfb198337830ed [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Log4j 2 Appenders</title>
<author email="rgoers@apache.org">Ralph Goers</author>
</properties>
<body>
<section name="Appenders">
<p>
Appenders are the component responsible for delivering LogEvents to their destination. Every Appender must
implement the <a href="../log4j2-core/apidocs/org/apache/logging/log4j/core/Appender.html">Appender</a>
interface. Most Appenders will extend
<a href="../log4j2-core/apidocs/org/apache/logging/log4j/core/appender/AppenderBase.html">AppenderBase</a>
which adds <a href="../log4j2-core/apidocs/org/apache/logging/log4j/core/Lifecycle.html">Lifecycle</a>
and <a href="../log4j2-core/apidocs/org/apache/logging/log4j/core/filter/Filterable">Filterable</a>
support. Lifecycle allows components to finish initialization after configuration has completed and to
perform cleanup during shutdown. Filterable allows the component to have Filters attached to it which are
evaluated during event processing.
</p>
<p>
Appenders usually are only responsible for writing the event data to the target destination. In most cases
they delegate responsibility for formatting the event to a <a href="../layouts.html">layout</a>. Some
appenders wrap other appenders so that they can modify the LogEvent, handle a failure in an Appender,
route the event to a subordinate Appender based on advanced Filter criteria or provide similar functionality
that does not directly format the event for viewing.
</p>
<p>
Appenders always have a name so that they can be referenced from Loggers.
</p>
<a name="ConsoleAppender"/>
<subsection name="ConsoleAppender">
<p>
As one might expect, the ConsoleAppender writes its output to either System.err or System.out with System.err
being the default target. A Layout must be provided to format the LogEvent.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent. If no layout is supplied the default pattern layout
of "%m%n" will be used.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<tr>
<td>target</td>
<td>String</td>
<td>Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is "SYSTEM_ERR".</td>
</tr>
<caption align="top">ConsoleAppender Parameters</caption>
</table>
<p>
A typical Console configuration might look like:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="STDOUT"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="FailoverAppender"/>
<subsection name="FailoverAppender">
<p>The FailoverAppender wraps a set of appenders. If the primary Appender fails the secondary appenders will be
tried in order until one succeeds or there are no more secondaries to try.</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>primary</td>
<td>String</td>
<td>The name of the primary Appender to use.</td>
</tr>
<tr>
<td>failovers</td>
<td>String[]</td>
<td>The names of the secondary Appenders to use.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<tr>
<td>target</td>
<td>String</td>
<td>Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is "SYSTEM_ERR".</td>
</tr>
<caption align="top">FailoverAppender Parameters</caption>
</table>
<p>
A Failover configuration might look like:
<source><![CDATA[<?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">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
<Failover name="Failover" primary="RollingFile" suppressExceptions="false">
<Failovers>
<appender-ref ref="Console"/>
</Failovers>
</Failover>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="Failover"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="FileAppender"/>
<subsection name="FileAppender">
<p>The FileAppender is an OutputStreamAppender that writes to the File named in the fileName parameter. The
FileAppender uses a FileManager (which extends OutputStreamManager) to actually perform the file I/O. While
FileAppenders from different Configurations cannot be shared, the FileManagers can be if the Manager is
accessible. For example, two webapps in a servlet container can have their own configuration and safely
write to the same file if Log4J is in a ClassLoader that is common to both of them.</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>append</td>
<td>boolean</td>
<td>When true - the default, records will be appended to the end of the file. When set to false,
the file will be cleared before new reocrds are written.</td>
</tr>
<tr>
<td>bufferedIO</td>
<td>boolean</td>
<td>When true - the default, records will be written to a buffer and the data will be written to
disk when the buffer is full or, if immediateFlush is set, when the record is written.
File locking cannot be used with bufferedIO. Performance tests have shown that using buffered I/O
significantly improves performance, even if immediateFlush is enabled.</td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>fileName</td>
<td>String</td>
<td>The name of the file to write to. If the file, or any of its parent directories, do not exist,
they will be created.</td>
</tr>
<tr>
<td>immediateFlush</td>
<td>boolean</td>
<td>When set to true, each write will be followed by a flush. This will guarantee the data is written
to disk but could impact performance.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent</td>
</tr>
<tr>
<td>locking</td>
<td>boolean</td>
<td>When set to true, I/O operations will occur only while the file lock is held allowing FileAppenders
in multiple JVMs and potentially multiple hosts to write to the same file simultaneously. This
will significantly impact performance so should be used carefully. Furthermore, on many systems
the file lock is "advisory" meaning that other applications can perform operations on the file
without acquiring a lock. The default value is false.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">FileAppender Parameters</caption>
</table>
<p>
Here is a sample File configuration:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="MyFile"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="FlumeAvroAppender"/>
<subsection name="FlumeAvroAppender">
<p><i>This is an optional component supplied in a separate jar.</i></p>
<p><a href="http://incubator.apache.org/projects/flume.html">Apache Flume</a> is a distributed, reliable,
and available system for efficiently collecting, aggregating, and moving large amounts of log data
from many different sources to a centralized data store. The FlumeAppender takes LogEvents and sends
them to a Flume agent as serialized Avro events for consumption.</p>
<p>
There are two versions of the Flume Appender available. The first is for "Flume OG", the original
version of Flume before it became an Apache project. The second is for "Flume NG", which is
maintained by the Apache Flume project.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>agents</td>
<td>Agent[]</td>
<td>An array of Agents to which the logging events should be sent. If more than one agent is specified
the first Agent will be the primary and subsequent Agents will be used in the order specified as
secondaries should the primary Agent fail. Each Agent definition supplies the Agents host and port.</td>
</tr>
<tr>
<td>agentRetries</td>
<td>integer</td>
<td>The number of times the agent should be retried before failing to a secondary.</td>
</tr>
<tr>
<td>batchSize</td>
<td>integer</td>
<td>Specifies the number of events that should be sent as a batch. The default is 1. <i>This
parameter only applies to the Flume NG Appender.</i></td>
</tr>
<tr>
<td>compress</td>
<td>boolean</td>
<td>When set to true the message body will be compressed using gzip</td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>eventPrefix</td>
<td>String</td>
<td>The character string to prepend to each event attribute in order to distinguish it from MDC attributes.
The default is an empty string.</td>
</tr>
<tr>
<td>flumeEventFactory</td>
<td>FlumeEventFactory</td>
<td>Factory that generates the Flume events from Log4j events. The default factory is the
FlumeAvroAppender itself.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent. If no layout is specified RFC5424Layout will be used.</td>
</tr>
<tr>
<td>mdcExcludes</td>
<td>String</td>
<td>A comma separated list of mdc keys that should be excluded from the FlumeEvent. This is mutually
exclusive with the mdcIncludes attribute.</td>
</tr>
<tr>
<td>mdcIncludes</td>
<td>String</td>
<td>A comma separated list of mdc keys that should be included in the FlumeEvent. Any keys in the MDC
not found in the list will be excluded. This option is mutually exclusive with the mdcExcludes
attribute.</td>
</tr>
<tr>
<td>mdcRequired</td>
<td>String</td>
<td>A comma separated list of mdc keys that must be present in the MDC. If a key is not present a
LoggingException will be thrown.</td>
</tr>
<tr>
<td>mdcPrefix</td>
<td>String</td>
<td>A string that should be prepended to each MDC key in order to distinguish it from event attributes.
The default string is "mdc:".</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>reconnectionDelay</td>
<td>integer</td>
<td>The number of milliseconds the application should wait before trying again to connect to the
agent.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">FlumeAvroAppender Parameters</caption>
</table>
<p>
A sample FlumeAvroAppender configuration that is configured with a primary and a secondary agent,
compresses the body, and formats the body using the RFC5424Layout:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<Flume name="eventLogger" suppressExceptions="false" 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>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="eventLogger"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="JMSQueueAppender"/>
<subsection name="JMSQueueAppender">
<p>The JMSQueueAppender sends the formatted log event to a JMS Queue.</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>factoryBindingName</td>
<td>String</td>
<td>The name to locate in the Context that provides the
<a href="http://download.oracle.com/javaee/5/api/javax/jms/QueueConnectionFactory.html">QueueConnectionFactory</a>.</td>
</tr>
<tr>
<td>factoryName</td>
<td>String</td>
<td>The fully qualified class name that should be used to define the Initial Context Factory as
defined in <a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#INITIAL_CONTEXT_FACTORY">INITIAL_CONTEXT_FACTORY</a>.
If no value is provided the
default InitialContextFactory will be used. If a factoryName is specified without a providerURL
a warning message will be logged as this is likely to cause problems.</td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent. If no layout is specified SerializedLayout will be used.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>password</td>
<td>String</td>
<td>The password to use to create the queue connection.</td>
</tr>
<tr>
<td>providerURL</td>
<td>String</td>
<td>The URL of the provider to use as defined by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#PROVIDER_URL">PROVIDER_URL</a>.
If this value is null the default system provider will be used.</td>
</tr>
<tr>
<td>queueBindingName</td>
<td>String</td>
<td>The name to use to locate the <a href="http://download.oracle.com/javaee/5/api/javax/jms/Queue.html">Queue</a>.</td>
</tr>
<tr>
<td>securityPrincipalName</td>
<td>String</td>
<td>The name of the identity of the Principal as specified by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#SECURITY_PRINCIPAL">SECURITY_PRINCIPAL</a>.
If a securityPrincipalName is specified without securityCredentials a warning message will be
logged as this is likely to cause problems.</td>
</tr>
<tr>
<td>securityCredentials</td>
<td>String</td>
<td>The security credentials for the principal as specified by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#SECURITY_CREDENTIALS">SECURITY_CREDENTIALS</a>.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<tr>
<td>urlPkgPrefixes</td>
<td>String</td>
<td>A colon-separated list of package prefixes for the class name of the factory class that will create
a URL context factory as defined by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#URL_PKG_PREFIXES">URL_PKG_PREFIXES</a>.</td>
</tr>
<tr>
<td>userName</td>
<td>String</td>
<td>The user id used to create the queue connection.</td>
</tr>
<caption align="top">JMSQueueAppender Parameters</caption>
</table>
<p>
Here is a sample JMSQueueAppender configuration:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<JMSQueue name="jmsQueue" queueBindingName="MyQueue" factoryBindingName="MyQueueConnectionFactory"/>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="jmsQueue"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="JMSTopicAppender"/>
<subsection name="JMSTopicAppender">
<p>The JMSTopicAppender sends the formatted log event to a JMS Topic.</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>factoryBindingName</td>
<td>String</td>
<td>The name to locate in the Context that provides the
<a href="http://download.oracle.com/javaee/5/api/javax/jms/TopicConnectionFactory.html">TopicConnectionFactory</a>.</td>
</tr>
<tr>
<td>factoryName</td>
<td>String</td>
<td>The fully qualified class name that should be used to define the Initial Context Factory as
defined in <a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#INITIAL_CONTEXT_FACTORY">INITIAL_CONTEXT_FACTORY</a>.
If no value is provided the
default InitialContextFactory will be used. If a factoryName is specified without a providerURL
a warning message will be logged as this is likely to cause problems.</td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent. If no layout is specified SerializedLayout will be used.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>password</td>
<td>String</td>
<td>The password to use to create the queue connection.</td>
</tr>
<tr>
<td>providerURL</td>
<td>String</td>
<td>The URL of the provider to use as defined by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#PROVIDER_URL">PROVIDER_URL</a>.
If this value is null the default system provider will be used.</td>
</tr>
<tr>
<td>topicBindingName</td>
<td>String</td>
<td>The name to use to locate the
<a href="http://download.oracle.com/javaee/5/api/javax/jms/Topic.html">Topic</a>.</td>
</tr>
<tr>
<td>securityPrincipalName</td>
<td>String</td>
<td>The name of the identity of the Principal as specified by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#SECURITY_PRINCIPAL">SECURITY_PRINCIPAL</a>.
If a securityPrincipalName is specified without securityCredentials a warning message will be
logged as this is likely to cause problems.</td>
</tr>
<tr>
<td>securityCredentials</td>
<td>String</td>
<td>The security credentials for the principal as specified by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#SECURITY_CREDENTIALS">SECURITY_CREDENTIALS</a>.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<tr>
<td>urlPkgPrefixes</td>
<td>String</td>
<td>A colon-separated list of package prefixes for the class name of the factory class that will create
a URL context factory as defined by
<a href="http://download.oracle.com/javase/6/docs/api/javax/naming/Context.html#URL_PKG_PREFIXES">URL_PKG_PREFIXES</a>.</td>
</tr>
<tr>
<td>userName</td>
<td>String</td>
<td>The user id used to create the queue connection.</td>
</tr>
<caption align="top">JMSTopicAppender Parameters</caption>
</table>
<p>
Here is a sample JMSTopicAppender configuration:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<JMSTopic name="jmsTopic" topicBindingName="MyTopic" factoryBindingName="MyTopicConnectionFactory"/>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="jmsQueue"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="OutputStreamAppender"/>
<subsection name="OutputStreamAppender">
The OutputStreamAppender provides the base for many of the other Appenders such as the File and Socket
appenders that write the event to an Output Stream. It cannot be directly configured. Support for
immediateFlush and buffering is provided by the OutputStreamAppender. The OutputStreamAppender uses an
OutputStreamManager to handle the actual I/O, allowing the stream to be shared by Appenders in multiple
configurations.
</subsection>
<a name="RewriteAppender"/>
<subsection name="RewriteAppender">
<p>
The RewriteAppender allows the LogEvent to manipulated before it is processed by another Appender. This
can be used to mask sensitive information such as passwords or to inject information into each event.
The RewriteAppender must be configured with a <a href="RewritePolicy">RewritePolicy</a>.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>appender-ref</td>
<td>String</td>
<td>The name of the Appender to call after the LogEvent has been manipulated.</td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>rewritePolicy</td>
<td>RewritePolciy</td>
<td>The RewritePolicy that will manipulate the LogEvent.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">RewriteAppender Parameters</caption>
</table>
<h4>RewritePolicy</h4>
<p>
RewritePolicy is an interface that allows implementations to inspect and possibly modify LogEvents
before they are passed to Appender. RewritePolicy declares a single method named rewrite that must
be implemented. The method is passed the LogEvent and can return the same event or create a new one.
</p>
<h5>MapRewritePolicy</h5>
<p>
MapRewritePolicy will evaluate LogEvents that contain a MapMessage and will add or update
elements of the Map.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>mode</td>
<td>String</td>
<td>"Add" or "Update"</td>
</tr>
<tr>
<td>keyValuePair</td>
<td>KeyValuePair[]</td>
<td>An array of keys and their values.</td>
</tr>
</table>
<p>
The following configuration shows a RewriteAppender configured to add a product key and its value
to the MapMessage.:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
<Rewrite name="rewrite">
<appender-ref ref="STDOUT"/>
<MapRewritePolicy mode="Add">
<KeyValuePair key="product" value="TestProduct"/>
</MapRewritePolicy>
</Rewrite>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="Rewrite"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="RollingFileAppender"/>
<subsection name="RollingFileAppender">
<p>The RollingFileAppender is an OutputStreamAppender that writes to the File named in the fileName parameter
and rolls the file over according the TriggeringPolicy and the RolloverPolicy. The
RollingFileAppender uses a RollingFileManager (which extends OutputStreamManager) to actually perform the
file I/O and perform the rollover. While RolloverFileAppenders from different Configurations cannot be
shared, the RollingFileManagers can be if the Manager is accessible. For example, two webapps in a
servlet container can have their own configuration and safely
write to the same file if Log4J is in a ClassLoader that is common to both of them.</p>
<p>
A RollingFileAppender requires a <a href="#TriggeringPolicies">TriggeringPolicy</a> and a
<a href="#RolloverStrategies">RolloverStrategy</a>. The triggering policy determines if a rollover should
be performed while the RolloverStrategy defines how the rollover should be done. If no RolloverStrategy
is configured, RollingFileAppender will use the <a href="DefaultRolloverStrategy">DefaultRolloverStrategy</a>.
</p>
<p>
File locking is not supported by the RollingFileAppender.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>append</td>
<td>boolean</td>
<td>When true - the default, records will be appended to the end of the file. When set to false,
the file will be cleared before new reocrds are written.</td>
</tr>
<tr>
<td>bufferedIO</td>
<td>boolean</td>
<td>When true - the default, records will be written to a buffer and the data will be written to
disk when the buffer is full or, if immediateFlush is set, when the record is written.
File locking cannot be used with bufferedIO. Performance tests have shown that using buffered I/O
significantly improves performance, even if immediateFlush is enabled.</td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>fileName</td>
<td>String</td>
<td>The name of the file to write to. If the file, or any of its parent directories, do not exist,
they will be created.</td>
</tr>
<tr>
<td>filePattern</td>
<td>String</td>
<td>The pattern of the file name of the archived log file. The format of the pattern should is
dependent on the RolloverPolicy that is used. The DefaultRolloverPolicy will accept both
a date/time pattern compatible with
<a href="http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat</a>
and and/or a %d which represents an integer counter. The pattern also supports interpolation at
runtime so any of the Lookups (such as the <a href="./lookups.html#DateLookup">DateLookup</a> can
be included in the pattern.</td>
</tr>
<tr>
<td>immediateFlush</td>
<td>boolean</td>
<td>When set to true, each write will be followed by a flush. This will guarantee the data is written
to disk but could impact performance.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>policy</td>
<td>TriggeringPolicy</td>
<td>The policy to use to determine if a rollover should occur.</td>
</tr>
<tr>
<td>strategy</td>
<td>RolloverStrategy</td>
<td>The strategy to use to determine the name and location of the archive file.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">RollingFileAppender Parameters</caption>
</table>
<a name="TriggeringPolicies"/>
<h4>Triggering Policies</h4>
<h5>Composite Triggering Policy</h5>
<p>
The CompositeTriggeringPolicy combines multiple triggering policies and returns true if any
of the configured policies return true. The CompositeTriggeringPolicy is configured simply
by wrapping other policies in a "Policies" element.
</p>
<h5>OnStartup Triggering Policy</h5>
<p>
The OnStartup policy takes no parameters and causes a rollover if the log file is older than the
current JVM's start time.
</p>
<h5>SizeBased Triggering Policy</h5>
<p>
Causes a rollover once the file has reached the specified size. The size can be specified in bytes,
KB, MB or GB.
</p>
<h5>TimeBased Triggering Policy</h5>
<p>
Causes a rollover once the date/time pattern no longer applies to the active file. This policy
takes no parameters.
</p>
<a name="RolloverStrategies"/>
<h4>Rollover Strategies</h4>
<a name="DefaultRolloverStrategy"/>
<h5>Default Rollover Strategy</h5>
<p>
The default rollover strategy accepts both a date/time pattern and an integer. If the date/time pattern
is present it will be replaced with the current date and time values. If the pattern contains an integer
it will be incremented on each rollover. If the pattern contains both a date/time and integer
in the pattern the integer will be incremented until the result of the date/time pattern changes. If
the file pattern ends with ".gz" or ".zip" the resulting archive will be compressed using the
compression scheme that matches the suffix. The pattern may also contain lookup references that
can be resolved at runtime such as is shown in the example below.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>min</td>
<td>integer</td>
<td>The minimum value of the counter. The default value is 1.</td>
</tr>
<tr>
<td>max</td>
<td>integer</td>
<td>The maximum value of the counter. Once this values is reached. Older archives will be
deleted on subsequent rollovers.</td>
</tr>
<caption align="top">DefaultRolloverStrategy Parameters</caption>
</table>
<p>
Below is a sample configuration that uses a RollingFileAppender with both the time and size based
triggering policies, will create up to 7 archives on the same day (1-7) that are stored in a directory
based on the current year and month, and will compress each
archive using gzip:
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%d.log.gz">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="RollingFile"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="RoutingAppender"/>
<subsection name="RoutingAppender">
<p>
The RoutingAppender evaluates LogEvents and then routes them to a subordinate Appender. The target
Appender may be an appender previously configured and may be referenced by its name or the
Appender can be dynamically created as needed.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>rewritePolicy</td>
<td>RewritePolciy</td>
<td>The RewritePolicy that will manipulate the LogEvent.</td>
</tr>
<tr>
<td>routes</td>
<td>Routes</td>
<td>Contains one or more Route declarations to identify the criteria for choosing Appenders.</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">RoutingAppender Parameters</caption>
</table>
<h4>Routes</h4>
<p>
The Routes element accepts a single, required attribute named "pattern". The pattern is evaluated
against all the registered Lookups and the result is used to select a Route. Each Route may be
configured with a key. If the key matches the result of evaluating the pattern then that Route
will be selected. If no key is specified on a Route then that Route is the default. Only one Route
can be configured as the default.
</p>
<p>
Each Route must reference an Appender. If the Route contains an appender-ref attribute then the
Route will reference an Appender that was defined in the configuration. If the Route contains an
Appender definition then an Appender will be created within the context of the RoutingAppender and
will be reused each time a matching Appender name is referenced through a Route.
</p>
<p>
Below is a sample configuration that uses a RoutingFileAppender to route all Audit events to
a FlumeAppender and all other events will be routed to a RollingFileAppender that captures only
the specific event type. Note that the AuditAppender was predefined while the RoutingFileAppenders
are created as needed.
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<Flume name="AuditLogger" suppressExceptions="false" 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 appender-ref="AuditLogger" key="Audit"/>
</Routes>
</Routing>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="Routing"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
<a name="SocketAppender"/>
<subsection name="SocketAppender">
<p>
The SocketAppender is an OutputStreamAppender that writes its output to a remote destination
specified by a host and port. The data can be sent over either TCP or UDP and can be sent in any format.
The default format is to send a Serialized LogEvent. Log4j 2.0 contains a SocketServer which is capable
of receiving serialized LogEvents and routing them through the logging system on the server.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>host</td>
<td>String</td>
<td>The name or address of the system that is listening for log events. This parameter is required.</td>
</tr>
<tr>
<td>immediateFlush</td>
<td>boolean</td>
<td>When set to true, each write will be followed by a flush. This will guarantee the data is written
to disk but could impact performance.</td>
</tr>
<tr>
<td>layout</td>
<td>Layout</td>
<td>The Layout to use to format the LogEvent. The default is SerializedLayout.</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>port</td>
<td>integer</td>
<td>The port on the host that is listening for log events. This parameter must be specified.</td>
</tr>
<tr>
<td>protocol</td>
<td>String</td>
<td>"TCP" or "UDP". This parameter is required.</td>
</tr>
<tr>
<td>reconnectionDelay</td>
<td>integer</td>
<td>If set to a value greater than 0, after an error the SocketManager will attempt to reconnect to
the server after waiting the specified number of milliseconds. If the reconnect fails then
an exception will be thrown (which can be caught by the application if suppressExceptions is
set to false).</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">SocketAppender Parameters</caption>
</table>
</subsection>
<a name="SyslogAppender"/>
<subsection name="SyslogAppender">
<p>
The SyslogAppender is a SocketAppender that writes its output to a remote destination
specified by a host and port in a format that conforms with either the BSD Syslog format or the RFC 5424
format. The data can be sent over either TCP or UDP.
</p>
<table border="1" width="100%">
<tr>
<th>Parameter Name</th>
<th>Type</th>
<th>Description</th>
</tr>
<tr>
<td>appName</td>
<td>String</td>
<td>The value to use as the APP-NAME in the RFC 5424 syslog record.</td>
</tr>
<tr>
<td>charset</td>
<td>String</td>
<td>The character set to use when converting the syslog String to a byte array. The String must be
a valid <a href="http://download.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html">Charset</a>.
If not specified, the default system Charset will be used.</td>
</tr>
<tr>
<td>enterpriseNumber</td>
<td>integer</td>
<td>The IANA enterprise number as described in
<a href="http://tools.ietf.org/html/rfc5424#section-7.2.2">RFC 5424</a></td>
</tr>
<tr>
<td>filter</td>
<td>Filter</td>
<td>A Filter to determine if the event should be handled by this Appender. More than one Filter
may be used by using a CompositeFilter.</td>
</tr>
<tr>
<td>facility</td>
<td>String</td>
<td>The facility is used to try to classify the message. The facility option must be set to one of
"KERN", "USER", "MAIL", "DAEMON", "AUTH", "SYSLOG", "LPR", "NEWS", "UUCP", "CRON", "AUTHPRIV",
"FTP", "NTP", "AUDIT", "ALERT", "CLOCK", "LOCAL0", "LOCAL1", "LOCAL2", "LOCAL3", "LOCAL4", "LOCAL5",
"LOCAL6", or "LOCAL7". These values may be specified as upper or lower case characters.</td>
</tr>
<tr>
<td>format</td>
<td>String</td>
<td>If set to "RFC5424" the data will be formatted in accordance with RFC 5424. Otherwise, it will
be formatted as a BSD Syslog record. Note that although BSD Syslog records are required to be
1024 bytes or shorter the SyslogLayout does not truncate them. The RFC5424Layout also does not
truncate records since the receiver must accept records of up to 2048 bytes and may accept records
that are longer.</td>
</tr>
<tr>
<td>host</td>
<td>String</td>
<td>The name or address of the system that is listening for log events. This parameter is required.</td>
</tr>
<tr>
<td>id</td>
<td>String</td>
<td>The default structured data id to use when formatting according to RFC 5424. If the LogEvent contains
a StructuredDataMessage the id from the Message will be used instead of this value.</td>
</tr>
<tr>
<td>immediateFlush</td>
<td>boolean</td>
<td>When set to true, each write will be followed by a flush. This will guarantee the data is written
to disk but could impact performance.</td>
</tr>
<tr>
<td>includeMDC</td>
<td>boolean</td>
<td>Indicates whether data from the ThreadContextMap will be included in the RFC 5424 Syslog record.
Defaults to true.</td>
</tr>
<tr>
<td>mdcExcludes</td>
<td>String</td>
<td>A comma separated list of mdc keys that should be excluded from the LogEvent. This is mutually
exclusive with the mdcIncludes attribute. This attribute only applies to RFC 5424 syslog records.</td>
</tr>
<tr>
<td>mdcIncludes</td>
<td>String</td>
<td>A comma separated list of mdc keys that should be included in the FlumeEvent. Any keys in the MDC
not found in the list will be excluded. This option is mutually exclusive with the mdcExcludes
attribute. This attribute only applies to RFC 5424 syslog records.</td>
</tr>
<tr>
<td>mdcRequired</td>
<td>String</td>
<td>A comma separated list of mdc keys that must be present in the MDC. If a key is not present a
LoggingException will be thrown. This attribute only applies to RFC 5424 syslog records.</td>
</tr>
<tr>
<td>mdcPrefix</td>
<td>String</td>
<td>A string that should be prepended to each MDC key in order to distinguish it from event attributes.
The default string is "mdc:". This attribute only applies to RFC 5424 syslog records.</td>
</tr>
<tr>
<td>messageId</td>
<td>String</td>
<td>The default value to be used in the MSGID field of RFC 5424 syslog records. </td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>The name of the Appender.</td>
</tr>
<tr>
<td>newLine</td>
<td>boolean</td>
<td>If true, a newline will be appended to the end of the syslog record. The default is false.</td>
</tr>
<tr>
<td>port</td>
<td>integer</td>
<td>The port on the host that is listening for log events. This parameter must be specified.</td>
</tr>
<tr>
<td>protocol</td>
<td>String</td>
<td>"TCP" or "UDP". This parameter is required.</td>
</tr>
<tr>
<td>reconnectionDelay</td>
<td>integer</td>
<td>If set to a value greater than 0, after an error the SocketManager will attempt to reconnect to
the server after waiting the specified number of milliseconds. If the reconnect fails then
an exception will be thrown (which can be caught by the application if suppressExceptions is
set to false).</td>
</tr>
<tr>
<td>suppressExceptions</td>
<td>boolean</td>
<td>The default is true, causing exceptions to be internally logged and then ignored. When set to
false exceptions will be percolated to the caller.</td>
</tr>
<caption align="top">SyslogAppender Parameters</caption>
</table>
<p>
A sample syslogAppender configuration that is configured with two SyslogAppenders, one using the BSD
format and one using RFC 5424.
<source><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" name="MyApp" packages="">
<appenders>
<Syslog name="bsd" host="localhost" port="514" protocol="TCP"/>
<Syslog name="RFC5424" format="RFC5424" host="localhost" port="8514" protocol="TCP" appName="MyApp" includeMDC="true"
facility="LOCAL0" enterpriseNumber="18060" newLine="true" messageId="Audit" id="App"/>
</appenders>
<loggers>
<logger name="com.mycorp" level="error">
<appender-ref ref="RFC5424"/>
</logger>
<root level="error">
<appender-ref ref="bsd"/>
</root>
</loggers>
</configuration>
]]></source>
</p>
</subsection>
</section>
</body>
</document>