You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2018/04/06 22:19:53 UTC

[3/5] logging-log4j2 git commit: LOG4J2-1802: Convert appenders manual to asciidoc

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0c47af7f/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
deleted file mode 100644
index caabe2d..0000000
--- a/src/site/xdoc/manual/appenders.xml
+++ /dev/null
@@ -1,5400 +0,0 @@
-<?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 xmlns="http://maven.apache.org/XDOC/2.0"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
-    <properties>
-        <title>Log4j 2 Appenders</title>
-        <author email="rgoers@apache.org">Ralph Goers</author>
-        <author email="ggrgeory@apache.org">Gary Gregory</author>
-        <author email="nickwilliams@apache.org">Nick Williams</author>
-        <author email="mattsicker@apache.org">Matt SIcker</author>
-    </properties>
-
-    <body>
-      <section name="Appenders">
-        <p>
-          Appenders are responsible for delivering LogEvents to their destination. Every Appender must
-          implement the <a href="../log4j-core/apidocs/org/apache/logging/log4j/core/Appender.html">Appender</a>
-          interface. Most Appenders will extend
-          <a href="../log4j-core/apidocs/org/apache/logging/log4j/core/appender/AbstractAppender.html">AbstractAppender</a>
-          which adds <a href="../log4j-core/apidocs/org/apache/logging/log4j/core/LifeCycle.html">Lifecycle</a>
-          and <a href="../log4j-core/apidocs/org/apache/logging/log4j/core/filter/Filterable.html">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>
-        <p>
-          In the tables below, the "Type" column corresponds to the Java type expected. For non-JDK classes, these
-          should usually be in <a href="../log4j-core/apidocs/index.html">Log4j Core</a> unless otherwise noted.
-        </p>
-        <a name="AsyncAppender"/>
-        <subsection name="AsyncAppender">
-          <p>The AsyncAppender accepts references to other Appenders and causes LogEvents to be written to them
-            on a separate Thread. Note that exceptions while writing to those Appenders will be hidden from
-            the application. The AsyncAppender should be configured after the appenders it references to allow it
-            to shut down properly.</p>
-          <p>
-            By default, AsyncAppender uses
-            <a class="javadoc" href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html">java.util.concurrent.ArrayBlockingQueue</a>
-            which does not require any external libraries. Note that multi-threaded applications should exercise care
-            when using this appender as such: the blocking queue is susceptible to lock contention and our
-            <a href="../performance.html#asyncLogging">tests showed</a>
-            performance may become worse when more threads are logging concurrently.
-            Consider using <a href="async.html">lock-free Async Loggers</a> for optimal performance.
-          </p>
-          <table>
-            <caption align="top">AsyncAppender Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>AppenderRef</td>
-              <td>String</td>
-              <td>The name of the Appenders to invoke asynchronously. Multiple AppenderRef
-                elements can be configured.</td>
-            </tr>
-            <tr>
-              <td>blocking</td>
-              <td>boolean</td>
-              <td>If true, the appender will wait until there are free slots in the queue. If false, the event
-                will be written to the error appender if the queue is full. The default is true.</td>
-            </tr>
-            <tr>
-              <td>shutdownTimeout</td>
-              <td>integer</td>
-              <td>How many milliseconds the Appender should wait to flush outstanding log events in the queue
-                on shutdown. The default is zero which means to wait forever.</td>
-            </tr>
-            <tr>
-              <td>bufferSize</td>
-              <td>integer</td>
-              <td>Specifies the maximum number of events that can be queued. The default is 1024. Note that when using a
-                disruptor-style <tt>BlockingQueue</tt>, this buffer size must be a power of 2.
-                <p>
-                  When the application is logging faster than the underlying appender can keep up with
-                  for a long enough time to fill up the queue, the behavious is determined by the
-                  <a href="../log4j-core/apidocs/org/apache/logging/log4j/core/async/AsyncQueueFullPolicy.html">AsyncQueueFullPolicy</a>.
-                </p>
-              </td>
-            </tr>
-            <tr>
-              <td>errorRef</td>
-              <td>String</td>
-              <td>The name of the Appender to invoke if none of the appenders can be called, either due to errors
-                in the appenders or because the queue is full. If not specified then errors will be ignored.</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>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</a>.</td>
-            </tr>
-            <tr>
-              <td>includeLocation</td>
-              <td>boolean</td>
-              <td>Extracting location is an expensive operation (it can make
-              logging 5 - 20 times slower). To improve performance, location is
-              not included by default when adding a log event to the queue.
-              You can change this by setting includeLocation="true".</td>
-            </tr>
-            <tr>
-              <td>BlockingQueueFactory</td>
-              <td>BlockingQueueFactory</td>
-              <td>This element overrides what type of <tt>BlockingQueue</tt> to use. See
-                <a href="#BlockingQueueFactory">below documentation</a> for more details.</td>
-            </tr>
-          </table>
-          <p>
-            There are also a few system properties that can be used to maintain application throughput even when
-            the underlying appender cannot keep up with the logging rate and the queue is filling up.
-            See the details for system properties
-            <a href="configuration.html#log4j2.AsyncQueueFullPolicy"><tt>log4j2.AsyncQueueFullPolicy</tt> and
-              <tt>log4j2.DiscardThreshold</tt></a>.
-          </p>
-          <p>
-            A typical AsyncAppender configuration might look like:
-          </p>
-
-            <pre class="prettyprint linenums"><![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>
-    <Async name="Async">
-      <AppenderRef ref="MyFile"/>
-    </Async>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="Async"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-          <p>
-            <a name="BlockingQueueFactory"/>
-            Starting in Log4j 2.7, a custom implementation of <tt>BlockingQueue</tt> or <tt>TransferQueue</tt> can be
-            specified using a
-            <a class="javadoc" href="../log4j-core/apidocs/org/apache/logging/log4j/core/async/BlockingQueueFactory.html">BlockingQueueFactory</a>
-            plugin. To override the default <tt>BlockingQueueFactory</tt>, specify the plugin inside an
-            <code><![CDATA[<Async/>]]></code> element like so:
-          </p>
-          <pre class="prettyprint linenums"><![CDATA[
-<Configuration name="LinkedTransferQueueExample">
-  <Appenders>
-    <List name="List"/>
-    <Async name="Async" bufferSize="262144">
-      <AppenderRef ref="List"/>
-      <LinkedTransferQueue/>
-    </Async>
-  </Appenders>
-  <Loggers>
-    <Root>
-      <AppenderRef ref="Async"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-          <p>
-            Log4j ships with the following implementations:
-          </p>
-          <table>
-            <caption align="top">BlockingQueueFactory Implementations</caption>
-            <tr>
-              <th>Plugin Name</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>ArrayBlockingQueue</td>
-              <td>
-                This is the default implementation that uses
-                <a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html">ArrayBlockingQueue</a>.
-              </td>
-            </tr>
-            <tr>
-              <td>DisruptorBlockingQueue</td>
-              <td>
-                This uses the <a href="https://github.com/conversant/disruptor">Conversant Disruptor</a> implementation
-                of <tt>BlockingQueue</tt>. This plugin takes a single optional attribute, <tt>spinPolicy</tt>, which
-                corresponds to
-                <!-- TODO: this needs performance charts and links added -->
-              </td>
-            </tr>
-            <tr>
-              <td>JCToolsBlockingQueue</td>
-              <td>
-                This uses <a href="https://jctools.github.io/JCTools/">JCTools</a>, specifically the
-                <abbr title="multiple producer single consumer">MPSC</abbr> bounded lock-free queue.
-                <!-- TODO: this need performance charts and links added -->
-              </td>
-            </tr>
-            <tr>
-              <td>LinkedTransferQueue</td>
-              <td>
-                This uses the new in Java 7 implementation
-                <a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedTransferQueue.html">LinkedTransferQueue</a>.
-                Note that this queue does not use the <tt>bufferSize</tt> configuration attribute from AsyncAppender as
-                <tt>LinkedTransferQueue</tt> does not support a maximum capacity.
-                <!-- TODO: this needs performance charts and links added -->
-              </td>
-            </tr>
-          </table>
-        </subsection>
-        <a name="CassandraAppender"/>
-        <subsection name="CassandraAppender">
-          <p>
-            The CassandraAppender writes its output to an <a href="https://cassandra.apache.org/">Apache Cassandra</a>
-            database. A keyspace and table must be configured ahead of time, and the columns of that table are mapped
-            in a configuration file. Each column can specify either a <a href="layouts.html">StringLayout</a> (e.g., a
-            <a href="layouts.html#PatternLayout">PatternLayout</a>) along with an optional conversion type, or only
-            a conversion type for <code>org.apache.logging.log4j.spi.ThreadContextMap</code> or
-            <code>org.apache.logging.log4j.spi.ThreadContextStack</code> to store the <a href="thread-context.html">MDC or NDC</a>
-            in a map or list column respectively. A conversion type compatible with <code>java.util.Date</code> will
-            use the log event timestamp converted to that type (e.g., use <code>java.util.Date</code> to fill a
-            <code>timestamp</code> column type in Cassandra).
-          </p>
-          <table>
-            <caption align="top">CassandraAppender Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>batched</td>
-              <td>boolean</td>
-              <td>Whether or not to use batch statements to write log messages to Cassandra. By default, this is <code>false</code>.</td>
-            </tr>
-            <tr>
-              <td>batchType</td>
-              <td><a href="http://docs.datastax.com/en/drivers/java/3.0/com/datastax/driver/core/BatchStatement.Type.html">BatchStatement.Type</a></td>
-              <td>The batch type to use when using batched writes. By default, this is <code>LOGGED</code>.</td>
-            </tr>
-            <tr>
-              <td>bufferSize</td>
-              <td>int</td>
-              <td>The number of log messages to buffer or batch before writing. By default, no buffering is done.</td>
-            </tr>
-            <tr>
-              <td>clusterName</td>
-              <td>String</td>
-              <td>The name of the Cassandra cluster to connect to.</td>
-            </tr>
-            <tr>
-              <td>columns</td>
-              <td>ColumnMapping[]</td>
-              <td>A list of column mapping configurations. Each column must specify a column name. Each column can
-                have a conversion type specified by its fully qualified class name. By default, the conversion type is
-                <code>String</code>. If the configured type is assignment-compatible with
-                <a class="javadoc" href="../log4j-api/apidocs/org/apache/logging/log4j/util/ReadOnlyStringMap.html">ReadOnlyStringMap</a>
-                /
-                <a class="javadoc" href="../log4j-api/apidocs/org/apache/logging/log4j/spi/ThreadContextMap.html">ThreadContextMap</a>
-                or
-                <a class="javadoc" href="../log4j-api/apidocs/org/apache/logging/log4j/spi/ThreadContextStack.html">ThreadContextStack</a>,
-                then that column will be populated with the MDC or NDC respectively. If the configured type is
-                assignment-compatible with <code>java.util.Date</code>, then the log timestamp will be converted to
-                that configured date type. If a <code>literal</code> attribute is given, then its value will be used as
-                is in the <code>INSERT</code> query without any escaping. Otherwise, the layout or pattern specified
-                will be converted into the configured type and stored in that column.
-              </td>
-            </tr>
-            <tr>
-              <td>contactPoints</td>
-              <td>SocketAddress[]</td>
-              <td>A list of hosts and ports of Cassandra nodes to connect to. These must be valid hostnames or IP
-                addresses. By default, if a port is not specified for a host or it is set to 0, then the default
-                Cassandra port of 9042 will be used. By default, <code>localhost:9042</code> will be used.</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>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</a>.</td>
-            </tr>
-            <tr>
-              <td>keyspace</td>
-              <td>String</td>
-              <td>The name of the keyspace containing the table that log messages will be written to.</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 (along with the username) to connect to Cassandra.</td>
-            </tr>
-            <tr>
-              <td>table</td>
-              <td>String</td>
-              <td>The name of the table to write log messages to.</td>
-            </tr>
-            <tr>
-              <td>useClockForTimestampGenerator</td>
-              <td>boolean</td>
-              <td>Whether or not to use the configured <code>org.apache.logging.log4j.core.time.Clock</code> as a
-                <a class="javadoc" href="http://docs.datastax.com/en/drivers/java/3.0/com/datastax/driver/core/TimestampGenerator.html">TimestampGenerator</a>.
-                By default, this is <code>false</code>.</td>
-            </tr>
-            <tr>
-              <td>username</td>
-              <td>String</td>
-              <td>The username to use to connect to Cassandra. By default, no username or password is used.</td>
-            </tr>
-            <tr>
-              <td>useTls</td>
-              <td>boolean</td>
-              <td>Whether or not to use TLS/SSL to connect to Cassandra. This is <code>false</code> by default.</td>
-            </tr>
-          </table>
-          <p>
-            Here is an example CassandraAppender configuration:
-          </p>
-          <pre class="prettyprint linenums"><![CDATA[
-<Configuration name="CassandraAppenderTest">
-  <Appenders>
-    <Cassandra name="Cassandra" clusterName="Test Cluster" keyspace="test" table="logs" bufferSize="10" batched="true">
-      <SocketAddress host="localhost" port="9042"/>
-      <ColumnMapping name="id" pattern="%uuid{TIME}" type="java.util.UUID"/>
-      <ColumnMapping name="timeid" literal="now()"/>
-      <ColumnMapping name="message" pattern="%message"/>
-      <ColumnMapping name="level" pattern="%level"/>
-      <ColumnMapping name="marker" pattern="%marker"/>
-      <ColumnMapping name="logger" pattern="%logger"/>
-      <ColumnMapping name="timestamp" type="java.util.Date"/>
-      <ColumnMapping name="mdc" type="org.apache.logging.log4j.spi.ThreadContextMap"/>
-      <ColumnMapping name="ndc" type="org.apache.logging.log4j.spi.ThreadContextStack"/>
-    </Cassandra>
-  </Appenders>
-  <Loggers>
-    <Logger name="org.apache.logging.log4j.cassandra" level="DEBUG">
-      <AppenderRef ref="Cassandra"/>
-    </Logger>
-    <Root level="ERROR"/>
-  </Loggers>
-</Configuration>
-]]></pre>
-          <p>
-            This example configuration uses the following table schema:
-          </p>
-          <pre class="prettyprint linenums"><![CDATA[
-CREATE TABLE logs (
-    id timeuuid PRIMARY KEY,
-    timeid timeuuid,
-    message text,
-    level text,
-    marker text,
-    logger text,
-    timestamp timestamp,
-    mdc map<text,text>,
-    ndc list<text>
-);
-]]></pre>
-        </subsection>
-        <a name="ConsoleAppender"/>
-        <subsection name="ConsoleAppender">
-          <p>
-            As one might expect, the ConsoleAppender writes its output to either System.out or System.err with System.out
-            being the default target. A Layout must be provided to format the LogEvent.
-          </p>
-          <table>
-            <caption align="top">ConsoleAppender Parameters</caption>
-            <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>follow</td>
-              <td>boolean</td>
-              <td>Identifies whether the appender honors reassignments of System.out or System.err
-                via System.setOut or System.setErr made after configuration. Note that the follow
-                attribute cannot be used with Jansi on Windows. Cannot be used with <code>direct</code>.</td>
-            </tr>
-            <tr>
-              <td>direct</td>
-              <td>boolean</td>
-              <td>Write directly to <code>java.io.FileDescriptor</code> and bypass <code>java.lang.System.out/.err</code>.
-                Can give up to 10x performance boost when the output is redirected to file or other process.
-                Cannot be used with Jansi on Windows. Cannot be used with <code>follow</code>. Output will not respect
-                <code>java.lang.System.setOut()/.setErr()</code> and may get intertwined with other output to
-                <code>java.lang.System.out/.err</code> in a multi-threaded application.
-                <i>New since 2.6.2. Be aware that this is a new addition, and it has only been tested with Oracle JVM
-                  on Linux and Windows so far.</i></td>
-            </tr>
-            <tr>
-              <td>name</td>
-              <td>String</td>
-              <td>The name of the Appender.</td>
-            </tr>
-            <tr>
-              <td>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</a>.</td>
-            </tr>
-            <tr>
-              <td>target</td>
-              <td>String</td>
-              <td>Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is "SYSTEM_OUT".</td>
-            </tr>
-          </table>
-          <p>
-            A typical Console configuration might look like:
-          </p>
-
-            <pre class="prettyprint linenums"><![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">
-      <AppenderRef ref="STDOUT"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-        </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>
-            <caption align="top">FailoverAppender Parameters</caption>
-            <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>retryIntervalSeconds</td>
-              <td>integer</td>
-              <td>The number of seconds that should pass before retrying the primary Appender. The default is 60.</td>
-            </tr>
-            <tr>
-              <td>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead.</td>
-            </tr>
-            <tr>
-              <td>target</td>
-              <td>String</td>
-              <td>Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is "SYSTEM_ERR".</td>
-            </tr>
-          </table>
-          <p>
-            A Failover configuration might look like:
-          </p>
-
-            <pre class="prettyprint linenums"><![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"
-                 ignoreExceptions="false">
-      <PatternLayout>
-        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
-      </PatternLayout>
-      <TimeBasedTriggeringPolicy />
-    </RollingFile>
-    <Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
-      <PatternLayout pattern="%m%n"/>
-    </Console>
-    <Failover name="Failover" primary="RollingFile">
-      <Failovers>
-        <AppenderRef ref="Console"/>
-      </Failovers>
-    </Failover>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="Failover"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-        </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 web applications 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>
-            <caption align="top">FileAppender Parameters</caption>
-            <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 records 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>bufferSize</td>
-              <td>int</td>
-              <td>When bufferedIO is true, this is the buffer size, the default is 8192 bytes.</td>
-            </tr>
-            <tr>
-              <td>createOnDemand</td>
-              <td>boolean</td>
-              <td>The appender creates the file on-demand. The appender only creates the file when a log event
-                passes all filters and is routed to this appender. Defaults to false.</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><p>When set to true - the default, each write will be followed by a flush.
-                This will guarantee the data is written
-                to disk but could impact performance.</p>
-                <p>Flushing after every write is only useful when using this
-				appender with synchronous loggers. Asynchronous loggers and
-				appenders will automatically flush at the end of a batch of events,
-				even if immediateFlush is set to false. This also guarantees
-				the data is written to disk but is more efficient.</p>
-              </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>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>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</a>.</td>
-            </tr>
-            <tr>
-              <td>filePermissions</td>
-              <td>String</td>
-              <td><p>File attribute permissions in POSIX format to apply whenever the file is created.</p>
-                  <p>Underlying files system shall support <a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/PosixFileAttributeView.html">POSIX</a> file attribute view.</p>
-              <p>Examples: rw------- or rw-rw-rw- etc...</p></td>
-            </tr>
-            <tr>
-              <td>fileOwner</td>
-              <td>String</td>
-              <td><p>File owner to define whenever the file is created.</p>
-                  <p>Changing file's owner may be restricted for security reason and Operation not permitted IOException thrown.
-                     Only processes with an effective user ID equal to the user ID
-                     of the file or with appropriate privileges may change the ownership of a file
-                     if <a href="http://www.gnu.org/software/libc/manual/html_node/Options-for-Files.html">_POSIX_CHOWN_RESTRICTED</a> is in effect for path.</p>
-                  <p>Underlying files system shall support file <a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/FileOwnerAttributeView.html">owner</a> attribute view.</p>
-              </td>
-            </tr>
-            <tr>
-              <td>fileGroup</td>
-              <td>String</td>
-              <td><p>File group to define whenever the file is created.</p>
-                  <p>Underlying files system shall support <a class="javadoc" href="https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/PosixFileAttributeView.html">POSIX</a> file attribute view.</p>
-              </td>
-            </tr>
-          </table>
-          <p>
-            Here is a sample File configuration:
-          </p>
-
-            <pre class="prettyprint linenums"><![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">
-      <AppenderRef ref="MyFile"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-        </subsection>
-        <a name="FlumeAppender"/>
-        <subsection name="FlumeAppender">
-          <p><i>This is an optional component supplied in a separate jar.</i></p>
-          <p><a href="http://flume.apache.org/index.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>
-            The Flume Appender supports three modes of operation.
-          </p>
-            <ol>
-              <li>It can act as a remote Flume client which sends Flume events via Avro to a Flume Agent configured
-              with an Avro Source.</li>
-              <li>It can act as an embedded Flume Agent where Flume events pass directly into Flume for processing.</li>
-              <li>It can persist events to a local BerkeleyDB data store and then asynchronously send the events to
-              Flume, similar to the embedded Flume Agent but without most of the Flume dependencies.</li>
-            </ol>
-          <p>
-            Usage as an embedded agent will cause the messages to be directly passed to the Flume Channel and then
-            control will be immediately returned to the application. All interaction with remote agents will occur
-            asynchronously. Setting the "type" attribute to "Embedded" will force the use of the embedded agent. In
-            addition, configuring agent properties in the appender configuration will also cause the embedded agent
-            to be used.
-          </p>
-          <table>
-            <caption align="top">FlumeAppender Parameters</caption>
-            <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.
-                The specification of agents and properties are mutually exclusive. If both are configured an
-                error will result.</td>
-            </tr>
-            <tr>
-              <td>agentRetries</td>
-              <td>integer</td>
-              <td>The number of times the agent should be retried before failing to a secondary. This parameter is
-                ignored when type="persistent" is specified (agents are tried once before failing to the next).</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 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>connectTimeoutMillis</td>
-              <td>integer</td>
-              <td>The number of milliseconds Flume will wait before timing out the connection.</td>
-            </tr>
-            <tr>
-              <td>dataDir</td>
-              <td>String</td>
-              <td>Directory where the Flume write ahead log should be written. Valid only when embedded is set
-                to true and Agent elements are used instead of Property elements.</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>lockTimeoutRetries</td>
-              <td>integer</td>
-              <td>The number of times to retry if a LockConflictException occurs while writing to Berkeley DB. The
-                default is 5.</td>
-            </tr>
-            <tr>
-              <td>maxDelayMillis</td>
-              <td>integer</td>
-              <td>The maximum number of milliseconds to wait for batchSize events before publishing the batch.</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>properties</td>
-              <td>Property[]</td>
-              <td><p>One or more Property elements that are used to configure the Flume Agent. The properties must be
-                configured without the agent name (the appender name is used for this) and no sources can be
-                configured. Interceptors can be specified for the source using "sources.log4j-source.interceptors".
-                All other Flume configuration properties are allowed. Specifying both Agent and Property
-                elements will result in an error.</p>
-                <p>When used to configure in Persistent mode the valid properties are:</p>
-                <ol>
-                  <li>"keyProvider" to specify the name of the plugin to provide the secret key for encryption.</li>
-                </ol>
-              </td>
-            </tr>
-            <tr>
-              <td>requestTimeoutMillis</td>
-              <td>integer</td>
-              <td>The number of milliseconds Flume will wait before timing out the request.</td>
-            </tr>
-            <tr>
-              <td>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</a>.</td>
-            </tr>
-            <tr>
-              <td>type</td>
-              <td>enumeration</td>
-              <td>One of "Avro", "Embedded", or "Persistent" to indicate which variation of the Appender is desired.</td>
-            </tr>
-          </table>
-            <p>
-              A sample FlumeAppender configuration that is configured with a primary and a secondary agent,
-              compresses the body, and formats the body using the RFC5424Layout:
-            </p>
-
-            <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="warn" name="MyApp" packages="">
-  <Appenders>
-    <Flume name="eventLogger" 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">
-      <AppenderRef ref="eventLogger"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-          <p>
-            A sample FlumeAppender configuration that is configured with a primary and a secondary agent,
-            compresses the body, formats the body using the RFC5424Layout, and persists encrypted events to disk:
-          </p>
-
-            <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="warn" name="MyApp" packages="">
-  <Appenders>
-    <Flume name="eventLogger" compress="true" type="persistent" dataDir="./logData">
-      <Agent host="192.168.10.101" port="8800"/>
-      <Agent host="192.168.10.102" port="8800"/>
-      <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
-      <Property name="keyProvider">MySecretProvider</Property>
-    </Flume>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="eventLogger"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-          <p>
-            A sample FlumeAppender configuration that is configured with a primary and a secondary agent,
-            compresses the body, formats the body using RFC5424Layout and passes the events to an embedded Flume
-            Agent.
-          </p>
-          <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="warn" name="MyApp" packages="">
-  <Appenders>
-    <Flume name="eventLogger" compress="true" type="Embedded">
-      <Agent host="192.168.10.101" port="8800"/>
-      <Agent host="192.168.10.102" port="8800"/>
-      <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
-    </Flume>
-    <Console name="STDOUT">
-      <PatternLayout pattern="%d [%p] %c %m%n"/>
-    </Console>
-  </Appenders>
-  <Loggers>
-    <Logger name="EventLogger" level="info">
-      <AppenderRef ref="eventLogger"/>
-    </Logger>
-    <Root level="warn">
-      <AppenderRef ref="STDOUT"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-          <p>
-            A sample FlumeAppender configuration that is configured with a primary and a secondary agent using
-            Flume configuration properties, compresses the body, formats the body using RFC5424Layout and passes the
-            events to an embedded Flume Agent.
-          </p>
-          <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="error" name="MyApp" packages="">
-  <Appenders>
-    <Flume name="eventLogger" compress="true" type="Embedded">
-      <Property name="channels">file</Property>
-      <Property name="channels.file.type">file</Property>
-      <Property name="channels.file.checkpointDir">target/file-channel/checkpoint</Property>
-      <Property name="channels.file.dataDirs">target/file-channel/data</Property>
-      <Property name="sinks">agent1 agent2</Property>
-      <Property name="sinks.agent1.channel">file</Property>
-      <Property name="sinks.agent1.type">avro</Property>
-      <Property name="sinks.agent1.hostname">192.168.10.101</Property>
-      <Property name="sinks.agent1.port">8800</Property>
-      <Property name="sinks.agent1.batch-size">100</Property>
-      <Property name="sinks.agent2.channel">file</Property>
-      <Property name="sinks.agent2.type">avro</Property>
-      <Property name="sinks.agent2.hostname">192.168.10.102</Property>
-      <Property name="sinks.agent2.port">8800</Property>
-      <Property name="sinks.agent2.batch-size">100</Property>
-      <Property name="sinkgroups">group1</Property>
-      <Property name="sinkgroups.group1.sinks">agent1 agent2</Property>
-      <Property name="sinkgroups.group1.processor.type">failover</Property>
-      <Property name="sinkgroups.group1.processor.priority.agent1">10</Property>
-      <Property name="sinkgroups.group1.processor.priority.agent2">5</Property>
-      <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
-    </Flume>
-    <Console name="STDOUT">
-      <PatternLayout pattern="%d [%p] %c %m%n"/>
-    </Console>
-  </Appenders>
-  <Loggers>
-    <Logger name="EventLogger" level="info">
-      <AppenderRef ref="eventLogger"/>
-    </Logger>
-    <Root level="warn">
-      <AppenderRef ref="STDOUT"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-        </subsection>
-        <a name="JDBCAppender"/>
-        <subsection name="JDBCAppender">
-          <p>
-             As of Log4j 2.11.0, JDBC support has moved from the existing module <code>logj-core</code> to the new module <code>log4j-jdbc</code>.
-          </p>
-          <p>The JDBCAppender writes log events to a relational database table using standard JDBC. It can be configured
-            to obtain JDBC connections using a JNDI <code>DataSource</code> or a custom factory method. Whichever
-            approach you take, it <strong><em>must</em></strong> be backed by a connection pool. Otherwise, logging
-            performance will suffer greatly. If batch statements are supported by the configured JDBC driver and a
-            <code>bufferSize</code> is configured to be a positive number, then log events will be batched. Note that as
-            of Log4j 2.8, there are two ways to configure log event to column mappings: the original <code>ColumnConfig</code>
-            style that only allows strings and timestamps, and the new <code>ColumnMapping</code> plugin that uses Log4j's
-            built-in type conversion to allow for more data types (this is the same plugin as in the
-            <a href="#CassandraAppender">Cassandra Appender</a>).</p>
-          <p>
-            To get off the ground quickly during development, an alternative to using a connection source based on 
-            JNDI is to use the non-pooling <code>DriverManager</code> connection source. This connection source uses 
-            a JDBC connection string, a user name, and a password. Optionally, you can also use properties.
-          </p>
-          <table>
-            <caption align="top">JDBCAppender Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>name</td>
-              <td>String</td>
-              <td><em>Required.</em> The name of the Appender.</td>
-            </tr>
-            <tr>
-              <td>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</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>bufferSize</td>
-              <td>int</td>
-              <td>If an integer greater than 0, this causes the appender to buffer log events and flush whenever the
-                buffer reaches this size.</td>
-            </tr>
-            <tr>
-              <td>connectionSource</td>
-              <td>ConnectionSource</td>
-              <td><em>Required.</em> The connections source from which database connections should be retrieved.</td>
-            </tr>
-            <tr>
-              <td>tableName</td>
-              <td>String</td>
-              <td><em>Required.</em> The name of the database table to insert log events into.</td>
-            </tr>
-            <tr>
-              <td>columnConfigs</td>
-              <td>ColumnConfig[]</td>
-              <td><em>Required (and/or columnMappings).</em> Information about the columns that log event data should be inserted into and how
-                to insert that data. This is represented with multiple <code>&lt;Column&gt;</code> elements.</td>
-            </tr>
-            <tr>
-              <td>columnMappings</td>
-              <td>ColumnMapping[]</td>
-              <td><em>Required (and/or columnConfigs).</em> A list of column mapping configurations. Each column must
-                specify a column name. Each column can have a conversion type specified by its fully qualified class
-                name. By default, the conversion type is <code>String</code>. If the configured type is
-                assignment-compatible with
-                <a class="javadoc" href="../log4j-api/apidocs/org/apache/logging/log4j/util/ReadOnlyStringMap.html">ReadOnlyStringMap</a>
-                /
-                <a class="javadoc" href="../log4j-api/apidocs/org/apache/logging/log4j/spi/ThreadContextMap.html">ThreadContextMap</a>
-                or
-                <a class="javadoc" href="../log4j-api/apidocs/org/apache/logging/log4j/spi/ThreadContextStack.html">ThreadContextStack</a>,
-                then that column will be populated with the MDC or NDC respectively (this is database-specific how they
-                handle inserting a <code>Map</code> or <code>List</code> value). If the configured type is
-                assignment-compatible with <code>java.util.Date</code>, then the log timestamp will be converted to
-                that configured date type. If the configured type is assignment-compatible with <code>java.sql.Clob</code>
-                or <code>java.sql.NClob</code>, then the formatted event will be set as a Clob or NClob respectively
-                (similar to the traditional ColumnConfig plugin). If a <code>literal</code> attribute is given, then its
-                value will be used as is in the <code>INSERT</code> query without any escaping. Otherwise, the layout or
-                pattern specified will be converted into the configured type and stored in that column.
-              </td>
-            </tr>
-          </table>
-          <p>When configuring the JDBCAppender, you must specify a <code>ConnectionSource</code> implementation from
-            which the Appender gets JDBC connections. You must use exactly one of the following nested elements:</p>
-          <ul>
-            <li><a href="#JDBCDataSource"><code>&lt;DataSource&gt;</code></a>: Uses JNDI.</li>
-            <li><a href="#JDBCConnectionFactory"><code>&lt;ConnectionFactory&gt;</code></a>: Points to a class-method pair to provide JDBC connections.</li>
-            <li><a href="#JDBCDriverManager"><code>&lt;DriverManager&gt;</code></a>: A quick and dirty way to get off the ground, no connection pooling.</li>
-            <li><a href="#JDBCPoolingDriver"><code>&lt;PoolingDriver&gt;</code></a>: Uses Apache Commons DBCP to provide connection pooling.</li>
-          </ul>
-          <a name="JDBCDataSource"/>
-          <table>
-            <caption align="top">DataSource Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>jndiName</td>
-              <td>String</td>
-              <td><em>Required.</em> The full, prefixed JNDI name that the <code>javax.sql.DataSource</code> is bound
-                to, such as <code>java:/comp/env/jdbc/LoggingDatabase</code>. The <code>DataSource</code> must be backed
-                by a connection pool; otherwise, logging will be very slow.</td>
-            </tr>
-          </table>
-          <a name="JDBCConnectionFactory"/>
-          <table>
-            <caption align="top">ConnectionFactory Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>class</td>
-              <td>Class</td>
-              <td><em>Required.</em> The fully qualified name of a class containing a static factory method for
-                obtaining JDBC connections.</td>
-            </tr>
-            <tr>
-              <td>method</td>
-              <td>Method</td>
-              <td><em>Required.</em> The name of a static factory method for obtaining JDBC connections. This method
-                must have no parameters and its return type must be either <code>java.sql.Connection</code> or
-                <code>DataSource</code>. If the method returns <code>Connection</code>s, it must obtain them from a
-                connection pool (and they will be returned to the pool when Log4j is done with them); otherwise, logging
-                will be very slow. If the method returns a <code>DataSource</code>, the <code>DataSource</code> will
-                only be retrieved once, and it must be backed by a connection pool for the same reasons.</td>
-            </tr>
-          </table>
-          <a name="JDBCDriverManager"/>
-          <table>
-            <caption align="top">DriverManager Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>connectionString</td>
-              <td>String</td>
-              <td><em>Required.</em> The driver-specific JDBC connection string.</td>
-            </tr>
-            <tr>
-              <td>userName</td>
-              <td>String</td>
-              <td>The database user name. You cannot specify both properties and a user name or password.</td>
-            </tr>
-            <tr>
-              <td>password</td>
-              <td>String</td>
-              <td>The database password. You cannot specify both properties and a user name or password.</td>
-            </tr>
-            <tr>
-              <td>driverClassName</td>
-              <td>String</td>
-              <td>The JDBC driver class name. Some old JDBC Driver can only be discovered by explicitly loading them by class name.</td>
-            </tr>
-            <tr>
-              <td>properties</td>
-              <td>Property[]</td>
-              <td>A list of properties. You cannot specify both properties and a user name or password.</td>
-            </tr>
-          </table>
-          <a name="JDBCPoolingDriver"/>
-          <table>
-            <caption align="top">PoolingDriver Parameters (Apache Commons DBCP)</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>DriverManager parameters</td>
-              <td>DriverManager parameters</td>
-              <td>This connection source inherits all parameter from the DriverManager connection source.</td>
-            </tr>
-            <tr>
-              <td>poolName</td>
-              <td>String</td>
-              <td>The pool name used to pool JDBC Connections. Defaults to <code>example</code>. You can use the JDBC 
-              connection string prefix <code>jdbc:apache:commons:dbcp:</code> followed by the pool name if you want 
-              to use a pooled connection elsewhere. For example: <code>jdbc:apache:commons:dbcp:example</code>.</td>
-            </tr>
-          </table>
-          <p>When configuring the JDBCAppender, use the nested <code>&lt;Column&gt;</code> elements to specify which
-            columns in the table should be written to and how to write to them. The JDBCAppender uses this information
-            to formulate a <code>PreparedStatement</code> to insert records without SQL injection vulnerability.</p>
-          <table>
-            <caption align="top">Column Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>name</td>
-              <td>String</td>
-              <td><em>Required.</em> The name of the database column.</td>
-            </tr>
-            <tr>
-              <td>pattern</td>
-              <td>String</td>
-              <td>Use this attribute to insert a value or values from the log event in this column using a
-                <code>PatternLayout</code> pattern. Simply specify any legal pattern in this attribute. Either this
-                attribute, <code>literal</code>, or <code>isEventTimestamp="true"</code> must be specified, but not more
-                than one of these.</td>
-            </tr>
-            <tr>
-              <td>literal</td>
-              <td>String</td>
-              <td>
-                <p>Use this attribute to insert a literal value in this column. The value will be included directly in
-                the insert SQL, without any quoting (which means that if you want this to be a string, your value should
-                contain single quotes around it like this: <code>literal="'Literal String'"</code>). This is especially
-                useful for databases that don't support identity columns. For example, if you are using Oracle you could
-                specify <code>literal="NAME_OF_YOUR_SEQUENCE.NEXTVAL"</code> to insert a unique ID in an ID column.
-                Either this attribute, <code>pattern</code>, or <code>isEventTimestamp="true"</code> must be specified,
-                but not more than one of these.
-                </p>
-              </td>
-            </tr>
-            <tr>
-              <td>parameter</td>
-              <td>String</td>
-              <td>
-                <p>Use this attribute to insert an expression with a parameter marker '?' in this column. The value will be included directly in
-                the insert SQL, without any quoting (which means that if you want this to be a string, your value should
-                contain single quotes around it like this: 
-                </p>
-                <p>
-                  <code>&lt;ColumnMapping name="instant" parameter="TIMESTAMPADD('MILLISECOND', ?, TIMESTAMP '1970-01-01')"/></code>
-                </p>
-                <p>
-                  You can only specify one of <code>literal</code> or <code>parameter</code>.
-                </p>
-              </td>
-            </tr>
-            <tr>
-              <td>isEventTimestamp</td>
-              <td>boolean</td>
-              <td>Use this attribute to insert the event timestamp in this column, which should be a SQL datetime. The
-                value will be inserted as a <code>java.sql.Types.TIMESTAMP</code>. Either this attribute (equal to
-                <code>true</code>), <code>pattern</code>, or <code>isEventTimestamp</code> must be specified, but not
-                more than one of these.</td>
-            </tr>
-            <tr>
-              <td>isUnicode</td>
-              <td>boolean</td>
-              <td>This attribute is ignored unless <code>pattern</code> is specified. If <code>true</code> or omitted
-                (default), the value will be inserted as unicode (<code>setNString</code> or <code>setNClob</code>).
-                Otherwise, the value will be inserted non-unicode (<code>setString</code> or <code>setClob</code>).</td>
-            </tr>
-            <tr>
-              <td>isClob</td>
-              <td>boolean</td>
-              <td>This attribute is ignored unless <code>pattern</code> is specified. Use this attribute to indicate
-                that the column stores Character Large Objects (CLOBs). If <code>true</code>, the value will be inserted
-                as a CLOB (<code>setClob</code> or <code>setNClob</code>). If <code>false</code> or omitted (default),
-                the value will be inserted as a VARCHAR or NVARCHAR (<code>setString</code> or <code>setNString</code>).
-              </td>
-            </tr>
-          </table>
-          <table>
-            <caption align="top">ColumnMapping Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>name</td>
-              <td>String</td>
-              <td><em>Required.</em> The name of the database column.</td>
-            </tr>
-            <tr>
-              <td>pattern</td>
-              <td>String</td>
-              <td>Use this attribute to insert a value or values from the log event in this column using a
-                <code>PatternLayout</code> pattern. Simply specify any legal pattern in this attribute. Either this
-                attribute, <code>literal</code>, or <code>isEventTimestamp="true"</code> must be specified, but not more
-                than one of these.</td>
-            </tr>
-            <tr>
-              <td>literal</td>
-              <td>String</td>
-              <td>Use this attribute to insert a literal value in this column. The value will be included directly in
-                the insert SQL, without any quoting (which means that if you want this to be a string, your value should
-                contain single quotes around it like this: <code>literal="'Literal String'"</code>). This is especially
-                useful for databases that don't support identity columns. For example, if you are using Oracle you could
-                specify <code>literal="NAME_OF_YOUR_SEQUENCE.NEXTVAL"</code> to insert a unique ID in an ID column.
-                Either this attribute, <code>pattern</code>, or <code>isEventTimestamp="true"</code> must be specified,
-                but not more than one of these.</td>
-            </tr>
-            <tr>
-              <td>layout</td>
-              <td>Layout</td>
-              <td>The Layout to format the LogEvent.</td>
-            </tr>
-            <tr>
-              <td>type</td>
-              <td>String</td>
-              <td>Conversion type name, a fully-qualified class name.</td>
-            </tr>
-          </table>
-          <p>
-            Here are a couple sample configurations for the JDBCAppender, as well as a sample factory implementation
-            that uses Commons Pooling and Commons DBCP to pool database connections:
-          </p>
-
-            <pre class="prettyprint linenums lang-xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="error">
-  <Appenders>
-    <JDBC name="databaseAppender" tableName="dbo.application_log">
-      <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />
-      <Column name="eventDate" isEventTimestamp="true" />
-      <Column name="level" pattern="%level" />
-      <Column name="logger" pattern="%logger" />
-      <Column name="message" pattern="%message" />
-      <Column name="exception" pattern="%ex{full}" />
-    </JDBC>
-  </Appenders>
-  <Loggers>
-    <Root level="warn">
-      <AppenderRef ref="databaseAppender"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-
-            <pre class="prettyprint linenums lang-xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="error">
-  <Appenders>
-    <JDBC name="databaseAppender" tableName="LOGGING.APPLICATION_LOG">
-      <ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" />
-      <Column name="EVENT_ID" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" />
-      <Column name="EVENT_DATE" isEventTimestamp="true" />
-      <Column name="LEVEL" pattern="%level" />
-      <Column name="LOGGER" pattern="%logger" />
-      <Column name="MESSAGE" pattern="%message" />
-      <Column name="THROWABLE" pattern="%ex{full}" />
-    </JDBC>
-  </Appenders>
-  <Loggers>
-    <Root level="warn">
-      <AppenderRef ref="databaseAppender"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-            <pre class="prettyprint linenums lang-java"><![CDATA[package net.example.db;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
-import org.apache.commons.dbcp.DriverManagerConnectionFactory;
-import org.apache.commons.dbcp.PoolableConnection;
-import org.apache.commons.dbcp.PoolableConnectionFactory;
-import org.apache.commons.dbcp.PoolingDataSource;
-import org.apache.commons.pool.impl.GenericObjectPool;
-
-public class ConnectionFactory {
-    private static interface Singleton {
-        final ConnectionFactory INSTANCE = new ConnectionFactory();
-    }
-
-    private final DataSource dataSource;
-
-    private ConnectionFactory() {
-        Properties properties = new Properties();
-        properties.setProperty("user", "logging");
-        properties.setProperty("password", "abc123"); // or get properties from some configuration file
-
-        GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<PoolableConnection>();
-        DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
-                "jdbc:mysql://example.org:3306/exampleDb", properties
-        );
-        new PoolableConnectionFactory(
-                connectionFactory, pool, null, "SELECT 1", 3, false, false, Connection.TRANSACTION_READ_COMMITTED
-        );
-
-        this.dataSource = new PoolingDataSource(pool);
-    }
-
-    public static Connection getDatabaseConnection() throws SQLException {
-        return Singleton.INSTANCE.dataSource.getConnection();
-    }
-}]]></pre>
-          <p>
-            This appender is <a href="messages.html#MapMessage">MapMessage</a>-aware.
-          </p>
-          <p>
-            The following configuration uses a <code>MessageLayout</code> to indicate that the Appender should match 
-            the keys of a <code>MapMessage</code> to the names of <code>ColumnMapping</code>s when setting the 
-            values of the Appender's SQL INSERT statement. This let you insert rows for custom values in a 
-            database table based on a Log4j <code>MapMessage</code> instead of values from <code>LogEvent</code>s.
-          </p>
-          <pre class="prettyprint linenums lang-xml"><![CDATA[<Configuration status="debug">
-
-  <Appenders>
-    <Console name="STDOUT">
-      <PatternLayout pattern="%C{1.} %m %level MDC%X%n"/>
-    </Console>
-    <Jdbc name="databaseAppender" tableName="dsLogEntry" ignoreExceptions="false">
-      <DataSource jndiName="java:/comp/env/jdbc/TestDataSourceAppender" />
-      <ColumnMapping name="Id" />
-      <ColumnMapping name="ColumnA" />
-      <ColumnMapping name="ColumnB" />
-      <MessageLayout />
-    </Jdbc>
-  </Appenders>
-
-  <Loggers>
-    <Logger name="org.apache.logging.log4j.core.appender.db" level="debug" additivity="false">
-      <AppenderRef ref="databaseAppender" />
-    </Logger>
-
-    <Root level="fatal">
-      <AppenderRef ref="STDOUT"/>
-    </Root>
-  </Loggers>
-
-</Configuration>]]></pre>          
-        </subsection>
-        <a name="JMSAppender"/>
-        <!-- cool URLs don't change, so here are some old anchors -->
-        <a name="JMSQueueAppender"/>
-        <a name="JMSTopicAppender"/>
-        <subsection name="JMS Appender">
-          <p>
-             As of Log4j 2.11.0, JPA support has moved from the existing module <code>logj-core</code> to the new module <code>log4j-jms</code>.
-          </p>
-          <p>The JMS Appender sends the formatted log event to a JMS Destination.</p>
-          <p>
-            Note that in Log4j 2.0, this appender was split into a JMSQueueAppender and a JMSTopicAppender. Starting
-            in Log4j 2.1, these appenders were combined into the JMS Appender which makes no distinction between queues
-            and topics. However, configurations written for 2.0 which use the <code>&lt;JMSQueue/&gt;</code> or
-            <code>&lt;JMSTopic/&gt;</code> elements will continue to work with the new <code>&lt;JMS/&gt;</code>
-            configuration element.
-          </p>
-          <table>
-            <caption align="top">JMS Appender Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Default</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>factoryBindingName</td>
-              <td>String</td>
-              <td><em>Required</em></td>
-              <td>The name to locate in the Context that provides the
-                <a class="javadoc" href="http://download.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html">ConnectionFactory</a>.
-                This can be any subinterface of <code>ConnectionFactory</code> as well.
-              </td>
-            </tr>
-            <tr>
-              <td>factoryName</td>
-              <td>String</td>
-              <td><em>Required</em></td>
-              <td>The fully qualified class name that should be used to define the Initial Context Factory as defined in
-                <a class="javadoc" href="http://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#INITIAL_CONTEXT_FACTORY">INITIAL_CONTEXT_FACTORY</a>.
-                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>null</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><em>Required</em></td>
-              <td>
-                The Layout to use to format the LogEvent.
-                <em>New since 2.9, in previous versions SerializedLayout was default.</em>
-              </td>
-            </tr>
-            <tr>
-              <td>name</td>
-              <td>String</td>
-              <td><em>Required</em></td>
-              <td>The name of the Appender. </td>
-            </tr>
-            <tr>
-              <td>password</td>
-              <td>String</td>
-              <td>null</td>
-              <td>The password to use to create the JMS connection.</td>
-            </tr>
-            <tr>
-              <td>providerURL</td>
-              <td>String</td>
-              <td><em>Required</em></td>
-              <td>The URL of the provider to use as defined by
-                <a class="javadoc" href="http://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#PROVIDER_URL">PROVIDER_URL</a>.
-              </td>
-            </tr>
-            <tr>
-              <td>destinationBindingName</td>
-              <td>String</td>
-              <td><em>Required</em></td>
-              <td>
-                The name to use to locate the
-                <a class="javadoc" href="http://download.oracle.com/javaee/5/api/javax/jms/Destination.html">Destination</a>.
-                This can be a <code>Queue</code> or <code>Topic</code>, and as such, the attribute names
-                <code>queueBindingName</code> and <code>topicBindingName</code> are aliases to maintain compatibility
-                with the Log4j 2.0 JMS appenders.
-              </td>
-            </tr>
-            <tr>
-              <td>securityPrincipalName</td>
-              <td>String</td>
-              <td>null</td>
-              <td>The name of the identity of the Principal as specified by
-                <a class="javadoc" href="http://download.oracle.com/javase/7/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>null</td>
-              <td>The security credentials for the principal as specified by
-                <a class="javadoc" href="http://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#SECURITY_CREDENTIALS">SECURITY_CREDENTIALS</a>.
-              </td>
-            </tr>
-            <tr>
-              <td>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>true</td>
-              <td>When <code>true</code>, exceptions caught while appending events are
-                internally logged and then ignored. When <code>false</code> exceptions are propagated to the
-                caller. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</a>.</td>
-            </tr>
-            <tr>
-              <td>immediateFail</td>
-              <td>boolean</td>
-              <td>false</td>
-              <td>When set to true, log events will not wait to try to reconnect and will fail immediately if the
-              JMS resources are not available. New in 2.9.</td>
-            </tr>
-            <tr>
-              <td>reconnectIntervalMillis</td>
-              <td>long</td>
-              <td>5000</td>
-              <td>If set to a value greater than 0, after an error, the JMSManager will attempt to reconnect to
-                the broker 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 <code>ignoreExceptions</code> is
-                set to <code>false</code>). New in 2.9.</td>
-            </tr>
-            <tr>
-              <td>urlPkgPrefixes</td>
-              <td>String</td>
-              <td>null</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 class="javadoc" href="http://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#URL_PKG_PREFIXES">URL_PKG_PREFIXES</a>.
-              </td>
-            </tr>
-            <tr>
-              <td>userName</td>
-              <td>String</td>
-              <td>null</td>
-              <td>The user id used to create the JMS connection.</td>
-            </tr>
-          </table>
-          <p>
-            Here is a sample JMS Appender configuration:
-          </p>
-
-          <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="warn" name="MyApp">
-  <Appenders>
-    <JMS name="jmsQueue" destinationBindingName="MyQueue"
-         factoryBindingName="MyQueueConnectionFactory">
-      <JsonLayout properties="true"/>
-    </JMS>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="jmsQueue"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-
-        <p>
-          To map your Log4j <code>MapMessage</code>s to JMS <code>javax.jms.MapMessage</code>s, set the
-          layout of the appender to <code>MessageLayout</code> with <code>&lt;MessageLayout /&gt;</code> (Since 2.9.):
-        </p>
-
-            <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="warn" name="MyApp">
-  <Appenders>
-    <JMS name="jmsQueue" destinationBindingName="MyQueue"
-         factoryBindingName="MyQueueConnectionFactory">
-      <MessageLayout />
-    </JMS>
-  </Appenders>
-  <Loggers>
-    <Root level="error">
-      <AppenderRef ref="jmsQueue"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-
-        </subsection>
-        <a name="JPAAppender"/>
-        <subsection name="JPAAppender">
-          <p>
-             As of Log4j 2.11.0, JPA support has moved from the existing module <code>logj-core</code> to the new module <code>log4j-jpa</code>.
-          </p>
-          <p>The JPAAppender writes log events to a relational database table using the Java Persistence API 2.1.
-            It requires the API and a provider implementation be on the classpath. It also requires a decorated entity
-            configured to persist to the table desired. The entity should either extend
-            <code>org.apache.logging.log4j.core.appender.db.jpa.BasicLogEventEntity</code> (if you mostly want to
-            use the default mappings) and provide at least an <code>@Id</code> property, or
-            <code>org.apache.logging.log4j.core.appender.db.jpa.AbstractLogEventWrapperEntity</code> (if you want
-            to significantly customize the mappings). See the Javadoc for these two classes for more information. You
-            can also consult the source code of these two classes as an example of how to implement the entity.</p>
-          <table>
-            <caption align="top">JPAAppender Parameters</caption>
-            <tr>
-              <th>Parameter Name</th>
-              <th>Type</th>
-              <th>Description</th>
-            </tr>
-            <tr>
-              <td>name</td>
-              <td>String</td>
-              <td><em>Required.</em> The name of the Appender.</td>
-            </tr>
-            <tr>
-              <td>ignoreExceptions</td>
-              <td>boolean</td>
-              <td>The default is <code>true</code>, causing exceptions encountered while appending events to be
-                internally logged and then ignored. When set to <code>false</code> exceptions will be propagated to the
-                caller, instead. You must set this to <code>false</code> when wrapping this Appender in a
-                <a href="#FailoverAppender">FailoverAppender</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>bufferSize</td>
-              <td>int</td>
-              <td>If an integer greater than 0, this causes the appender to buffer log events and flush whenever the
-                buffer reaches this size.</td>
-            </tr>
-            <tr>
-              <td>entityClassName</td>
-              <td>String</td>
-              <td><em>Required.</em> The fully qualified name of the concrete LogEventWrapperEntity implementation that
-                has JPA annotations mapping it to a database table.</td>
-            </tr>
-            <tr>
-              <td>persistenceUnitName</td>
-              <td>String</td>
-              <td><em>Required.</em> The name of the JPA persistence unit that should be used for persisting log
-                events.</td>
-            </tr>
-          </table>
-          <p>
-            Here is a sample configuration for the JPAAppender. The first XML sample is the Log4j configuration file,
-            the second is the <code>persistence.xml</code> file. EclipseLink is assumed here, but any JPA 2.1 or higher
-            provider will do. You should <em>always</em> create a <em>separate</em> persistence unit for logging, for
-            two reasons. First, <code>&lt;shared-cache-mode&gt;</code> <em>must</em> be set to "NONE," which is usually
-            not desired in normal JPA usage. Also, for performance reasons the logging entity should be isolated in its
-            own persistence unit away from all other entities and you should use a non-JTA data source. Note that your
-            persistence unit <em>must</em> also contain <code>&lt;class&gt;</code> elements for all of the
-            <code>org.apache.logging.log4j.core.appender.db.jpa.converter</code> converter classes.
-          </p>
-
-            <pre class="prettyprint linenums lang-xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="error">
-  <Appenders>
-    <JPA name="databaseAppender" persistenceUnitName="loggingPersistenceUnit"
-         entityClassName="com.example.logging.JpaLogEntity" />
-  </Appenders>
-  <Loggers>
-    <Root level="warn">
-      <AppenderRef ref="databaseAppender"/>
-    </Root>
-  </Loggers>
-</Configuration>]]></pre>
-
-            <pre class="prettyprint linenums lang-xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
-<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
-             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
-                                 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
-             version="2.1">
-
-  <persistence-unit name="loggingPersistenceUnit" transaction-type="RESOURCE_LOCAL">
-    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.MarkerAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.MessageAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.StackTraceElementAttributeConverter</class>
-    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ThrowableAttributeConverter</class>
-    <class>com.example.logging.JpaLogEntity</class>
-    <non-jta-data-source>jdbc/LoggingDataSource</non-jta-data-source>
-    <shared-cache-mode>NONE</shared-cache-mode>
-  </persistence-unit>
-
-</persistence>]]></pre>
-
-            <pre class="prettyprint linenums lang-java"><![CDATA[package com.example.logging;
-...
-@Entity
-@Table(name="application_log", schema="dbo")
-public class JpaLogEntity extends BasicLogEventEntity {
-    private static final long serialVersionUID = 1L;
-    private long id = 0L;
-
-    public TestEntity() {
-        super(null);
-    }
-    public TestEntity(LogEvent wrappedEvent) {
-        super(wrappedEvent);
-    }
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "id")
-    public long getId() {
-        return this.id;
-    }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    // If you want to override the mapping of any properties mapped in BasicLogEventEntity,
-    // just override the getters and re-specify the annotations.
-}]]></pre>
-
-            <pre class="prettyprint linenums lang-java"><![CDATA[package com.example.logging;
-...
-@Entity
-@Table(name="application_log", schema="dbo")
-public class JpaLogEntity extends AbstractLogEventWrapperEntity {
-    private static final long serialVersionUID = 1L;
-    private long id = 0L;
-
-    public TestEntity() {
-        super(null);
-    }
-    public TestEntity(LogEvent wrappedEvent) {
-        super(wrappedEvent);
-    }
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "logEventId")
-    public long getId() {
-        return this.id;
-    }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    @Override
-    @Enumerated(EnumType.STRING)
-    @Column(name = "level")
-    public Level getLevel() {
-        return this.getWrappedEvent().getLevel();
-    }
-
-    @Override
-    @Column(name = "logger")
-    public String getLoggerName() {
-        return this.getWrappedEvent().getLoggerName();
-    }
-
-    @Override
-    @Column(name = "message")
-    @Convert(converter = MyMessageConverter.class)
-    public Message getMessage() {
-        return this.getWrappedEvent().getMessage();
-    }
-    ...
-}]]></pre>
-        </subsection>
-        <a name="HttpAppender"/>
-        <subsection name="HttpAppender">
-          <p>
-            The HttpAppender sends log events over HTTP. A Layout must be provided to format the LogEvent.
-          </p>
-          <p>
-            Will set the <code>Content-Type</code> header according to the layout. Additional headers can be specified
-            with embedded Property elements.
-          </p>
-          <p>
-            Will wait for response from server, and throw error if no 2xx

<TRUNCATED>