You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gi...@apache.org on 2024/08/12 11:03:55 UTC

(logging-log4j2) branch main-site-stg-out updated: Add website content generated from `054fbc9c1b3b8c459344e49f3fd1c4d53b5cc5e6`

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch main-site-stg-out
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/main-site-stg-out by this push:
     new d424c91e88 Add website content generated from `054fbc9c1b3b8c459344e49f3fd1c4d53b5cc5e6`
d424c91e88 is described below

commit d424c91e886333f8731326803a66bce79f2f6afb
Author: ASF Logging Services RM <pr...@logging.apache.org>
AuthorDate: Mon Aug 12 11:03:48 2024 +0000

    Add website content generated from `054fbc9c1b3b8c459344e49f3fd1c4d53b5cc5e6`
---
 ...ag-35cc4e8101ffe76d0edc44ed334a6273018dc51b.svg |    1 +
 ...ag-768e5e02508ea736d8901892b519a6d3a7a770ab.svg |    1 +
 ...ag-d5122741a680d765fa3170a444015b615a1fdafd.svg |    1 +
 articles.html                                      |   21 +
 development.html                                   |   21 +
 download.html                                      |   21 +
 faq.html                                           |   21 +
 hibernate.html                                     |   21 +
 index.html                                         |   21 +
 javadoc.html                                       |   21 +
 log4j-docker.html                                  |   21 +
 log4j-flume-ng.html                                |   21 +
 log4j-jpl.html                                     |   21 +
 log4j-jul.html                                     |   21 +
 log4j-slf4j-impl.html                              |   21 +
 log4j-slf4j2-impl.html                             |   21 +
 log4j-spring-cloud-config-client.html              |   21 +
 log4j-to-jul.html                                  |   21 +
 log4j-to-slf4j.html                                |   21 +
 manual/api.html                                    |   21 +
 manual/appenders.html                              | 6774 +++-----------------
 manual/appenders/database.html                     | 2339 +++++++
 manual/appenders/delegating.html                   | 2504 ++++++++
 manual/appenders/file.html                         |  681 ++
 manual/appenders/message-queue.html                | 1447 +++++
 manual/appenders/network.html                      | 1904 ++++++
 manual/appenders/rolling-file.html                 | 3118 +++++++++
 manual/architecture.html                           |   21 +
 manual/async.html                                  |   21 +
 manual/cloud.html                                  |   21 +
 manual/config-intro.html                           |   21 +
 manual/configuration.html                          |   21 +
 manual/customconfig.html                           |   21 +
 manual/dependencyinjection.html                    |   21 +
 manual/extending.html                              |   21 +
 manual/filters.html                                |   78 +-
 manual/garbagefree.html                            |   21 +
 manual/getting-started.html                        |   21 +
 manual/index.html                                  |   21 +
 manual/installation.html                           |   25 +-
 manual/jmx.html                                    |   21 +
 manual/json-template-layout.html                   |   21 +
 manual/layouts.html                                |   34 +
 manual/lookups.html                                |   43 +-
 manual/migration.html                              |   21 +
 manual/pattern-layout.html                         |   21 +
 manual/performance.html                            |   21 +
 manual/plugins.html                                |   21 +
 manual/scripts.html                                |   21 +
 manual/systemproperties.html                       |   21 +
 manual/usage.html                                  |   21 +
 migrate-from-logback.html                          |   21 +
 migrate-from-slf4j.html                            |   21 +
 plugin-reference.html                              |  228 +-
 release-notes.html                                 |   31 +-
 sitemap.xml                                        |  118 +-
 thanks.html                                        |   21 +
 57 files changed, 13932 insertions(+), 6235 deletions(-)

diff --git a/_images/diag-35cc4e8101ffe76d0edc44ed334a6273018dc51b.svg b/_images/diag-35cc4e8101ffe76d0edc44ed334a6273018dc51b.svg
new file mode 100644
index 0000000000..881ad85f71
--- /dev/null
+++ b/_images/diag-35cc4e8101ffe76d0edc44ed334a6273018dc51b.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="226px" preserveAspectRatio="none" style="width:771px;height:226px;background:#FFFFFF;" version="1.1" viewBox="0 0 771 226" width="771px" zoomAndPan="magnify"><defs/><g><!--class initial--><g id="elem_initial"><rect codeLine="1" fill="#F1F1F1" height="64.2969" id="initial" rx="2.5" ry="2.5" style="stroke:#181818;str [...]
\ No newline at end of file
diff --git a/_images/diag-768e5e02508ea736d8901892b519a6d3a7a770ab.svg b/_images/diag-768e5e02508ea736d8901892b519a6d3a7a770ab.svg
new file mode 100644
index 0000000000..1e0909caa2
--- /dev/null
+++ b/_images/diag-768e5e02508ea736d8901892b519a6d3a7a770ab.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="143px" preserveAspectRatio="none" style="width:771px;height:143px;background:#FFFFFF;" version="1.1" viewBox="0 0 771 143" width="771px" zoomAndPan="magnify"><defs/><g><!--class initial--><g id="elem_initial"><rect codeLine="1" fill="#F1F1F1" height="64.2969" id="initial" rx="2.5" ry="2.5" style="stroke:#181818;str [...]
\ No newline at end of file
diff --git a/_images/diag-d5122741a680d765fa3170a444015b615a1fdafd.svg b/_images/diag-d5122741a680d765fa3170a444015b615a1fdafd.svg
new file mode 100644
index 0000000000..7d4b4be182
--- /dev/null
+++ b/_images/diag-d5122741a680d765fa3170a444015b615a1fdafd.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="226px" preserveAspectRatio="none" style="width:771px;height:226px;background:#FFFFFF;" version="1.1" viewBox="0 0 771 226" width="771px" zoomAndPan="magnify"><defs/><g><!--class initial--><g id="elem_initial"><rect codeLine="1" fill="#F1F1F1" height="64.2969" id="initial" rx="2.5" ry="2.5" style="stroke:#181818;str [...]
\ No newline at end of file
diff --git a/articles.html b/articles.html
index d29aca4a7e..0b8b23224f 100644
--- a/articles.html
+++ b/articles.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/development.html b/development.html
index 9780bd99ac..ad00b83eda 100644
--- a/development.html
+++ b/development.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/download.html b/download.html
index adcda6e71f..5cf81ab03b 100644
--- a/download.html
+++ b/download.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/faq.html b/faq.html
index 3bc4dee61e..c0939ed3ff 100644
--- a/faq.html
+++ b/faq.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/hibernate.html b/hibernate.html
index 9c8fc24d77..144f4fc800 100644
--- a/hibernate.html
+++ b/hibernate.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/index.html b/index.html
index 4a325a8087..aab3f8f1fa 100644
--- a/index.html
+++ b/index.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/javadoc.html b/javadoc.html
index ca127407f8..2444b783f1 100644
--- a/javadoc.html
+++ b/javadoc.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-docker.html b/log4j-docker.html
index f52d2bd35e..6fb281c02a 100644
--- a/log4j-docker.html
+++ b/log4j-docker.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-flume-ng.html b/log4j-flume-ng.html
index bf1b3472cf..e9150bf6ce 100644
--- a/log4j-flume-ng.html
+++ b/log4j-flume-ng.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-jpl.html b/log4j-jpl.html
index 05e36d1791..a28d45ebd9 100644
--- a/log4j-jpl.html
+++ b/log4j-jpl.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-jul.html b/log4j-jul.html
index 7637b901f4..46c48a41d4 100644
--- a/log4j-jul.html
+++ b/log4j-jul.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-slf4j-impl.html b/log4j-slf4j-impl.html
index 0c48966e8d..98ad8fdbc2 100644
--- a/log4j-slf4j-impl.html
+++ b/log4j-slf4j-impl.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-slf4j2-impl.html b/log4j-slf4j2-impl.html
index 76f37e9970..b86d6a387e 100644
--- a/log4j-slf4j2-impl.html
+++ b/log4j-slf4j2-impl.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-spring-cloud-config-client.html b/log4j-spring-cloud-config-client.html
index b2b1e17232..660162e6e8 100644
--- a/log4j-spring-cloud-config-client.html
+++ b/log4j-spring-cloud-config-client.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-to-jul.html b/log4j-to-jul.html
index de20cd66c4..ecd4e4b48c 100644
--- a/log4j-to-jul.html
+++ b/log4j-to-jul.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/log4j-to-slf4j.html b/log4j-to-slf4j.html
index 7577b53552..6f9d8d1bc2 100644
--- a/log4j-to-slf4j.html
+++ b/log4j-to-slf4j.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="manual/customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="manual/appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="manual/appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/manual/api.html b/manual/api.html
index acce43eaa5..013f92c917 100644
--- a/manual/api.html
+++ b/manual/api.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
diff --git a/manual/appenders.html b/manual/appenders.html
index 6c45b3139d..508e42d474 100644
--- a/manual/appenders.html
+++ b/manual/appenders.html
@@ -119,7 +119,28 @@
     <a class="nav-link" href="customconfig.html">Programmatic Configuration</a>
   </li>
   <li class="nav-item is-current-page" data-depth="2">
+    <button class="nav-item-toggle"></button>
     <a class="nav-link" href="appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="appenders/delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
   </li>
   <li class="nav-item" data-depth="2">
     <button class="nav-item-toggle"></button>
@@ -280,30 +301,36 @@
 <div id="preamble">
 <div class="sectionbody">
 <div class="paragraph">
-<p>Appenders are responsible for delivering LogEvents to their destination.
+<p>Appenders are responsible for delivering log events to their destination.
 Every Appender must implement the
 <a href="../javadoc/log4j-core/org/apache/logging/log4j/core/Appender.html"><code>Appender</code></a>
-interface.
-Most Appenders will extend
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/AbstractAppender.html"><code>AbstractAppender</code></a>
-which adds
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/LifeCycle.html"><code>Lifecycle</code></a>
-and
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/filter/Filterable.html"><code>Filterable</code></a>
-support. <code>Lifecycle</code> allows components to finish initialization after configuration has been completed and to perform cleanup during shutdown.
-<code>Filterable</code> allows the component to have <code>Filter</code> attached to it which are evaluated during event processing.</p>
+interface.</p>
 </div>
 <div class="paragraph">
-<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" class="xref page">layout</a>.
-Some appenders wrap other appenders so that they can modify the <code>LogEvent</code>, handle a failure in an <code>Appender</code>, route the event to a subordinate <code>Appender</code> based on advanced <code>Filter</code> criteria or provide similar functionality that does not directly format the event for viewing.</p>
+<p>While not strictly required by the Log4j Core architecture, most appenders inherit from
+<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/AbstractAppender.html"><code>AbstractAppender</code></a>
+and:</p>
 </div>
-<div class="paragraph">
-<p>Appenders always have a name so that they can be referenced from Loggers.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>delegate the filtering of log events to an implementation of
+<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.html"><code>Filter</code></a>.
+See <a href="filters.html" class="xref page">Filters</a> for more information.</p>
+</li>
+<li>
+<p>delegate the formatting of log events to an implementation of
+<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html"><code>Layout</code></a>.
+See <a href="layouts.html" class="xref page">Layouts</a> for more information.</p>
+</li>
+<li>
+<p>only directly handle the writing of log event data to the target destination.</p>
+</li>
+</ul>
 </div>
 <div class="paragraph">
-<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="../javadoc/log4j-core/index.html">Log4j Core</a> unless otherwise noted.</p>
+<p>Appenders always have a name so that they can be referenced from a
+<a href="configuration.html#configuring-loggers" class="xref page">logger configuration</a>.</p>
 </div>
 </div>
 </div>
@@ -311,11 +338,98 @@ For non-JDK classes, these should usually be in <a href="../javadoc/log4j-core/i
 <h2 id="commons-concerns"><a class="anchor" href="#commons-concerns"></a>Common concerns</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="common-properties"><a class="anchor" href="#common-properties"></a>Common properties</h3>
+<h3 id="buffering"><a class="anchor" href="#buffering"></a>Buffering</h3>
+<div class="paragraph">
+<p>Appenders that use stream-like resources (such as files, TCP connections) have an internal
+<a href="https://docs.oracle.com/javase/17/docs/api/java/nio/ByteBuffer.html"><code>ByteBuffer</code></a>
+that can be used to format each log event, before sending it to the underlying resource.
+The buffer is used if:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the
+<a href="systemproperties.html#log4j.gc.enableDirectEncoders" class="xref page"><code>log4j.gc.enableDirectEncoders</code></a>
+configuration property is enabled,</p>
+</li>
+<li>
+<p>or the <a href="#bufferedIo"><code>bufferedIo</code></a> configuration attribute is enabled.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The buffer is flushed to the underlying resource on three occasions:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>if the buffer is full.</p>
+</li>
+<li>
+<p>at the end of each log event batch, if
+<a href="async.html" class="xref page">asynchronous loggers</a>
+or
+<a href="appenders/delegating.html#AsyncAppender" class="xref page">appenders</a>
+are used.</p>
+</li>
+<li>
+<p>at the end of each log event, if the
+<a href="#immediateFlush"><code>immediateFlush</code></a>
+configuration attribute is <code>true</code>.</p>
+</li>
+</ul>
+</div>
 <div class="paragraph">
 <p>These configuration attributes are shared by multiple appenders:</p>
 </div>
 <div class="sect3">
+<h4 id="bufferSize"><a class="anchor" href="#bufferSize"></a><code>bufferSize</code></h4>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 83.3334%;">
+</colgroup>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Type</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Default value</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="systemproperties.html#log4j.gc.encoderByteBufferSize" class="xref page"><code>log4j.gc.encoderByteBufferSize</code></a></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>This configuration attribute specifies the size of the <code>ByteBuffer</code> used by the appender.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="bufferedIo"><a class="anchor" href="#bufferedIo"></a><code>bufferedIo</code></h4>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 83.3334%;">
+</colgroup>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Type</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Default value</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>If set to <code>true</code>, Log4j Core will use an internal <code>ByteBuffer</code> to store log events before sending them.</p>
+</div>
+<div class="paragraph">
+<p>If the <a href="systemproperties.html#log4j.gc.enableDirectEncoders" class="xref page"><code>log4j.gc.enableDirectEncoders</code></a> configuration property is set to <code>true</code>, the internal <code>ByteBuffer</code> will always be used.</p>
+</div>
+</div>
+<div class="sect3">
 <h4 id="immediateFlush"><a class="anchor" href="#immediateFlush"></a><code>immediateFlush</code></h4>
 <table class="tableblock frame-all grid-all stretch">
 <colgroup>
@@ -334,22 +448,17 @@ For non-JDK classes, these should usually be in <a href="../javadoc/log4j-core/i
 </tbody>
 </table>
 <div class="paragraph">
-<p>If set to <code>true</code>, Log4j will flush all Java buffers at the end of each event:</p>
+<p>If set to <code>true</code>, Log4j will flush Log4j Core and Java buffers at the end of each event:</p>
 </div>
 <div class="ulist">
 <ul>
 <li>
-<p>for appenders based on Java&#8217;s
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/OutputStream.html"><code>OutputStream</code></a>
-a call to the <code>OutputStream.flush()</code> method is performed.</p>
+<p>the internal <code>ByteBuffer</code> of the appender will be flushed.</p>
 </li>
 <li>
-<p>if
-<a href="systemproperties.html#log4j.gc.enableDirectEncoders" class="xref page"><code>log4j.gc.enableDirectEncoders</code></a>
-is set to <code>true</code>, many Log4j appenders use a
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/ByteBuffer.html"><code>ByteBuffer</code></a>
-to format log events before sending them to the underlying resource.
-Setting <code>immediateFlush</code> to <code>true</code> flushes these buffers at each event.</p>
+<p>for appenders based on Java&#8217;s
+<a href="https://docs.oracle.com/javase/17/docs/api/java/io/OutputStream.html"><code>OutputStream</code></a>
+a call to the <code>OutputStream.flush()</code> method will be performed.</p>
 </li>
 </ul>
 </div>
@@ -368,13 +477,79 @@ It does not ensure that the operating system writes the event to the underlying
 </tr>
 </table>
 </div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>If you are using
+<a href="async.html" class="xref page">asynchronous loggers</a>
+or
+<a href="appenders/delegating.html#AsyncAppender" class="xref page">appenders</a>, you can set this attribute to <code>false</code>.
+Log4j Core will still flush the internal buffer whenever the log event queue becomes empty.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="exception-handling"><a class="anchor" href="#exception-handling"></a>Exception handling</h3>
+<div class="paragraph">
+<p>By default, Log4j Core uses the
+<a href="https://logging.apache.org/log4j/2.x/manual/status-logger.html">status logger</a>
+to report exceptions that occur in appenders.
+This behavior can be changed using the following configuration property:</p>
+</div>
+<div class="sect3">
+<h4 id="ignoreExceptions"><a class="anchor" href="#ignoreExceptions"></a><code>ignoreExceptions</code></h4>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 83.3334%;">
+</colgroup>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Type</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Default value</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>If <code>false</code> logging exceptions will be forwarded to the caller.
+Otherwise, they will be logged using the
+<a href="https://logging.apache.org/log4j/2.x/manual/status-logger.html">status logger</a>.</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>If logging is important for your business, consider using a
+<a href="appenders/delegating.html#FailoverAppender" class="xref page"><code>Failover</code> Appender</a>
+to redirect log events to a different appender in case of exceptions.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
 </div>
 </div>
 <div class="sect2">
 <h3 id="runtime-evaluation"><a class="anchor" href="#runtime-evaluation"></a>Runtime evaluation of attributes</h3>
 <div class="paragraph">
-<p>The following configuration attributes are also evaluated at runtime,
-so can contain escaped <code>$${...}</code> expressions.</p>
+<p>The following configuration attributes are also evaluated at runtime, so can contain escaped <code>$${...}</code> property substitution expressions.</p>
 </div>
 <table class="tableblock frame-all grid-all stretch">
 <caption class="title">Table 1. List of attributes evaluated at runtime</caption>
@@ -394,53 +569,50 @@ so can contain escaped <code>$${...}</code> expressions.</p>
 </thead>
 <tbody>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#HttpAppender"><code>HttpAppender</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#HttpAppender-element-headers"><code>Property/value</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Log event</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#global-context" class="xref page"><em>global</em></a></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#KafkaAppender"><code>KafkaAppender</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#KafkaAppender-attr-key"><code>key</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/network.html#HttpAppender" class="xref page">HTTP Appender</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/network.html#HttpAppender-element-Property" class="xref page"><code>Property/value</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Log event</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#global-context" class="xref page"><em>global</em></a></p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#NoSQLAppender"><code>NoSQLAppender</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#NoSqlAppender-element-keyValuePairs"><code>KeyValuePair/value</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/database.html#NoSqlAppender" class="xref page">NoSQL Appender</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/database.html#NoSqlAppender-element-KeyValuePair" class="xref page"><code>KeyValuePair/value</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Log event</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#global-context" class="xref page"><em>global</em></a></p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#PropertiesRewritePolicy"><code>PropertiesRewritePolicy</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#PropertiesRewritePolicy-element-properties"><code>Property/value</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/delegating.html#PropertiesRewritePolicy" class="xref page">PropertiesRewrite Policy</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/delegating.html#PropertiesRewritePolicy-element-Property" class="xref page"><code>Property/value</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Log event</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#global-context" class="xref page"><em>global</em></a></p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#Routes"><code>Routes</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>pattern</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/delegating.html#Routes" class="xref page">Routes Container</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/delegating.html#Routes-attr-pattern" class="xref page"><code>pattern</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Log event</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#event-context" class="xref page"><em>log event</em></a></p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#RollingFileAppender"><code>RollingFileAppender</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#RollingFileAppender-attr-filePattern"><code>filePattern</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/rolling-file.html" class="xref page">Rolling File Appenders</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/rolling-file.html#attr-filePattern" class="xref page"><code>filePattern</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Rollover</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#global-context" class="xref page"><em>global</em></a></p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CustomDeleteOnRollover">All <code>Delete</code> actions</a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>basePath</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/rolling-file.html#AbstractPathAction" class="xref page">Optional Rollover Actions</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="appenders/rolling-file.html#AbstractPathAction-attr-basePath" class="xref page"><code>basePath</code></a></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Rollover</p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="lookups.html#global-context" class="xref page"><em>global</em></a></p></td>
 </tr>
 </tbody>
 </table>
 <div class="paragraph">
-<p>The <a href="#Routes"><code>Route</code></a> component of the <a href="#RoutingAppender"><code>RoutingAppender</code></a> is special: its children are evaluated at runtime,
-but they are <strong>not</strong> evaluated at configuration time.
-Inside the <code>Route</code> component you <strong>should not</strong> use escaped <code>$${...}</code> expressions, but only unescaped <code>${...}</code> expressions.</p>
+<p>The
+<a href="appenders/delegating.html#Route" class="xref page"><code>Route</code></a>
+component of the
+<a href="appenders/delegating.html#RoutingAppender" class="xref page">Routing Appender</a>
+is special: its children are evaluated at runtime, but they are <strong>not</strong> evaluated at configuration time.
+Inside the <code>Route</code> component you <strong>should not</strong> use escaped <code>$${...}</code> property substitution expressions, but only unescaped <code>${...}</code> property substitution expressions.</p>
 </div>
 <div class="paragraph">
 <p>See <a href="configuration.html#lazy-property-substitution" class="xref page">runtime property substitution</a> for more details.</p>
@@ -453,6161 +625,679 @@ Inside the <code>Route</code> component you <strong>should not</strong> use esca
 <div class="sectionbody">
 <div class="paragraph">
 <p>Log4j bundles several predefined appenders to assist in several common deployment use cases.
-Following sections explain all these in detail.</p>
+They are documented in separate pages based on their target resource:</p>
 </div>
 <div class="sect2">
-<h3 id="AsyncAppender"><a class="anchor" href="#AsyncAppender"></a><a id="asyncappender"></a> AsyncAppender</h3>
-<div class="paragraph">
-<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>
-</div>
-<div class="paragraph">
-<p>By default, AsyncAppender uses
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/ArrayBlockingQueue.html"><code>java.util.concurrent.ArrayBlockingQueue</code></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#async" class="xref page">tests showed</a> performance may become worse when more threads are logging concurrently.
-Consider using
-<a href="async.html" class="xref page">lock-free Async Loggers</a> for optimal performance.</p>
-</div>
-<div class="admonitionblock note">
+<h3 id="ConsoleAppender"><a class="anchor" href="#ConsoleAppender"></a>Console Appender</h3>
+<div class="paragraph">
+<p>As one might expect, the Console Appender writes its output to either the standard output or standard error output.
+The appender supports four different ways to access the output streams:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>direct</code></dt>
+<dd>
+<p>This mode gives the best performance.
+It can be enabled by setting the <a href="#ConsoleAppender-attr-direct"><code>direct</code></a> attribute to <code>true</code>.</p>
+</dd>
+<dt class="hdlist1"><code>default</code></dt>
+<dd>
+<p>By default, the Console appender uses the values of <code>System.out</code> or <code>System.err</code> present at <strong>configuration time</strong>.
+Any changes to those streams at runtime will be ignored.</p>
+</dd>
+<dt class="hdlist1"><code>follow</code></dt>
+<dd>
+<p>This mode always uses the <strong>current</strong> value of the <code>System.out</code> and <code>System.err</code> streams.
+It can be enabled by setting the <a href="#ConsoleAppender-attr-follow"><code>follow</code></a> attribute to <code>true</code>.</p>
+<div class="admonitionblock tip">
 <table>
 <tr>
 <td class="icon">
-<i class="fa icon-note" title="Note"></i>
+<i class="fa icon-tip" title="Tip"></i>
 </td>
 <td class="content">
 <div class="paragraph">
-<p>Log4j 2 brought the following enhancements to the Log4j 1 async appender:</p>
+<p>This setting might be useful in multi-application environments.
+Some application servers modify <code>System.out</code> and <code>System.err</code> to always point to the currently running application.</p>
 </div>
-<div class="ulist">
-<ul>
-<li>
-<p>all appenders referenced by <code>AsyncAppender</code> flush their buffers to the OS at the end of a batch, when the queue becomes empty.
-This guarantees that the batch of log events is passed to the OS and is a more performant version of the <a href="#immediateFlush"><code>immediateFlush</code></a> attribute.</p>
-<div class="admonitionblock warning">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-warning" title="Warning"></i>
-</td>
-<td class="content">
-Similarly to what happens with the <code>immediateFlush</code> attribute, this does not guarantee that the OS stores the data on the underlying device.
 </td>
 </tr>
 </table>
 </div>
+</dd>
+<dt class="hdlist1"><code>JANSI</code></dt>
+<dd>
+<p>If the application is running on Windows and the
+<a href="https://fusesource.github.io/jansi/">JANSI library</a>
+is available, the Console appender will use JANSI to emulate ANSI sequence support.
+This mode can be enabled by setting the
+<a href="systemproperties.html#log4j.console.jansiEnabled" class="xref page"><code>log4j.console.jansiEnabled</code></a>
+configuration attribute to <code>true</code>.</p>
+<div class="paragraph">
+<p>Additional runtime dependencies are required to use JANSI:</p>
+</div>
+<div id="_tabs_1" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_1_maven" class="tab">
+<p>Maven</p>
 </li>
-<li>
-<p>the type of queue is configurable to allow users to use faster and more performant queues, such as those from the
-<a href="https://github.com/JCTools/JCTools?tab=readme-ov-file#jctools">JCTools</a>
-or
-<a href="https://github.com/conversant/disruptor">Conversant Disruptor</a> projects.</p>
+<li id="_tabs_1_gradle" class="tab">
+<p>Gradle</p>
 </li>
 </ul>
 </div>
-</td>
-</tr>
-</table>
+<div id="_tabs_1_maven--panel" class="tabpanel" aria-labelledby="_tabs_1_maven">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;dependency&gt;
+  &lt;groupId&gt;org.fusesource.jansi&lt;/groupId&gt;
+  &lt;artifactId&gt;jansi&lt;/artifactId&gt;
+  &lt;version&gt;1.18&lt;/version&gt;
+&lt;/dependency&gt;</code></pre>
 </div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 2. AsyncAppender Parameters</caption>
+</div>
+</div>
+<div id="_tabs_1_gradle--panel" class="tabpanel" aria-labelledby="_tabs_1_gradle">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">runtimeOnly 'org.fusesource.jansi:jansi:1.18'</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<table id="ConsoleAppender-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 2. Console Appender configuration attributes</caption>
 <colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 62.5%;">
 </colgroup>
 <thead>
 <tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
+<th class="tableblock halign-left valign-top">Attribute</th>
 <th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
 <th class="tableblock halign-left valign-top">Description</th>
 </tr>
 </thead>
 <tbody>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">AppenderRef</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appenders to invoke
-asynchronously. Multiple AppenderRef elements can be configured.</p></td>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Required</p></th>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">blocking</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-name"></a>name</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the appender.</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">shutdownTimeout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Optional</p></th>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-bufferSize"></a>bufferSize</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="systemproperties.html#log4j.gc.encoderByteBufferSize" class="xref page"><code>8192</code></a></p></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>Specifies the maximum number of events that can be queued. The default
-is 1024. Note that when using a disruptor-style <code>BlockingQueue</code>, this
-buffer size must be a power of 2.</p>
+<p>The size of the
+<a href="https://docs.oracle.com/javase/17/docs/api/java/nio/ByteBuffer.html"><code>ByteBuffer</code></a>
+internally used by the appender.</p>
 </div>
 <div class="paragraph">
-<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 behavior
-is determined by the
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/async/AsyncQueueFullPolicy.html"><code>AsyncQueueFullPolicy</code></a>.</p>
+<p>See <a href="#buffering">Buffering</a> for more details.</p>
 </div></div></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">errorRef</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 &lt;FailoverAppender&gt;&gt;.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">includeLocation</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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".</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">BlockingQueueFactory</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">BlockingQueueFactory</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This element overrides what type of <code>BlockingQueue</code> to use.
-See <a href="#BlockingQueueFactory">below documentation</a> for more details.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<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="systemproperties.html#log4j.async.queueFullPolicy.type" class="xref page"><code>log4j.async.queueFullPolicy.type</code></a>
-and
-<a href="systemproperties.html#log4j.async.queueFullPolicy.discardThreshold" class="xref page"><code>log4j.async.queueFullPolicy.discardThreshold</code></a>.</p>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-direct"></a>direct</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>If set to <code>true</code>, log events will be written directly to either
+<a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileDescriptor.html#out"><code>FileDescriptor.out</code></a>
+or
+<a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileDescriptor.html#err"><code>FileDescriptor.err</code></a>.</p>
 </div>
 <div class="paragraph">
-<p>A typical AsyncAppender configuration might look like this:</p>
+<p>This setting bypasses the buffering of <code>System.out</code> and <code>System.err</code> and might provide a performance comparable to a <a href="appenders/file.html" class="xref page">file appender</a>.</p>
 </div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;File name="MyFile" fileName="logs/app.log"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-    &lt;/File&gt;
-    &lt;Async name="Async"&gt;
-      &lt;AppenderRef ref="MyFile"/&gt;
-    &lt;/Async&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Async"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div id="BlockingQueueFactory" class="paragraph">
-<p>Starting in Log4j 2.7, a custom implementation of <code>BlockingQueue</code> or <code>TransferQueue</code> can be specified using a
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/async/BlockingQueueFactory.html"><code>BlockingQueueFactory</code></a>
-plugin.
-To override the default <code>BlockingQueueFactory</code>, specify the plugin inside an <code>&lt;Async/&gt;</code> element like so:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Configuration name="LinkedTransferQueueExample"&gt;
-  &lt;Appenders&gt;
-    &lt;List name="List"/&gt;
-    &lt;Async name="Async" bufferSize="262144"&gt;
-      &lt;AppenderRef ref="List"/&gt;
-      &lt;LinkedTransferQueue/&gt;
-    &lt;/Async&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root&gt;
-      &lt;AppenderRef ref="Async"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<div class="admonitionblock caution">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-caution" title="Caution"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>If other logging backends or the application itself uses <code>System.out/System.err</code>, setting this to <code>true</code> might cause interleaved output.</p>
 </div>
+</td>
+</tr>
+</table>
 </div>
 <div class="paragraph">
-<p>Log4j ships with the following implementations:</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 3. BlockingQueueFactory Implementations</caption>
-<colgroup>
-<col style="width: 25%;">
-<col style="width: 75%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Plugin Name</th>
-<th class="tableblock halign-left valign-top">Description</th>
+<p>This setting is incompatible with the
+<a href="#ConsoleAppender-attr-follow"><code>follow</code> attribute</a>
+and
+<a href="systemproperties.html#log4j.console.jansiEnabled" class="xref page">JANSI support</a>.</p>
+</div></div></td>
 </tr>
-</thead>
-<tbody>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ArrayBlockingQueue</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This is the default implementation that uses
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/ArrayBlockingQueue.html"><code>ArrayBlockingQueue</code></a>.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-follow"></a>
+follow</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set to <code>true</code>, the appender will honor reassignments of <code>System.out</code> (resp. <code>System.err</code>) via
+<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setOut-java.io.PrintStream-"><code>System.setOut</code></a>
+(resp.
+<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setOut-java.io.PrintStream-"><code>System.setErr</code></a>).</p>
+<p class="tableblock">Otherwise, the value of <code>System.out</code> (resp. <code>System.err</code>) at configuration time will be used.</p>
+<p class="tableblock">This setting is incompatible with the
+<a href="#ConsoleAppender-attr-direct"><code>direct</code> attribute</a>
+and
+<a href="systemproperties.html#log4j.console.jansiEnabled" class="xref page">JANSI support</a>.</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">DisruptorBlockingQueue</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This uses the
-<a href="https://github.com/conversant/disruptor">Conversant Disruptor</a>
-implementation of <code>BlockingQueue</code>. This plugin takes a single optional
-attribute, <code>spinPolicy</code>, which corresponds to the <code>SpinPolicy</code> enum.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-ignoreExceptions"></a>
+ignoreExceptions</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If <code>false</code>, logging exception will be forwarded to the caller of the logging statement.
+Otherwise, they will be ignored.</p>
+<p class="tableblock">Logging exceptions are always also logged to the
+<a href="https://logging.apache.org/log4j/2.x/manual/status-logger.html" class="bare">https://logging.apache.org/log4j/2.x/manual/status-logger.html</a></p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">JCToolsBlockingQueue</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This uses
-<a href="https://jctools.github.io/JCTools/">JCTools</a>, specifically the MPSC
-bounded lock-free queue.
-This implementation is provided by the <code>log4j-jctools</code> artifact.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-immediateFlush"></a>
+immediateFlush</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set to <code>true</code>, the appender will flush its internal buffer and the buffer of the <code>System.out/System.err</code> stream after each log event.</p>
+<p class="tableblock">See <a href="#buffering">Buffering</a> for more details.</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">LinkedTransferQueue</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This uses the new Java 7 implementation
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/LinkedTransferQueue.html"><code>LinkedTransferQueue</code></a>.
-Note that this queue does not use the <code>bufferSize</code> configuration
-attribute from AsyncAppender as <code>LinkedTransferQueue</code> does not support a
-maximum capacity.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-attr-target"></a>
+target</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/ConsoleAppender.Target.html"><code>Target</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/ConsoleAppender.Target.html#SYSTEM_OUT"><code>SYSTEM_OUT</code></a></p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>It specifies which standard output stream to use:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>SYSTEM_OUT</code></dt>
+<dd>
+<p>It uses the standard output.</p>
+</dd>
+<dt class="hdlist1"><code>SYSTEM_ERR</code></dt>
+<dd>
+<p>It uses the standard error output.</p>
+</dd>
+</dl>
+</div></div></td>
 </tr>
 </tbody>
 </table>
-</div>
-<div class="sect2">
-<h3 id="consoleappender"><a class="anchor" href="#consoleappender"></a><a id="ConsoleAppender"></a> ConsoleAppender</h3>
-<div class="paragraph">
-<p>As one might expect, the ConsoleAppender writes its output to either
-<code>System.out</code> or <code>System.err</code> with <code>System.out</code> being the default target.
-A Layout must be provided to format the LogEvent.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 4. ConsoleAppender Parameters</caption>
+<table id="ConsoleAppender-elements" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 3. Common nested elements</caption>
 <colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
+<col style="width: 16.6666%;">
+<col style="width: 16.6666%;">
+<col style="width: 66.6668%;">
 </colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
 <tbody>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Type</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Multiplicity</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Description</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is supplied the default pattern layout of "%m%n" will be used.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-element-Filter"></a>
+<a href="filters.html" class="xref page"><code>Filter</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows filtering log events just before they are formatted and sent.</p>
+<p class="tableblock">See also <a href="filters.html#appender-stage" class="xref page">appender filtering stage</a>.</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">follow</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Identifies whether the appender honors reassignments
-of <code>System.out</code> or <code>System.err</code> via <code>System.setOut</code> or <code>System.setErr</code> made
-after configuration. Note that the follow attribute cannot be used with
-Jansi on Windows. Cannot be used with <code>direct</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">direct</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 a file or other process. Cannot be used with
-Jansi on Windows. Cannot be used with <code>follow</code>. The 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.
-<em>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.</em></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">target</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is
-"SYSTEM_OUT".</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ConsoleAppender-element-Layout"></a>
+<a href="layouts.html" class="xref page"><code>Layout</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Formats log events.</p>
+<p class="tableblock">See <a href="layouts.html" class="xref page">Layouts</a> for more information.</p></td>
 </tr>
 </tbody>
 </table>
 <div class="paragraph">
-<p>A typical Console configuration might look like:</p>
+<p><a href="../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-ConsoleAppender" class="xref page">&#x1F4D6; Plugin reference for <code>Console</code></a></p>
+</div>
+<div class="sect3">
+<h4 id="ConsoleAppender-examples"><a class="anchor" href="#ConsoleAppender-examples"></a>Configuration examples</h4>
+<div class="paragraph">
+<p>A typical configuration in a <strong>development</strong> environment might look like:</p>
+</div>
+<div id="_tabs_2" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_2_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_2_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_2_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_2_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
 </div>
+<div id="_tabs_2_xml--panel" class="tabpanel" aria-labelledby="_tabs_2_xml">
 <div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-dev.xml"><code>log4j2.xml</code></a></div>
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Console name="STDOUT" target="SYSTEM_OUT"&gt;
-      &lt;PatternLayout pattern="%m%n"/&gt;
-    &lt;/Console&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Console name="CONSOLE"&gt;
+  &lt;PatternLayout pattern="%d [%t] %p %c - %m%n"/&gt;
+&lt;/Console&gt;</code></pre>
 </div>
 </div>
 </div>
-<div class="sect2">
-<h3 id="FailoverAppender"><a class="anchor" href="#FailoverAppender"></a>FailoverAppender</h3>
-<div class="paragraph">
-<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>
+<div id="_tabs_2_json--panel" class="tabpanel" aria-labelledby="_tabs_2_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-dev.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"Console": {
+  "name": "CONSOLE",
+  "PatternLayout": {
+    "pattern": "%d [%t] %p %c - %m%n"
+  }
+}</code></pre>
 </div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 5. FailoverAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">primary</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the primary Appender to use.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">failovers</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The names of the secondary Appenders to use.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">retryIntervalSeconds</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The number of seconds that should pass
-before retrying the primary Appender. The default is 60.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">target</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Either "SYSTEM_OUT" or "SYSTEM_ERR". The default is
-"SYSTEM_ERR".</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>A Failover configuration might look like:</p>
 </div>
+</div>
+<div id="_tabs_2_yaml--panel" class="tabpanel" aria-labelledby="_tabs_2_yaml">
 <div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-dev.yaml"><code>log4j2.yaml</code></a></div>
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"
-                 ignoreExceptions="false"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;TimeBasedTriggeringPolicy /&gt;
-    &lt;/RollingFile&gt;
-    &lt;Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false"&gt;
-      &lt;PatternLayout pattern="%m%n"/&gt;
-    &lt;/Console&gt;
-    &lt;Failover name="Failover" primary="RollingFile"&gt;
-      &lt;Failovers&gt;
-        &lt;AppenderRef ref="Console"/&gt;
-      &lt;/Failovers&gt;
-    &lt;/Failover&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Failover"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">Console:
+  name: "CONSOLE"
+  PatternLayout:
+    pattern: "%d [%t] %p %c - %m%n"</code></pre>
 </div>
 </div>
 </div>
-<div class="sect2">
-<h3 id="fileappender"><a class="anchor" href="#fileappender"></a><a id="FileAppender"></a> FileAppender</h3>
-<div class="paragraph">
-<p>The FileAppender is an OutputStreamAppender that writes to the File defined in the <code>fileName</code> parameter.
-The FileAppender uses a FileManager (which extends OutputStreamManager) to 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 configuration and safely write to the same file if Log4j is in a ClassLoader that is common to both of them.</p>
+<div id="_tabs_2_properties--panel" class="tabpanel" aria-labelledby="_tabs_2_properties">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-dev.properties"><code>log4j2.properties</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">appender.0.type = Console
+appender.0.name = CONSOLE
+
+appender.0.layout.type = PatternLayout
+appender.0.layout.pattern = %d [%t] %p %c - %m%n</code></pre>
+</div>
+</div>
 </div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 6. FileAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">append</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferedIO</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 <code>bufferedIO</code>. Performance tests have shown that using
-buffered I/O significantly improves performance, even if <code>immediateFlush</code>
-is enabled.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When <code>bufferedIO</code> is true, this is the buffer size, the
-default is 8192 bytes.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">createOnDemand</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the file to write to. If the file, or any
-of its parent directories, do not exist, they will be created.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>When set to true - the default, each write will be followed by a flush.
-This will guarantee that the data is passed to the operating system for writing;
-it does not guarantee that the data is written to a physical device
-such as a disk drive.</p>
 </div>
-<div class="paragraph">
-<p>Note that if this flag is set to false, and the logging activity is sparse,
-there may be an indefinite delay in the data eventually making it to the
-operating system, because it is held up in a buffer.
-This can cause surprising effects such as the logs not
-appearing in the tail output of a file immediately after writing to the log.</p>
 </div>
 <div class="paragraph">
-<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 passed
-to the operating system but is more efficient.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is supplied the default pattern layout of "%m%n" will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">locking</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
+<p>A typical configuration for a <strong>production</strong> environment might look like</p>
+</div>
+<div id="_tabs_3" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_3_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_3_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_3_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_3_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_3_xml--panel" class="tabpanel" aria-labelledby="_tabs_3_xml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-prod.xml"><code>log4j2.xml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Console name="CONSOLE"
+         direct="true"&gt; <i class="conum" data-value="1"></i><b>(1)</b>
+  &lt;JsonTemplateLayout/&gt; <i class="conum" data-value="2"></i><b>(2)</b>
+&lt;/Console&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_3_json--panel" class="tabpanel" aria-labelledby="_tabs_3_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-prod.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"Console": {
+  "name": "CONSOLE",
+  "direct": true, <i class="conum" data-value="1"></i><b>(1)</b>
+  "JsonTemplateLayout": {} <i class="conum" data-value="2"></i><b>(2)</b>
+}</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_3_yaml--panel" class="tabpanel" aria-labelledby="_tabs_3_yaml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-prod.yaml"><code>log4j2.yaml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">Console:
+  name: "CONSOLE"
+  direct: true <i class="conum" data-value="1"></i><b>(1)</b>
+  JsonTemplateLayout: {} <i class="conum" data-value="2"></i><b>(2)</b></code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_3_properties--panel" class="tabpanel" aria-labelledby="_tabs_3_properties">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/console-prod.properties"><code>log4j2.properties</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">appender.0.type = Console
+appender.0.name = CONSOLE
+<i class="conum" data-value="1"></i><b>(1)</b>
+appender.0.direct = true
+
+<i class="conum" data-value="2"></i><b>(2)</b>
+appender.0.layout.type = JsonTemplateLayout</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="colist arabic">
+<table>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>Improve performance by setting <a href="#ConsoleAppender-attr-direct"><code>direct</code></a> to <code>true</code>.</td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
+<td><i class="conum" data-value="2"></i><b>2</b></td>
+<td>Use a structured layout.
+Additional dependencies are required, see <a href="json-template-layout.html" class="xref page">JSON Template Layout</a>.</td>
 </tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filePermissions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File attribute permissions in POSIX format to apply whenever the file is
-created.</p>
+</table>
 </div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html">POSIX</a>
-file attribute view.</p>
 </div>
-<div class="paragraph">
-<p>Examples: <code>rw-------</code> or <code>rw-rw-rw-</code> etc&#8230;&#8203;</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileOwner</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File owner to define whenever the file is created.</p>
 </div>
+<div class="sect2">
+<h3 id="file-appenders"><a class="anchor" href="#file-appenders"></a>File appenders</h3>
 <div class="paragraph">
-<p>Changing the file&#8217;s owner may be restricted for security reasons 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>File appenders write logs to the filesystem.
+They can be further split into:</p>
 </div>
-<div class="paragraph">
-<p>The underlying files system shall support file
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/FileOwnerAttributeView.html">owner</a>
-attribute view.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileGroup</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File group to define whenever the file is created.</p>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">Single file appenders</dt>
+<dd>
+<p>See <a href="appenders/file.html" class="xref page">File appenders</a> for details.</p>
+</dd>
+<dt class="hdlist1">Rolling file appenders</dt>
+<dd>
+<p>See <a href="appenders/rolling-file.html" class="xref page">Rolling file appenders</a> for details.</p>
+</dd>
+</dl>
 </div>
+</div>
+<div class="sect2">
+<h3 id="database-appenders"><a class="anchor" href="#database-appenders"></a>Database appenders</h3>
 <div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html">POSIX</a>
-file attribute view.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here is a sample File configuration:</p>
+<p>The appenders write log events directly to a database.</p>
 </div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;File name="MyFile" fileName="logs/app.log"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-    &lt;/File&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="MyFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="appenders/database.html#JdbcAppender" class="xref page">JDBC appender</a></dt>
+<dd>
+<p>Sends log events to a JDBC driver</p>
+</dd>
+<dt class="hdlist1"><a href="appenders/database.html#NoSqlAppender" class="xref page">NoSQL appender</a></dt>
+<dd>
+<p>Store log events to a document-oriented database</p>
+</dd>
+</dl>
 </div>
+<div class="paragraph">
+<p>See <a href="appenders/database.html" class="xref page">Database appenders</a> for details.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="FlumeAppender"><a class="anchor" href="#FlumeAppender"></a>FlumeAppender</h3>
+<h3 id="network-appenders"><a class="anchor" href="#network-appenders"></a>Network appenders</h3>
 <div class="paragraph">
-<p><em>This is an optional component supplied in a separate jar.</em></p>
+<p>These appenders use simple network protocols to transmit log events to a remote host.
+The supported network protocols are:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>UDP</code></dt>
+<dt class="hdlist1"><code>TCP</code></dt>
+<dd>
+<p>These are handled by the <a href="appenders/network.html#SocketAppender" class="xref page">Socket Appender</a>.</p>
+</dd>
+<dt class="hdlist1"><code>HTTP</code></dt>
+<dd>
+<p>This is handled by the <a href="appenders/network.html#HttpAppender" class="xref page">HTTP Appender</a>.</p>
+</dd>
+<dt class="hdlist1"><code>SMTP</code></dt>
+<dd>
+<p>This is handled by the <a href="appenders/network.html#HttpAppender" class="xref page">SMTP Appender</a>.</p>
+</dd>
+</dl>
 </div>
 <div class="paragraph">
-<p><a href="https://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>See <a href="appenders/network.html" class="xref page">Network Appenders</a> for details.</p>
+</div>
 </div>
+<div class="sect2">
+<h3 id="message-queue-appenders"><a class="anchor" href="#message-queue-appenders"></a>Message queue appenders</h3>
 <div class="paragraph">
-<p>The Flume Appender supports three modes of operation.</p>
+<p>Message queue appenders forward log events to a message broker.
+The following systems are supported:</p>
 </div>
-<div class="olist arabic">
-<ol class="arabic">
-<li>
-<p>It can act as a remote Flume client which sends Flume events via Avro to a Flume Agent configured with an Avro Source.</p>
-</li>
-<li>
-<p>It can act as an embedded Flume Agent where Flume events pass directly into Flume for processing.</p>
-</li>
-<li>
-<p>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.</p>
-</li>
-</ol>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="appenders/message-queue.html#FlumeAppender" class="xref page">Flume appender</a></dt>
+<dd>
+<p>Forwards log events to an
+<a href="https://flume.apache.org/">Apache Flume</a> server.</p>
+</dd>
+<dt class="hdlist1"><a href="appenders/message-queue.html#JmsAppender" class="xref page">JMS appender</a></dt>
+<dd>
+<p>Forwards log events to a
+<a href="https://jakarta.ee/specifications/messaging/2.0/">Jakarta Message 2.0</a> broker.</p>
+</dd>
+</dl>
 </div>
 <div class="paragraph">
-<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>
+<p>See <a href="appenders/message-queue.html" class="xref page">Message queue appenders</a> for details.</p>
 </div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 7. FlumeAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">agents</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Agent[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 Agent&#8217;s host and port. The specification of agents and
-properties are mutually exclusive. If both are configured an error will
-result.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">agentRetries</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The number of times the agent should be retried
-before failing to a secondary. This parameter is ignored when
-<code>type="persistent"</code> is specified (agents are tried once before failing to
-the next).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">batchSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the number of events that should be sent
-as a batch. The default is 1. <em>This parameter only applies to the Flume
-Appender.</em></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">compress</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When set to true the message body will be compressed
-using gzip</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectTimeoutMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The number of milliseconds Flume will
-wait before timing out the connection.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">dataDir</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">eventPrefix</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The character string to prepend to each event
-attribute to distinguish it from MDC attributes. The default is
-an empty string.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">flumeEventFactory</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">FlumeEventFactory</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Factory that generates the Flume
-events from Log4j events. The default factory is the FlumeAvroAppender
-itself.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is specified RFC5424Layout will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">lockTimeoutRetries</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The number of times to retry if a
-LockConflictException occurs while writing to Berkeley DB. The default
-is 5.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxDelayMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of milliseconds to wait for
-batchSize events before publishing the batch.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcExcludes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A comma-separated list of mdc keys that should be
-excluded from the FlumeEvent. This is mutually exclusive with the
-mdcIncludes attribute.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcIncludes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcRequired</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A comma-separated list of <code>mdc</code> keys that must be
-present in the MDC. If a key is not present a LoggingException will be
-thrown.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcPrefix</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A string that should be prepended to each MDC key to distinguish it from event attributes. The default string is
-"mdc:".</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">properties</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Property[]</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<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>
 </div>
+<div class="sect2">
+<h3 id="ServletAppender"><a class="anchor" href="#ServletAppender"></a>Servlet Appender</h3>
 <div class="paragraph">
-<p>When used to configure in Persistent mode the valid properties are:</p>
+<p>The Servlet appender allows users to forward all logging calls to the
+<a href="https://jakarta.ee/specifications/servlet/5.0/apidocs/jakarta/servlet/servletcontext#log(java.lang.String,java.lang.Throwable)"><code>ServletContext.log()</code></a>
+methods.</p>
 </div>
-<div class="olist arabic">
-<ol class="arabic">
-<li>
-<p><code>keyProvider</code> to specify the name of the plugin to provide the
-secret key for encryption.</p>
-</li>
-</ol>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">requestTimeoutMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The number of milliseconds Flume will
-wait before timing out the request.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
+<div class="admonitionblock caution">
+<table>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">type</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">enumeration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">One of "Avro", "Embedded", or "Persistent" to
-indicate which variation of the Appender is desired.</p></td>
+<td class="icon">
+<i class="fa icon-caution" title="Caution"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The <code>ServletContext.log(String, Throwable)</code> method predates modern logging APIs.
+By using Servlet appender, you typically will not be able to differentiate log events by log level or logger name.</p>
+</div>
+</td>
 </tr>
-</tbody>
 </table>
+</div>
+<div class="paragraph">
+<p>The Servlet Appender has no configuration attributes.</p>
+</div>
+<div class="paragraph">
+<p><a href="../plugin-reference.html#org-apache-logging-log4j_log4j-jakarta-web_org-apache-logging-log4j-web-appender-ServletAppender" class="xref page">&#x1F4D6; Plugin reference for <code>Servlet</code></a></p>
+</div>
 <div class="paragraph">
-<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>
+<p>You can use it by declaring an appender of type <code>Servlet</code> in your configuration file:</p>
+</div>
+<div id="_tabs_4" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_4_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_4_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_4_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_4_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
 </div>
+<div id="_tabs_4_xml--panel" class="tabpanel" aria-labelledby="_tabs_4_xml">
 <div class="listingblock">
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Flume name="eventLogger" compress="true"&gt;
-      &lt;Agent host="192.168.10.101" port="8800"/&gt;
-      &lt;Agent host="192.168.10.102" port="8800"/&gt;
-      &lt;RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/&gt;
-    &lt;/Flume&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="eventLogger"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Servlet name="SERVLET"&gt;
+  &lt;PatternLayout pattern="%m%n" alwaysWriteExceptions="false"/&gt; <i class="conum" data-value="1"></i><b>(1)</b>
+&lt;/Servlet&gt;</code></pre>
 </div>
 </div>
-<div class="paragraph">
-<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>
 </div>
+<div id="_tabs_4_json--panel" class="tabpanel" aria-labelledby="_tabs_4_json">
 <div class="listingblock">
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Flume name="eventLogger" compress="true" type="persistent" dataDir="./logData"&gt;
-      &lt;Agent host="192.168.10.101" port="8800"/&gt;
-      &lt;Agent host="192.168.10.102" port="8800"/&gt;
-      &lt;RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/&gt;
-      &lt;Property name="keyProvider"&gt;MySecretProvider&lt;/Property&gt;
-    &lt;/Flume&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="eventLogger"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">"Servlet": {
+  "name": "SERVLET",
+  "PatternLayout": {
+    "pattern": "%m%n",
+    "alwaysWriteExceptions": false <i class="conum" data-value="1"></i><b>(1)</b>
+  }
+}</code></pre>
 </div>
 </div>
-<div class="paragraph">
-<p>A sample FlumeAppender configuration that is configured with a primary and a secondary agent compresses the body, and formats the body using RFC5424Layout and passes the events to an embedded Flume Agent.</p>
 </div>
+<div id="_tabs_4_yaml--panel" class="tabpanel" aria-labelledby="_tabs_4_yaml">
 <div class="listingblock">
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Flume name="eventLogger" compress="true" type="Embedded"&gt;
-      &lt;Agent host="192.168.10.101" port="8800"/&gt;
-      &lt;Agent host="192.168.10.102" port="8800"/&gt;
-      &lt;RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/&gt;
-    &lt;/Flume&gt;
-    &lt;Console name="STDOUT"&gt;
-      &lt;PatternLayout pattern="%d [%p] %c %m%n"/&gt;
-    &lt;/Console&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Logger name="EventLogger" level="info"&gt;
-      &lt;AppenderRef ref="eventLogger"/&gt;
-    &lt;/Logger&gt;
-    &lt;Root level="warn"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">Servlet:
+  name: "SERVLET"
+  PatternLayout:
+    pattern: "%m%n"
+    alwaysWriteExceptions: false <i class="conum" data-value="1"></i><b>(1)</b></code></pre>
 </div>
 </div>
-<div class="paragraph">
-<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>
 </div>
+<div id="_tabs_4_properties--panel" class="tabpanel" aria-labelledby="_tabs_4_properties">
 <div class="listingblock">
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="error" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Flume name="eventLogger" compress="true" type="Embedded"&gt;
-      &lt;Property name="channels"&gt;file&lt;/Property&gt;
-      &lt;Property name="channels.file.type"&gt;file&lt;/Property&gt;
-      &lt;Property name="channels.file.checkpointDir"&gt;target/file-channel/checkpoint&lt;/Property&gt;
-      &lt;Property name="channels.file.dataDirs"&gt;target/file-channel/data&lt;/Property&gt;
-      &lt;Property name="sinks"&gt;agent1 agent2&lt;/Property&gt;
-      &lt;Property name="sinks.agent1.channel"&gt;file&lt;/Property&gt;
-      &lt;Property name="sinks.agent1.type"&gt;avro&lt;/Property&gt;
-      &lt;Property name="sinks.agent1.hostname"&gt;192.168.10.101&lt;/Property&gt;
-      &lt;Property name="sinks.agent1.port"&gt;8800&lt;/Property&gt;
-      &lt;Property name="sinks.agent1.batch-size"&gt;100&lt;/Property&gt;
-      &lt;Property name="sinks.agent2.channel"&gt;file&lt;/Property&gt;
-      &lt;Property name="sinks.agent2.type"&gt;avro&lt;/Property&gt;
-      &lt;Property name="sinks.agent2.hostname"&gt;192.168.10.102&lt;/Property&gt;
-      &lt;Property name="sinks.agent2.port"&gt;8800&lt;/Property&gt;
-      &lt;Property name="sinks.agent2.batch-size"&gt;100&lt;/Property&gt;
-      &lt;Property name="sinkgroups"&gt;group1&lt;/Property&gt;
-      &lt;Property name="sinkgroups.group1.sinks"&gt;agent1 agent2&lt;/Property&gt;
-      &lt;Property name="sinkgroups.group1.processor.type"&gt;failover&lt;/Property&gt;
-      &lt;Property name="sinkgroups.group1.processor.priority.agent1"&gt;10&lt;/Property&gt;
-      &lt;Property name="sinkgroups.group1.processor.priority.agent2"&gt;5&lt;/Property&gt;
-      &lt;RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/&gt;
-    &lt;/Flume&gt;
-    &lt;Console name="STDOUT"&gt;
-      &lt;PatternLayout pattern="%d [%p] %c %m%n"/&gt;
-    &lt;/Console&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Logger name="EventLogger" level="info"&gt;
-      &lt;AppenderRef ref="eventLogger"/&gt;
-    &lt;/Logger&gt;
-    &lt;Root level="warn"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">appender.0.type = Servlet
+appender.0.name = SERVLET
+appender.0.layout.type = PatternLayout
+appender.0.layout.pattern = %m%n
+<i class="conum" data-value="1"></i><b>(1)</b>
+appender.0.layout.alwaysWriteExceptions = false</code></pre>
 </div>
 </div>
 </div>
-<div class="sect2">
-<h3 id="JDBCAppender"><a class="anchor" href="#JDBCAppender"></a>JDBCAppender</h3>
-<div class="paragraph">
-<p>As of Log4j 2.11.0, JDBC support has moved from the existing module
-<code>log4j-core</code> to the new module <code>log4j-jdbc</code>.</p>
 </div>
-<div class="paragraph">
-<p>The JDBC Appender configured with a <code>DataSource</code> requires JNDI support so as of release 2.17.1 this appender will not function unless <code>log4j2.enableJndiJdbc=true</code> is configured as a system property or environment variable.
-See the <a href="systemproperties.html#log4j.jndi.enableJdbc" class="xref page"><code>log4j.jndi.enableJdbc</code></a> system property.</p>
 </div>
-<div class="paragraph">
-<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&#8217;s built-in type conversion to allow for more data types.</p>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>Encodes events using <a href="pattern-layout.html" class="xref page">Pattern Layout</a> and forwards the call to
+<code>ServletContext.log()</code>.
+Setting <code>alwaysWriteExceptions</code> to <code>false</code> prevents the stacktrace from appearing as both part of the <code>message</code> argument and as <code>throwable</code> argument:
+this usually results in the stacktrace being printed to the log file twice.</td>
+</tr>
+</table>
 </div>
 <div class="paragraph">
-<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 username, and a password.
-Optionally, you can also use properties.</p>
+<p>Additional runtime dependencies are required for using the servlet appender:</p>
 </div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 8. JDBCAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If an integer is greater than 0, this causes the appender
-to buffer log events and flush whenever the buffer reaches this size.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectionSource</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ConnectionSource</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The connection source
-from which database connections should be retrieved.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tableName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the database table to insert
-log events into.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">columnConfigs</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ColumnConfig[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><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 by multiple
-<code>&lt;Column&gt;</code> elements.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">columnMappings</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ColumnMapping[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><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 href="https://logging.apache.org/log4j/2.x/javadoc/log4j-api/org/apache/logging/log4j/util/ReadOnlyStringMap.html"><code>ReadOnlyStringMap</code></a>
-/
-<a href="https://logging.apache.org/log4j/2.x/javadoc/log4j-api/org/apache/logging/log4j/spi/ThreadContextMap.html"><code>ThreadContextMap</code></a>
-or
-<a href="https://logging.apache.org/log4j/2.x/javadoc/log4j-api/org/apache/logging/log4j/spi/ThreadContextStack.html"><code>ThreadContextStack</code></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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFail</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When set to true, log events will not
-wait to try to reconnect and will fail immediately if the JDBC resources
-are not available. New in 2.11.2.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">reconnectIntervalMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If set to a value greater than 0,
-after an error, the JDBCDatabaseManager will attempt to reconnect to the database
-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.11.2.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<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>
-</div>
-<div class="ulist">
+<div id="_tabs_5" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
 <ul>
-<li>
-<p><a href="#JDBCDataSource"><code>&lt;DataSource&gt;</code></a>: Uses JNDI.</p>
-</li>
-<li>
-<p><a href="#JDBCConnectionFactory"><code>&lt;ConnectionFactory&gt;</code></a>: Points to a class-method pair to provide JDBC connections.</p>
-</li>
-<li>
-<p><a href="#JDBCDriverManager"><code>&lt;DriverManager&gt;</code></a>: A quick and dirty way to get off the ground, no connection pooling.</p>
+<li id="_tabs_5_maven" class="tab">
+<p>Maven</p>
 </li>
-<li>
-<p><a href="#JDBCPoolingDriver"><code>&lt;PoolingDriver&gt;</code></a>: Uses Apache Commons DBCP to provide connection pooling.</p>
+<li id="_tabs_5_gradle" class="tab">
+<p>Gradle</p>
 </li>
 </ul>
 </div>
-<table id="JDBCDataSource" class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 9. DataSource Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">jndiName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><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.</p></td>
-</tr>
-</tbody>
-</table>
-<table id="JDBCConnectionFactory" class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 10. ConnectionFactory Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">class</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Class</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The fully qualified name of a class
-containing a static factory method for obtaining JDBC connections.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">method</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Method</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><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>, 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.</p></td>
-</tr>
-</tbody>
-</table>
-<table id="JDBCDriverManager" class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 11. DriverManager Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectionString</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The driver-specific JDBC
-connection string.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">userName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The database user name. You cannot specify both
-properties and a username or password.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">password</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The database password. You cannot specify both
-properties and a username or password.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">driverClassName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The JDBC driver class name. Some old JDBC
-driver can only be discovered by explicitly loading them by class name.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">properties</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Property[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A list of properties. You cannot specify both
-properties and a username or password.</p></td>
-</tr>
-</tbody>
-</table>
-<table id="JDBCPoolingDriver" class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 12. PoolingDriver Parameters (Apache Commons DBCP)</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">DriverManager parameters</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">DriverManager parameters</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">This connection
-source inherits all parameters from the DriverManager connection source.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">poolName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PoolableConnectionFactory</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PoolableConnectionFactory element</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Defines a PoolableConnectionFactory.</p></td>
-</tr>
-</tbody>
-</table>
-<table id="JDBCPoolableConnectionFactory" class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 13. PoolableConnectionFactory Parameters (Apache Commons DBCP)</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">autoCommitOnReturn</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">cacheState</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectionInitSqls</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Strings</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">defaultAutoCommit</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">defaultCatalog</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">defaultQueryTimeoutSeconds</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">defaultReadOnly</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">defaultTransactionIsolation</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">disconnectionSqlCodes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Strings</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fastFailValidation</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxConnLifetimeMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxOpenPreparedStatements</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">poolStatements</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">rollbackOnReturn</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">validationQuery</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">validationQueryTimeoutSeconds</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">See <a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">Apache Commons DBCP configuration</a>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<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>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 14. Column Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the database column.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">pattern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">literal</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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&#8217;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 class="tableblock halign-left valign-top"><p class="tableblock">parameter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<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>
-</div>
-<div class="paragraph">
-<p><code>&lt;ColumnMapping name="instant" parameter="TIMESTAMPADD('MILLISECOND', ?, TIMESTAMP '1970-01-01')"/&gt;</code></p>
-</div>
-<div class="paragraph">
-<p>You can only specify one of <code>literal</code> or <code>parameter</code>.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">isEventTimestamp</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Use this attribute to insert the event
-timestamp in this column, which should be a SQL <code>datetime</code>. 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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">isUnicode</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">isClob</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>).</p></td>
-</tr>
-</tbody>
-</table>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 15. ColumnMapping Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the database column.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">pattern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">literal</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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&#8217;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 class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to format the LogEvent.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">type</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Conversion type name, a fully qualified class name.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here are a couple of sample configurations for the JDBCAppender, as well as a sample factory implementation that uses Commons Pooling and Commons DBCP to pool database connections:</p>
-</div>
+<div id="_tabs_5_maven--panel" class="tabpanel" aria-labelledby="_tabs_5_maven">
 <div class="listingblock">
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="error"&gt;
-  &lt;Appenders&gt;
-    &lt;JDBC name="databaseAppender" tableName="dbo.application_log"&gt;
-      &lt;DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" /&gt;
-      &lt;Column name="eventDate" isEventTimestamp="true" /&gt;
-      &lt;Column name="level" pattern="%level" /&gt;
-      &lt;Column name="logger" pattern="%logger" /&gt;
-      &lt;Column name="message" pattern="%message" /&gt;
-      &lt;Column name="exception" pattern="%ex{full}" /&gt;
-    &lt;/JDBC&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="warn"&gt;
-      &lt;AppenderRef ref="databaseAppender"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
+  &lt;artifactId&gt;log4j-jakarta-web&lt;/artifactId&gt;
+  &lt;version&gt;3.0.0-alpha1&lt;/version&gt;
+  &lt;scope&gt;runtime&lt;/scope&gt;
+&lt;/dependency&gt;</code></pre>
 </div>
 </div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="error"&gt;
-  &lt;Appenders&gt;
-    &lt;JDBC name="databaseAppender" tableName="LOGGING.APPLICATION_LOG"&gt;
-      &lt;ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" /&gt;
-      &lt;Column name="EVENT_ID" literal="LOGGING.APPLICATION_LOG_SEQUENCE.NEXTVAL" /&gt;
-      &lt;Column name="EVENT_DATE" isEventTimestamp="true" /&gt;
-      &lt;Column name="LEVEL" pattern="%level" /&gt;
-      &lt;Column name="LOGGER" pattern="%logger" /&gt;
-      &lt;Column name="MESSAGE" pattern="%message" /&gt;
-      &lt;Column name="THROWABLE" pattern="%ex{full}" /&gt;
-    &lt;/JDBC&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="warn"&gt;
-      &lt;AppenderRef ref="databaseAppender"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
 </div>
+<div id="_tabs_5_gradle--panel" class="tabpanel" aria-labelledby="_tabs_5_gradle">
 <div class="listingblock">
 <div class="content">
-<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">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 interface Singleton {
-        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&lt;PoolableConnection&gt; pool = new GenericObjectPool&lt;PoolableConnection&gt;();
-        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();
-    }
-}</code></pre>
+<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">runtimeOnly 'org.apache.logging.log4j:log4j-jakarta-web:3.0.0-alpha1'</code></pre>
 </div>
 </div>
-<div class="paragraph">
-<p>This appender is <a href="https://logging.apache.org/log4j/2.x/manual/messages.html#MapMessage"><code>MapMessage</code></a>-aware.</p>
 </div>
-<div class="paragraph">
-<p>The following configuration uses no layout to indicate that the appender should match the keys of a <code>MapMessage</code> to the names of
-<code>ColumnMapping`s when setting the values of the Appender&#8217;s SQL INSERT
-statement. This lets you insert rows for custom values in a database
-table based on a Log4j `MapMessage</code> instead of values from <code>LogEvent</code>.</p>
 </div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Configuration status="debug"&gt;
-
-  &lt;Appenders&gt;
-    &lt;Console name="STDOUT"&gt;
-      &lt;PatternLayout pattern="%C{1.} %m %level MDC%X%n"/&gt;
-    &lt;/Console&gt;
-    &lt;Jdbc name="databaseAppender" tableName="dsLogEntry" ignoreExceptions="false"&gt;
-      &lt;DataSource jndiName="java:/comp/env/jdbc/TestDataSourceAppender" /&gt;
-      &lt;ColumnMapping name="Id" /&gt;
-      &lt;ColumnMapping name="ColumnA" /&gt;
-      &lt;ColumnMapping name="ColumnB" /&gt;
-    &lt;/Jdbc&gt;
-  &lt;/Appenders&gt;
-
-  &lt;Loggers&gt;
-    &lt;Logger name="org.apache.logging.log4j.core.appender.db" level="debug" additivity="false"&gt;
-      &lt;AppenderRef ref="databaseAppender" /&gt;
-    &lt;/Logger&gt;
-
-    &lt;Root level="fatal"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-
-&lt;/Configuration&gt;</code></pre>
 </div>
+<div class="paragraph">
+<p>See <a href="#jakarta.adoc" class="xref unresolved">jakarta.adoc</a> for more information.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="jms-appender"><a class="anchor" href="#jms-appender"></a><a id="JMSAppender"></a>JMS Appender</h3>
+<h3 id="delegating-appenders"><a class="anchor" href="#delegating-appenders"></a>Delegating appenders</h3>
 <div class="paragraph">
-<p>The JMS Appender sends the formatted log event to a JMS Destination.</p>
+<p>Delegating appenders are intended to decorate other appenders:</p>
 </div>
-<div class="paragraph">
-<p>The JMS Appender requires JNDI support so as of release 2.17.0, this appender will not function unless <code>log4j2.enableJndiJms=true</code> is configured as a system property or environment variable.
-See the <a href="https://logging.apache.org/log4j/2.x/manual/configuration.html#enableJndiJms">enableJndiJms</a> system property.</p>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="appenders/delegating.html#AsyncAppender" class="xref page">Asynchronous appender</a></dt>
+<dd>
+<p>Perform all I/O on a dedicated thread</p>
+</dd>
+<dt class="hdlist1"><a href="appenders/delegating.html#FailoverAppender" class="xref page">Failover appender</a></dt>
+<dd>
+<p>Provide a backup appender in case an appender fails</p>
+</dd>
+<dt class="hdlist1"><a href="appenders/delegating.html#RewriteAppender" class="xref page">Rewrite appender</a></dt>
+<dd>
+<p>Modify log events prior to delivering them to the target</p>
+</dd>
+<dt class="hdlist1"><a href="appenders/delegating.html#RoutingAppender" class="xref page">Routing appender</a></dt>
+<dd>
+<p>Dynamically choose a different appender for each log event</p>
+</dd>
+</dl>
 </div>
 <div class="paragraph">
-<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 that 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>
+<p>See <a href="appenders/delegating.html" class="xref page">Delegating Appenders</a> for details.</p>
 </div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 16. JMS Appender Parameters</caption>
-<colgroup>
-<col style="width: 16.6666%;">
-<col style="width: 16.6666%;">
-<col style="width: 16.6666%;">
-<col style="width: 50.0002%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Default</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">factoryBindingName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required</em></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name to locate in the Context that provides the <a href="https://download.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html">ConnectionFactory</a>. This can be any subinterface of <code>ConnectionFactory</code> as well.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">factoryName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required</em></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The fully qualified class name that should be used to define the Initial Context Factory as defined in
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/Context.html#INITIAL_CONTEXT_FACTORY"><code>INITIAL_CONTEXT_FACTORY</code></a>.
-If a <code>factoryName</code> is specified without a <code>providerURL</code>, a warning message will be logged as this is likely to cause problems.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required</em></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. <em>New since 2.9, in previous versions SerializedLayout was default.</em></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required</em></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">password</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The password to use to create the JMS connection.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">providerURL</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required</em></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The URL of the provider to use as defined by
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/Context.html#PROVIDER_URL">PROVIDER_URL</a>.
-From Log4j 2.17, only the <code>java:</code> protocol is supported.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">destinationBindingName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required</em></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name to use to locate the <a href="https://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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">securityPrincipalName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the identity of the Principal as specified by
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/Context.html#SECURITY_PRINCIPAL">SECURITY_PRINCIPAL</a>.
-If a securityPrincipalName is specified without <code>securityCredentials</code>, a warning message will be logged as this is likely to cause problems.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">securityCredentials</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The security credentials for the principal as specified by
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/Context.html#SECURITY_CREDENTIALS">SECURITY_CREDENTIALS</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 FailoverAppender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFail</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">reconnectIntervalMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">5000</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">urlPkgPrefixes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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="https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/Context.html#URL_PKG_PREFIXES">URL_PKG_PREFIXES</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">userName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The user ID used to create the JMS connection.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here is a sample JMS Appender configuration:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;JMS name="jmsQueue" destinationBindingName="MyQueue"
-         factoryBindingName="MyQueueConnectionFactory"&gt;
-      &lt;JsonLayout properties="true"/&gt;
-    &lt;/JMS&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="jmsQueue"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>To map your Log4j <code>MapMessage</code> to JMS <code>javax.jms.MapMessage</code>, set the layout of the appender to <code>MessageLayout</code> with <code>&lt;MessageLayout /&gt;</code> (Since 2.9.):</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;JMS name="jmsQueue" destinationBindingName="MyQueue"
-         factoryBindingName="MyQueueConnectionFactory"&gt;
-      &lt;MessageLayout /&gt;
-    &lt;/JMS&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="jmsQueue"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="JPAAppender"><a class="anchor" href="#JPAAppender"></a>JPAAppender</h3>
-<div class="paragraph">
-<p>As of Log4j 2.11.0, JPA support has moved from the existing module <code>log4j-core</code> to the new module <code>log4j-jpa</code>.</p>
-</div>
-<div class="paragraph">
-<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 to be on the classpath.
-It also requires a decorated entity configured to persist to the table desired.</p>
-</div>
-<div class="paragraph">
-<p>If you want to use the default mappings, you can extend <code>org.apache.logging.log4j.core.appender.db.jpa.BasicLogEventEntity</code> and provide an <code>@Id</code> property.
-If you want to significantly customize the mappings, you can extend <code>org.apache.logging.log4j.core.appender.db.jpa.AbstractLogEventWrapperEntity</code>.</p>
-</div>
-<div class="paragraph">
-<p>See the Javadoc or source code for these two classes for more information and examples.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 33.3333%;">
-<col style="width: 33.3334%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 FailoverAppender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If an integer is greater than 0, this causes the appender to buffer log events and flush whenever the buffer reaches this size.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">entityClassName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The fully qualified name of the concrete LogEventWrapperEntity implementation that has JPA annotations mapping it to a database table.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">persistenceUnitName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the JPA persistence unit that should be used for persisting log events.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<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 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>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="error"&gt;
-  &lt;Appenders&gt;
-    &lt;JPA name="databaseAppender" persistenceUnitName="loggingPersistenceUnit"
-         entityClassName="com.example.logging.JpaLogEntity" /&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="warn"&gt;
-      &lt;AppenderRef ref="databaseAppender"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;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"&gt;
-
-  &lt;persistence-unit name="loggingPersistenceUnit" transaction-type="RESOURCE_LOCAL"&gt;
-    &lt;provider&gt;org.eclipse.persistence.jpa.PersistenceProvider&lt;/provider&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.MarkerAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.MessageAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.StackTraceElementAttributeConverter&lt;/class&gt;
-    &lt;class&gt;org.apache.logging.log4j.core.appender.db.jpa.converter.ThrowableAttributeConverter&lt;/class&gt;
-    &lt;class&gt;com.example.logging.JpaLogEntity&lt;/class&gt;
-    &lt;non-jta-data-source&gt;jdbc/LoggingDataSource&lt;/non-jta-data-source&gt;
-    &lt;shared-cache-mode&gt;NONE&lt;/shared-cache-mode&gt;
-  &lt;/persistence-unit&gt;
-
-&lt;/persistence&gt;</code></pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">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.
-}</code></pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">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(final 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();
-    }
-    ...
-}</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="HttpAppender"><a class="anchor" href="#HttpAppender"></a>HttpAppender</h3>
-<div class="paragraph">
-<p>The HttpAppender sends log events over HTTP.
-A Layout must be provided to format the LogEvent.</p>
-</div>
-<div class="paragraph">
-<p>It will set the <code>Content-Type</code> header according to the layout.
-Additional headers can be specified with embedded Property elements.</p>
-</div>
-<div class="paragraph">
-<p>It will also wait for a response from the server, and throw an error if no 2xx response is received.</p>
-</div>
-<div class="paragraph">
-<p>Implemented with
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/HttpURLConnection.html"><code>HttpURLConnection</code></a>.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 17. HttpAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Ssl</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SslConfiguration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains the configuration for the KeyStore and
-TrustStore for https. Optional, uses Java runtime defaults if not
-specified. See <a href="#SSL">SSL</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">verifyHostname</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Whether to verify server hostname against
-certificate. Only valid for https. Optional, defaults to true</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">url</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The URL to use. The URL scheme must be "http" or "https".</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">method</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The HTTP method to use. Optional, default is "POST".</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectTimeoutMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The connect timeout in milliseconds.
-Optional, default is 0 (infinite timeout).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">readTimeoutMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The socket read timeout in milliseconds.
-Optional, default is 0 (infinite timeout).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a id="HttpAppender-element-headers"></a>headers</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Property[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Additional HTTP headers to use.</p>
-<p class="tableblock">The values support
-<a href="configuration.html#lazy-property-substitution" class="xref page">runtime property substitution</a>
-and are evaluated in a
-<a href="lookups.html#global-context" class="xref page"><em>global context</em></a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here is a sample HttpAppender configuration snippet:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration&gt;
-  &lt;!-- ... --&gt;
-  &lt;Appenders&gt;
-    &lt;Http name="Http" url="https://localhost:9200/test/log4j/"&gt;
-      &lt;Property name="X-Java-Runtime" value="$${java:runtime}" /&gt;
-      &lt;JsonTemplateLayout/&gt;
-      &lt;SSL&gt;
-        &lt;KeyStore   location="log4j2-keystore.jks" passwordEnvironmentVariable="KEYSTORE_PASSWORD"/&gt;
-        &lt;TrustStore location="truststore.jks"      passwordFile="${sys:user.home}/truststore.pwd"/&gt;
-      &lt;/SSL&gt;
-    &lt;/Http&gt;
-  &lt;/Appenders&gt;
-  &lt;!-- ... --&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="KafkaAppender"><a class="anchor" href="#KafkaAppender"></a>KafkaAppender</h3>
-<div class="paragraph">
-<p>The KafkaAppender logs events to an <a href="https://kafka.apache.org/">Apache Kafka</a> topic.
-Each log event is sent as a Kafka record.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 14.2857%;">
-<col style="width: 14.2857%;">
-<col style="width: 71.4286%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>topic</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Kafka topic to use. Required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="KafkaAppender-attr-key"></a>key</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The key that will be sent to Kafka with every message.</p>
-<p class="tableblock">Supports
-<a href="configuration.html#lazy-property-substitution" class="xref page">runtime property substitution</a>
-and is evaluated in the
-<a href="lookups.html#event-context" class="xref page"><em>context of the current event</em></a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>filter</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Filter</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>layout</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Layout</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. Required, there is no default. <em>New since 2.9, in previous versions <code>&lt;PatternLayout pattern="%m"/&gt;</code> was default.</em></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender. Required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ignoreExceptions</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>syncSend</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The default is <code>true</code>, causing sends to block until the record has been acknowledged by the Kafka server. When set to <code>false</code>, sends a return immediately, allowing for lower latency and significantly higher throughput. <em>New since 2.8. Be aware that this is a new addition, and it has not been extensively tested.
-Any failure sending to Kafka will be reported as an error to <a href="https://logging.apache.org/log4j/2.x/manual/status-logger.html">status logger</a> and the log event will be dropped (the ignoreExceptions parameter will not be effective).
-Log events may arrive out of order on the Kafka server.</em></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>properties</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Property[]</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">You can set properties in <a href="https://kafka.apache.org/documentation.html#producerconfigs">Kafka producer properties</a>. You need to set the <code>bootstrap.servers</code> property, there are sensible default values for the others. Do not set the <code>value.serializer</code> nor <code>key.serializer</code> properties.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here is a sample KafkaAppender configuration snippet:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration&gt;
-  &lt;!-- ... --&gt;
-  &lt;Appenders&gt;
-    &lt;Kafka name="Kafka" topic="log-test"&gt;
-      &lt;PatternLayout pattern="%date %message"/&gt;
-      &lt;Property name="bootstrap.servers"&gt;localhost:9092&lt;/Property&gt;
-    &lt;/Kafka&gt;
-  &lt;/Appenders&gt;
-  &lt;!-- ... --&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This appender is synchronous by default and will block until the record has been acknowledged by the Kafka server, timeout for this can be set with the <code>timeout.ms</code> property (defaults to 30 seconds).
-Wrap with <a href="https://logging.apache.org/log4j/2.x/manual/appenders.html#AsyncAppender">Async appender</a> and/or set syncSend to <code>false</code> to log asynchronously.</p>
-</div>
-<div class="paragraph">
-<p>This appender requires the <a href="https://kafka.apache.org/">Kafka client library</a>.
-Note that you need to use a version of the Kafka client library matching the Kafka server used.</p>
-</div>
-<div class="paragraph">
-<p><em>Note:</em> Make sure to not let <code>org.apache.kafka</code> log to a Kafka appender on DEBUG level, since that will cause recursive logging:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration&gt;
-  &lt;!-- ... --&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="DEBUG"&gt;
-      &lt;AppenderRef ref="Kafka"/&gt;
-    &lt;/Root&gt;
-    &lt;Logger name="org.apache.kafka" level="INFO" /&gt; &lt;!-- avoid recursive logging --&gt;
-  &lt;/Loggers&gt;
-  &lt;!-- ... --&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="MemoryMappedFileAppender"><a class="anchor" href="#MemoryMappedFileAppender"></a>MemoryMappedFileAppender</h3>
-<div class="paragraph">
-<p><em>New since 2.1. Be aware that this is a new addition, and although it has been tested on several platforms, it does not have as much track record as the other file appenders.</em></p>
-</div>
-<div class="paragraph">
-<p>The MemoryMappedFileAppender maps a part of the specified file into memory and writes log events to this memory, relying on the operating system&#8217;s virtual memory manager to synchronize the changes to the storage device.
-The main benefit of using memory-mapped files is I/O performance.
-Instead of making system calls to write to disk, this appender can simply change the program&#8217;s local memory, which is orders of magnitude faster.
-Also, in most operating systems the memory region mapped is the kernel&#8217;s
-<a href="https://en.wikipedia.org/wiki/Page_cache">page cache</a> (file cache), meaning that no copies need to be created in user space.</p>
-</div>
-<div class="paragraph">
-<p>There is some overhead with mapping a file region into memory, especially very large regions (half a gigabyte or more).
-The default region size is 32 MB, which should strike a reasonable balance between the frequency and the duration of remap operations.</p>
-</div>
-<div class="paragraph">
-<p>Similar to the FileAppender and the RandomAccessFileAppender, MemoryMappedFileAppender uses a MemoryMappedFileManager to actually perform the file I/O. While MemoryMappedFileAppender from different Configurations cannot be shared, the MemoryMappedFileManagers can be if the manager is accessible.
-For example, two web applications in a servlet container can have its own configuration and safely write to the same file if Log4j is in a ClassLoader that is common to both of them.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 18. MemoryMappedFileAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">append</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the file to write to. If the file, or any
-of its parent directories, do not exist, they will be created.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filters</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled
-by this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>When set to true, each write will be followed by a call to
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/MappedByteBuffer.html#force()"><code>MappedByteBuffer#force()</code></a>.
-This will guarantee the data is written to the storage device.</p>
-</div>
-<div class="paragraph">
-<p>The default for this parameter is <code>false</code>. This means that the data is
-written to the storage device even if the Java process crashes, but
-there may be data loss if the operating system crashes.</p>
-</div>
-<div class="paragraph">
-<p>Note that manually forcing a sync on every log event loses most of the
-performance benefits of using a memory-mapped file.</p>
-</div>
-<div class="paragraph">
-<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>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">regionLength</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The length of the mapped region, defaults to 32 MB
-(32 * 1024 * 1024 bytes). This parameter must be a value between 256 and
-1,073,741,824 (1 GB or 2^30); values outside this range will be adjusted
-to the closest valid value. Log4j will round the specified value up to
-the nearest power of two.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is supplied the default pattern layout of "%m%n" will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here is a sample MemoryMappedFile configuration:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;MemoryMappedFile name="MyFile" fileName="logs/app.log"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-    &lt;/MemoryMappedFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="MyFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="NoSQLAppender"><a class="anchor" href="#NoSQLAppender"></a>NoSQLAppender</h3>
-<div class="paragraph">
-<p>The NoSQLAppender writes log events to a NoSQL database using an internal lightweight provider interface.
-Provider implementations currently exist for MongoDB, and writing a custom provider is quite simple.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 19. NoSQLAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If an integer is greater than 0, this causes the appender
-to buffer log events and flush whenever the buffer reaches this size.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">NoSqlProvider</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">NoSQLProvider&lt;C extends NoSQLConnection&lt;W, T extends
-NoSQLObject&lt;W&gt;&gt;&gt;</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The NoSQL provider that provides
-connections to the chosen NoSQL database.</p></td>
-</tr>
-</tbody>
-</table>
-<table id="NoSqlAppender-element-keyValuePairs" class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 20. <code>NoSqlAppender</code>&#8201;&#8212;&#8201;nested elements</caption>
-<colgroup>
-<col style="width: 16.6666%;">
-<col style="width: 16.6666%;">
-<col style="width: 66.6668%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Multiplicity</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a href="../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair" class="xref page"><code>KeyValuePair</code></a></code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Zero or more</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>Adds a simple key/value field to the NoSQL object.</p>
-</div>
-<div class="paragraph">
-<p>The <code>value</code> attribute of the pair supports
-<a href="configuration.html#lazy-property-substitution" class="xref page">runtime property substitution</a>
-using the
-<a href="lookups.html#event-context" class="xref page">current event as context</a>.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>You specify which NoSQL provider to use by specifying the appropriate configuration element within the <code>&lt;NoSql&gt;</code> element.
-The only type currently supported is <code>&lt;MongoDb&gt;</code>.
-To create your custom provider, read the JavaDoc for the <code>NoSQLProvider</code>, <code>NoSQLConnection</code>, and <code>NoSQLObject</code> classes and the documentation about creating Log4j plugins.
-We recommend you review the source code for the MongoDB providers as a guide for creating your provider.</p>
-</div>
-<div class="paragraph">
-<p>The following example demonstrates how log events are persisted in NoSQL databases if represented in a JSON format:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{
-    "level": "WARN",
-    "loggerName": "com.example.application.MyClass",
-    "message": "Something happened that you might want to know about.",
-    "source": {
-        "className": "com.example.application.MyClass",
-        "methodName": "exampleMethod",
-        "fileName": "MyClass.java",
-        "lineNumber": 81
-    },
-    "marker": {
-        "name": "SomeMarker",
-        "parent" {
-            "name": "SomeParentMarker"
-        }
-    },
-    "threadName": "Thread-1",
-    "millis": 1368844166761,
-    "date": "2013-05-18T02:29:26.761Z",
-    "thrown": {
-        "type": "java.sql.SQLException",
-        "message": "Could not insert record. Connection lost.",
-        "stackTrace": [
-                { "className": "org.example.sql.driver.PreparedStatement$1", "methodName": "responder", "fileName": "PreparedStatement.java", "lineNumber": 1049 },
-                { "className": "org.example.sql.driver.PreparedStatement", "methodName": "executeUpdate", "fileName": "PreparedStatement.java", "lineNumber": 738 },
-                { "className": "com.example.application.MyClass", "methodName": "exampleMethod", "fileName": "MyClass.java", "lineNumber": 81 },
-                { "className": "com.example.application.MainClass", "methodName": "main", "fileName": "MainClass.java", "lineNumber": 52 }
-        ],
-        "cause": {
-            "type": "java.io.IOException",
-            "message": "Connection lost.",
-            "stackTrace": [
-                { "className": "java.nio.channels.SocketChannel", "methodName": "write", "fileName": null, "lineNumber": -1 },
-                { "className": "org.example.sql.driver.PreparedStatement$1", "methodName": "responder", "fileName": "PreparedStatement.java", "lineNumber": 1032 },
-                { "className": "org.example.sql.driver.PreparedStatement", "methodName": "executeUpdate", "fileName": "PreparedStatement.java", "lineNumber": 738 },
-                { "className": "com.example.application.MyClass", "methodName": "exampleMethod", "fileName": "MyClass.java", "lineNumber": 81 },
-                { "className": "com.example.application.MainClass", "methodName": "main", "fileName": "MainClass.java", "lineNumber": 52 }
-            ]
-        }
-    },
-    "contextMap": {
-        "ID": "86c3a497-4e67-4eed-9d6a-2e5797324d7b",
-        "username": "JohnDoe"
-    },
-    "contextStack": [
-        "topItem",
-        "anotherItem",
-        "bottomItem"
-    ]
-}</code></pre>
-</div>
-</div>
-<div class="sect3">
-<h4 id="NoSQLAppenderMongoDB"><a class="anchor" href="#NoSQLAppenderMongoDB"></a>NoSQL providers for MongoDB</h4>
-<div class="sect4">
-<h5 id="mongo-installation"><a class="anchor" href="#mongo-installation"></a>Installation</h5>
-<div class="paragraph">
-<p>Starting with version 2.11.0, Log4j supplies providers for the
-<a href="https://www.mongodb.com/">MongoDB</a>
-NoSQL database engine, based on the
-<a href="https://www.mongodb.com/docs/drivers/java/sync/current/">MongoDB synchronous Java driver</a>.
-The choice of the provider to user depends on:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>the major version of the MongoDB Java driver your application uses: Log4j supports all major versions starting from version 2.</p>
-</li>
-<li>
-<p>the type of driver API used: either the <em>Legacy API</em> or the <em>Modern API</em>.
-See <a href="https://www.mongodb.com/docs/drivers/java/sync/current/legacy/">MongoDB documentation</a>
-for the difference between APIs.</p>
-</li>
-</ul>
-</div>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>The list of dependencies of your application provides a hint as to which driver API your application is using.
-If your application contains any one of these dependencies, it might use the <strong>Legacy API</strong>:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p><code>org.mongodb:mongo-java-driver</code></p>
-</li>
-<li>
-<p><code>org.mongodb:mongodb-driver-legacy</code></p>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>If you application only uses <code>org.mongodb:mongodb-driver-sync</code>, it uses the <strong>Modern API</strong>.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-<div class="admonitionblock warning">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-warning" title="Warning"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>The version of the MongoDB Java driver is not the same as the version of the MongoDB server.
-See
-<a href="https://www.mongodb.com/docs/drivers/java/sync/current/compatibility/">MongoDB compatibility matrix</a>
-for more information.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-<div class="paragraph">
-<p>In order to use a Log4j MongoDB appender you need to add the following dependencies to your application:</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 21. MongoDB providers compatibility table</caption>
-<colgroup>
-<col style="width: 18.1818%;">
-<col style="width: 18.1818%;">
-<col style="width: 18.1818%;">
-<col style="width: 45.4546%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Driver version</th>
-<th class="tableblock halign-left valign-top">Driver API</th>
-<th class="tableblock halign-left valign-top">Log4j artifact</th>
-<th class="tableblock halign-left valign-top">Notes</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2.x</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Legacy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb2"><code>log4j-mongodb2</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Reached end-of-support.</p>
-<p class="tableblock">Last released version: <code>2.12.4</code></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a id="NoSQLAppenderMongoDB3"></a><code>3.x</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Legacy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb3"><code>log4j-mongodb3</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Reached end-of-support.</p>
-<p class="tableblock">Last released version: <code>2.23.1</code></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>4.x</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Modern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb4"><code>log4j-mongodb4</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Reached end-of-support.</p>
-<p class="tableblock">Last released version: <code>2.23.1</code></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5.x</code> or later</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Modern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb"><code>log4j-mongodb</code></a></p></td>
-<td class="tableblock halign-left valign-top"></td>
-</tr>
-</tbody>
-</table>
-<div class="admonitionblock tip">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-tip" title="Tip"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>If you are note sure, which implementation to choose, <code>log4j-mongodb</code> is the recommended choice.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-</div>
-<div class="sect4">
-<h5 id="log4j-mongodb"><a class="anchor" href="#log4j-mongodb"></a>NoSQL provider for MongoDB (current)</h5>
-<div class="paragraph">
-<p>This section details specializations of the
-<a href="#NoSQLAppender">NoSQLAppender</a> provider for MongoDB using the current MongoDB driver (version 5).
-The NoSQLAppender Appender writes log events to a NoSQL database using an internal lightweight provider interface.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 22. MongoDB Provider Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connection</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The MongoDB
-<a href="http://mongodb.github.io/mongo-java-driver/5.0/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html?is-external=true"">connection string</a>
-in the format <code>mongodb://[username:password@]host1[:port1][,host2[:port2],&#8230;&#8203;[,hostN[:portN]]][/[database.collection][?options]]</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">capped</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Enable support for
-<a href="https://www.mongodb.com/docs/manual/core/capped-collections/">capped
-collections</a></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">collectionSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Specify the size in bytes of the capped collection
-to use if enabled. The minimum size is 4096 bytes, and larger sizes will
-be increased to the nearest integer multiple of 256. See the capped
-collection documentation linked above for more information.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>This appender is <a href="https://logging.apache.org/log4j/2.x/manual/messages.html#MapMessage">MapMessage</a>-aware.</p>
-</div>
-<div class="paragraph">
-<p>Here are a few sample configurations for the NoSQLAppender and MongoDB4 provider:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="WARN"&gt;
-  &lt;Appenders&gt;
-    &lt;NoSql name="MongoDbAppender"&gt;
-      &lt;MongoDb connection="mongodb://log4jUser:12345678@localhost:${sys:MongoDBTestPort:-27017}/testDb.testCollection" /&gt;
-    &lt;/NoSql&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="ALL"&gt;
-      &lt;AppenderRef ref="MongoDbAppender" /&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="WARN"&gt;
-  &lt;Appenders&gt;
-    &lt;NoSql name="MongoDbAppender"&gt;
-      &lt;MongoDb
-        connection="mongodb://localhost:${sys:MongoDBTestPort:-27017}/testDb.testCollection"
-        capped="true"
-        collectionSize="1073741824"/&gt;
-    &lt;/NoSql&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="ALL"&gt;
-      &lt;AppenderRef ref="MongoDbAppender" /&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>You can define additional fields to log using KeyValuePair elements, for example:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="WARN"&gt;
-    &lt;Appenders&gt;
-        &lt;NoSql name="MongoDbAppender"&gt;
-            &lt;MongoDb connection="mongodb://localhost:${sys:MongoDBTestPort:-27017}/testDb.testCollection" /&gt;
-            &lt;KeyValuePair key="A" value="1" /&gt;
-            &lt;KeyValuePair key="B" value="2" /&gt;
-            &lt;KeyValuePair key="env1" value="${env:PATH}" /&gt;
-            &lt;KeyValuePair key="env2" value="$${env:PATH}" /&gt;
-        &lt;/NoSql&gt;
-    &lt;/Appenders&gt;
-    &lt;Loggers&gt;
-        &lt;Root level="ALL"&gt;
-            &lt;AppenderRef ref="MongoDbAppender" /&gt;
-        &lt;/Root&gt;
-    &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="OutputStreamAppender"><a class="anchor" href="#OutputStreamAppender"></a>OutputStreamAppender</h3>
-<div class="paragraph">
-<p>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.</p>
-</div>
-</div>
-<div class="sect2">
-<h3 id="RandomAccessFileAppender"><a class="anchor" href="#RandomAccessFileAppender"></a>RandomAccessFileAppender</h3>
-<div class="paragraph">
-<p>The RandomAccessFileAppender is similar to the standard
-<a href="#FileAppender">[FileAppender]</a> except it is always buffered (this cannot be switched off) and internally it uses a
-<code>ByteBuffer + RandomAccessFile</code> instead of a <code>BufferedOutputStream</code>.
-We saw a 20-200% performance improvement compared to FileAppender with "bufferedIO=true" in our
-measurements.
-Similar to the FileAppender, RandomAccessFileAppender uses a RandomAccessFileManager to perform the file I/O. While RandomAccessFileAppender from different Configurations cannot be shared, the RandomAccessFileManagers can be if the Manager is accessible.
-For example, two web applications in a servlet container can have their configuration and safely write to the same file if Log4j is in a ClassLoader that is common to both of them.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 23. RandomAccessFileAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">append</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the file to write to. If the file, or any
-of its parent directories, do not exist, they will be created.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filters</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled
-by this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>When set to true - the default, each write will be followed by a flush.
-This will guarantee that the data is passed to the operating system for writing;
-it does not guarantee that the data is written to a physical device
-such as a disk drive.</p>
-</div>
-<div class="paragraph">
-<p>Note that if this flag is set to false, and the logging activity is sparse,
-there may be an indefinite delay in the data eventually making it to the
-operating system, because it is held up in a buffer.
-This can cause surprising effects such as the logs not
-appearing in the tail output of a file immediately after writing to the log.</p>
-</div>
-<div class="paragraph">
-<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 passed
-to the operating system but is more efficient.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The buffer size, defaults to 262,144 bytes (256 *
-1024).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is supplied the default pattern layout of "%m%n" will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Here is a sample RandomAccessFile configuration:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RandomAccessFile name="MyFile" fileName="logs/app.log"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-    &lt;/RandomAccessFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="MyFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="RewriteAppender"><a class="anchor" href="#RewriteAppender"></a>RewriteAppender</h3>
-<div class="paragraph">
-<p>The RewriteAppender allows the LogEvent to be 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 RewritePolicy.
-The RewriteAppender should be configured after any Appenders it references to allow it to shut down properly.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 24. RewriteAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">AppenderRef</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appenders to call after the
-LogEvent has been manipulated. Multiple AppenderRef elements can be
-configured.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">rewritePolicy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">RewritePolicy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The RewritePolicy that will manipulate
-the LogEvent.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="sect3">
-<h4 id="RewritePolicy"><a class="anchor" href="#RewritePolicy"></a>RewritePolicy</h4>
-<div class="paragraph">
-<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>
-</div>
-<div class="sect4">
-<h5 id="_maprewritepolicy"><a class="anchor" href="#_maprewritepolicy"></a>MapRewritePolicy</h5>
-<div class="paragraph">
-<p>MapRewritePolicy will evaluate LogEvents that contain a MapMessage and will add or update elements of the Map.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mode</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">"Add" or "Update"</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">keyValuePair</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">KeyValuePair[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">An array of keys and their values.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>The following configuration shows a RewriteAppender configured to add a product key and its value to the MapMessage.:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Console name="STDOUT" target="SYSTEM_OUT"&gt;
-      &lt;PatternLayout pattern="%m%n"/&gt;
-    &lt;/Console&gt;
-    &lt;Rewrite name="rewrite"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-      &lt;MapRewritePolicy mode="Add"&gt;
-        &lt;KeyValuePair key="product" value="TestProduct"/&gt;
-      &lt;/MapRewritePolicy&gt;
-    &lt;/Rewrite&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Rewrite"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect4">
-<h5 id="PropertiesRewritePolicy"><a class="anchor" href="#PropertiesRewritePolicy"></a>PropertiesRewritePolicy</h5>
-<div class="paragraph">
-<p>PropertiesRewritePolicy will add properties configured on the policy to the ThreadContext Map being logged.
-The properties will not be added to the actual ThreadContext Map.
-The property values may contain variables that will be evaluated when the configuration is processed as well as when the event is logged.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a id="PropertiesRewritePolicy-element-properties"></a>properties</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Property[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">One of more Property elements to define the keys and values to be added to the ThreadContext Map.</p>
-<p class="tableblock">The <code>value</code> attribute of each <code>Property</code> element supports
-<a href="configuration.html#lazy-property-substitution" class="xref page">runtime property substitution</a>
-in the
-<a href="lookups.html#global-context" class="xref page"><em>global context</em></a>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>The following configuration shows a RewriteAppender configured to add a product key and its value to the MapMessage:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Console name="STDOUT" target="SYSTEM_OUT"&gt;
-      &lt;PatternLayout pattern="%m%n"/&gt;
-    &lt;/Console&gt;
-    &lt;Rewrite name="rewrite"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-      &lt;PropertiesRewritePolicy&gt;
-        &lt;Property name="user"&gt;${sys:user.name}&lt;/Property&gt;
-        &lt;Property name="env"&gt;${sys:environment}&lt;/Property&gt;
-      &lt;/PropertiesRewritePolicy&gt;
-    &lt;/Rewrite&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Rewrite"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_loggernamelevelrewritepolicy"><a class="anchor" href="#_loggernamelevelrewritepolicy"></a>LoggerNameLevelRewritePolicy</h5>
-<div class="paragraph">
-<p>You can use this policy to make loggers in third-party code less chatty by changing event levels.
-The LoggerNameLevelRewritePolicy will rewrite log event levels for a given logger name prefix.
-You configure a LoggerNameLevelRewritePolicy with a logger name prefix and a pair of levels, where a pair defines a source level and a target level.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">logger</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A logger name used as a prefix to test each event&#8217;s
-logger name.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">LevelPair</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">KeyValuePair[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">An array of keys and their values, each key
-is a source level, each value a target level.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>The following configuration shows a RewriteAppender configured to map level INFO to DEBUG and level WARN to INFO for all loggers that start with <code>com.foo.bar</code>.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Console name="STDOUT" target="SYSTEM_OUT"&gt;
-      &lt;PatternLayout pattern="%m%n"/&gt;
-    &lt;/Console&gt;
-    &lt;Rewrite name="rewrite"&gt;
-      &lt;AppenderRef ref="STDOUT"/&gt;
-      &lt;LoggerNameLevelRewritePolicy logger="com.foo.bar"&gt;
-        &lt;KeyValuePair key="INFO" value="DEBUG"/&gt;
-        &lt;KeyValuePair key="WARN" value="INFO"/&gt;
-      &lt;/LoggerNameLevelRewritePolicy&gt;
-    &lt;/Rewrite&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Rewrite"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="rollingfileappender"><a class="anchor" href="#rollingfileappender"></a><a id="RollingFileAppender"></a> RollingFileAppender</h3>
-<div class="paragraph">
-<p>The RollingFileAppender is an OutputStreamAppender that writes to the file named in the fileName parameter and rolls the file over according to the <code>TriggeringPolicy</code> and the <code>RolloverPolicy</code>.
-The <code>RollingFileAppender</code>
-uses a <code>RollingFileManager</code> (which extends <code>OutputStreamManager</code>) to perform the file I/O and perform the rollover.
-While <code>RolloverFileAppenders</code> from different Configurations cannot be shared, the <code>RollingFileManagers</code> can be if the Manager is accessible.
-For example, two web applications in a servlet container can have their configuration and safely write to the same file if Log4j is in a
-<code>ClassLoader</code> that is common to both of them.</p>
-</div>
-<div class="paragraph">
-<p>A RollingFileAppender requires a <a href="#TriggeringPolicy">[TriggeringPolicy]</a> and a <a href="#RolloverStrategies">RolloverStrategies</a>.
-The triggering policy determines if a rollover should be performed while the <code>RolloverStrategy</code>
-defines how the rollover should be done.
-If no <code>RolloverStrategy</code> is configured, <code>RollingFileAppender</code> will use the
-<a href="#DefaultRolloverStrategy">DefaultRolloverStrategy</a>.
-Since log4j-2.5, a <a href="#CustomDeleteOnRollover">custom delete action</a> can be configured in the DefaultRolloverStrategy to run at rollover.
-Since 2.8 if no file name is configured then
-<a href="#DirectWriteRolloverStrategy">DirectWriteRolloverStrategy</a> will be used instead of DefaultRolloverStrategy.
-Since log4j-2.9, a
-<a href="#CustomPosixViewAttributeOnRollover">custom POSIX file attribute view action</a> can be configured in the DefaultRolloverStrategy to run at rollover, if not defined, the inherited POSIX file attribute view from the RollingFileAppender will be applied.</p>
-</div>
-<div class="paragraph">
-<p>File locking is not supported by the RollingFileAppender.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 25. RollingFileAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">append</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferedIO</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When bufferedIO is true, this is the buffer size, the
-default is 8192 bytes.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">createOnDemand</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the file to write to. If the file, or any
-of its parent directories, do not exist, they will be created.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a id="RollingFileAppender-attr-filePattern"></a>filePattern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>The pattern of the archived log filename.</p>
-</div>
-<div class="paragraph">
-<p>The format of the pattern is dependent on the <code>RolloverStrategy</code> that is used.
-The standard rollover strategies accept:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p><a href="configuration.html#lazy-property-substitution" class="xref page">runtime lookups</a>,
-which are evaluated in
-<a href="lookups.html#global-context" class="xref page">a global context</a>.</p>
-</li>
-<li>
-<p>a <code>%d{...}</code> pattern, functionally identical to the
-<a href="pattern-layout.html#converter-date" class="xref page">homonymous <code>PatternLayout</code> pattern</a>
-except it uses the actual or inferred timestamp of the <strong>previous</strong> rollover.</p>
-</li>
-<li>
-<p>a <code>%i</code> pattern that expands to the computed index for the archived file.</p>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>All patterns accept also format specifiers, e.g. <code>%03i</code> prints the index as zero-padded number with 3 digits.</p>
-</div>
-<div class="paragraph">
-<p>will accept both a date/time pattern
-compatible with
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/SimpleDateFormat.html"><code>SimpleDateFormat</code></a>
-and/or a %i which represents an integer counter.
-The integer counter
-allows specifying a padding, like %3i for space-padding the counter to
-3 digits or (usually more useful) %03i for zero-padding the counter to
-3 digits.
-The pattern also
-supports interpolation at runtime so any of the Lookups (such as the
-<a href="lookups.html#DateLookup" class="xref page">DateLookup</a>) can be included in the
-pattern.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>When set to true - the default, each write will be followed by a flush.
-This will guarantee that the data is passed to the operating system for writing;
-it does not guarantee that the data is written to a physical device
-such as a disk drive.</p>
-</div>
-<div class="paragraph">
-<p>Note that if this flag is set to false, and the logging activity is sparse,
-there may be an indefinite delay in the data eventually making it to the
-operating system, because it is held up in a buffer.
-This can cause surprising effects such as the logs not
-appearing in the tail output of a file immediately after writing to the log.</p>
-</div>
-<div class="paragraph">
-<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 passed
-to the operating system but is more efficient.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is supplied the default pattern layout of "%m%n" will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">policy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">TriggeringPolicy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The policy to use to determine if a rollover
-should occur.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">strategy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">RolloverStrategy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The strategy to use to determine the name
-and the location of the archive file.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filePermissions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File attribute permissions in POSIX format to apply whenever the file is
-created.</p>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html">POSIX</a>
-file attribute view.</p>
-</div>
-<div class="paragraph">
-<p>Examples: rw------- or rw-rw-rw- etc&#8230;&#8203;</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileOwner</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File owner to define whenever the file is created.</p>
-</div>
-<div class="paragraph">
-<p>Changing the file&#8217;s owner may be restricted for security reasons 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>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support file
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/FileOwnerAttributeView.html">owner</a>
-attribute view.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileGroup</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File group to define whenever the file is created.</p>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html">POSIX</a>
-file attribute view.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect2">
-<h3 id="TriggeringPolicies"><a class="anchor" href="#TriggeringPolicies"></a>TriggeringPolicies</h3>
-<div class="sect3">
-<h4 id="_composite_triggering_policy"><a class="anchor" href="#_composite_triggering_policy"></a>Composite Triggering Policy</h4>
-<div class="paragraph">
-<p>The <code>CompositeTriggeringPolicy</code> combines multiple triggering policies and returns true if any of the configured policies return true.
-The
-<code>CompositeTriggeringPolicy</code> is configured simply by wrapping other policies in a <code>Policies</code> element.</p>
-</div>
-<div class="paragraph">
-<p>For example, the following XML fragment defines policies that rollover the log when the JVM starts when the log size reaches twenty megabytes, and when the current date no longer matches the log&#8217;s start date.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Policies&gt;
-  &lt;OnStartupTriggeringPolicy /&gt;
-  &lt;SizeBasedTriggeringPolicy size="20 MB" /&gt;
-  &lt;TimeBasedTriggeringPolicy /&gt;
-&lt;/Policies&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_cron_triggering_policy"><a class="anchor" href="#_cron_triggering_policy"></a>Cron Triggering Policy</h4>
-<div class="paragraph">
-<p>The <code>CronTriggeringPolicy</code> triggers rollover based on a cron expression.
-This policy is controlled by a timer and is asynchronous in processing log events, so it is possible that log events from the previous or next period may appear at the beginning or end of the log file.
-The <code>filePattern</code> attribute of the Appender should contain a timestamp otherwise the target file will be overwritten on each rollover.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 26. CronTriggeringPolicy Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">schedule</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The cron expression. The expression is the same as
-what is allowed in the Quartz scheduler. See
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/util/CronExpression.html"><code>CronExpression</code></a>
-for a full description of the expression.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">evaluateOnStartup</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">On startup the cron expression will be
-evaluated against the file&#8217;s last modification timestamp. If the cron
-expression indicates a rollover should have occurred between that time
-and the current time the file will be immediately rolled over.</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="_onstartup_triggering_policy"><a class="anchor" href="#_onstartup_triggering_policy"></a>OnStartup Triggering Policy</h4>
-<div class="paragraph">
-<p>The <code>OnStartupTriggeringPolicy</code> policy causes a rollover if the log file is older than the current JVM&#8217;s start time and the minimum file size is met or exceeded.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 27. OnStartupTriggeringPolicy Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">minSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The minimum size the file must have to roll over. A size
-of zero will cause a rollover no matter what the file size is. The
-default value is 1, which will prevent rolling over an empty file.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p><em>Google App Engine note:</em><br>
-When running in Google App Engine, the OnStartup policy causes a rollover if the log file is older than <em>the time when Log4J initialized</em>.
-(Google App Engine restricts access to certain classes so Log4J cannot determine JVM start time with
-<code>java.lang.management.ManagementFactory.getRuntimeMXBean().getStartTime()</code>
-and falls back to Log4J initialization time instead.)</p>
-</div>
-</div>
-<div class="sect3">
-<h4 id="sizebased-triggering-policy"><a class="anchor" href="#sizebased-triggering-policy"></a>SizeBased Triggering Policy</h4>
-<div class="paragraph">
-<p>The <code>SizeBasedTriggeringPolicy</code> causes a rollover once the file has reached the specified size.
-The size can be specified in bytes, with the suffix KB, MB, GB, or TB for example <code>20MB</code>.
-size.
-The size may also contain a fractional value such as <code>1.5 MB</code>.
-The size is evaluated using the Java root Locale so a period must always be used for the fractional unit.
-When combined with a time-based triggering policy the file pattern must contain a <code>%i</code>.
-Otherwise, the target file will be overwritten on every rollover as the SizeBased Triggering Policy will not cause the timestamp value in the file name to change.
-When used without a time-based triggering policy the SizeBased Triggering Policy will cause the timestamp value to change.</p>
-</div>
-</div>
-<div class="sect3">
-<h4 id="timebased-triggering-policy"><a class="anchor" href="#timebased-triggering-policy"></a>TimeBased Triggering Policy</h4>
-<div class="paragraph">
-<p>The <code>TimeBasedTriggeringPolicy</code> causes a rollover once the date/time pattern no longer applies to the active file.
-This policy accepts an
-<code>interval</code> attribute which indicates how frequently the rollover should occur based on the time pattern and a <code>modulate</code> boolean attribute.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 28. TimeBasedTriggeringPolicy Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">interval</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">How often a rollover should occur based on the most
-specific time unit in the date pattern. For example, with a date pattern
-with hours as the most specific item, an increment of 4 rollovers
-would occur every 4 hours. The default value is 1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">modulate</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Indicates whether the interval should be adjusted to
-cause the next rollover to occur on the interval boundary. For example,
-if the item is hours, the current hour is 3 am and the interval is 4
-then the first rollover will occur at 4 am and then the next ones will occur
-at 8 am, noon, 4 pm, etc. The default value is false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxRandomDelay</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Indicates the maximum number of seconds to
-randomly delay a rollover. By default, this is 0 which indicates no
-delay. This setting is useful on servers where multiple applications are
-configured to roll over logfiles at the same time and can spread the
-load of doing so across time.</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-</div>
-<div class="sect2">
-<h3 id="RolloverStrategies"><a class="anchor" href="#RolloverStrategies"></a>RolloverStrategies</h3>
-<div class="sect3">
-<h4 id="DefaultRolloverStrategy"><a class="anchor" href="#DefaultRolloverStrategy"></a>DefaultRolloverStrategy</h4>
-<div class="paragraph">
-<p>Default Rollover Strategy</p>
-</div>
-<div class="paragraph">
-<p>The default rollover strategy accepts both a date/time pattern and an integer from the <code>filePattern</code> attribute specified on the RollingFileAppender itself.
-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", ".zip", ".bz2", ".deflate", ".pack200", or ".xz" the resulting archive will be compressed using the compression scheme that matches the suffix.
-The formats bzip2, Deflate, Pack200 and XZ require
-<a href="https://commons.apache.org/proper/commons-compress/index.html">Apache Commons Compress</a>.
-In addition, XZ requires
-<a href="https://www.tukaani.org/xz/java.html">XZ for Java</a>.
-The pattern may also contain lookup references that can be resolved at runtime such as shown in the example below.</p>
-</div>
-<div class="paragraph">
-<p>The default rollover strategy supports three variations for incrementing the counter.
-To illustrate how it works, suppose that the min attribute is set to 1, the max attribute is set to 3, the file name is "foo.log", and the file name pattern is "foo-%i.log".</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 15%;">
-<col style="width: 15%;">
-<col style="width: 15%;">
-<col style="width: 55%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Number of rollovers</th>
-<th class="tableblock halign-left valign-top">Active output target</th>
-<th class="tableblock halign-left valign-top">Archived log files</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">-</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">All logging is going to the initial file.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-1.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">During the first rollover foo.log is renamed to
-foo-1.log. A new foo.log file is created and starts being written to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-2.log, foo-1.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">During the second rollover foo.log is
-renamed to foo-2.log. A new foo.log file is created and starts being
-written to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-3.log, foo-2.log, foo-1.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">During the third rollover
-foo.log is renamed to foo-3.log. A new foo.log file is created and
-starts being written to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-3.log, foo-2.log, foo-1.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">In the fourth and
-subsequent rollovers, foo-1.log is deleted, foo-2.log is renamed to
-foo-1.log, foo-3.log is renamed to foo-2.log and foo.log is renamed to
-foo-3.log. A new foo.log file is created and starts being written to.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>By way of contrast, when the <code>fileIndex</code> attribute is set to "min" all the other settings are the same the "fixed window" strategy will be performed.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 15%;">
-<col style="width: 15%;">
-<col style="width: 15%;">
-<col style="width: 55%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Number of rollovers</th>
-<th class="tableblock halign-left valign-top">Active output target</th>
-<th class="tableblock halign-left valign-top">Archived log files</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">-</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">All logging is going to the initial file.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-1.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">During the first rollover foo.log is renamed to
-foo-1.log. A new foo.log file is created and starts being written to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-1.log, foo-2.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">During the second rollover foo-1.log
-is renamed to foo-2.log and foo.log is renamed to foo-1.log. A new
-foo.log file is created and starts being written to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-1.log, foo-2.log, foo-3.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">During the third rollover
-foo-2.log is renamed to foo-3.log, foo-1.log is renamed to foo-2.log and
-foo.log is renamed to foo-1.log. A new foo.log file is created and
-starts being written to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">foo-1.log, foo-2.log, foo-3.log</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">In the fourth and
-subsequent rollovers, foo-3.log is deleted, foo-2.log is renamed to
-foo-3.log, foo-1.log is renamed to foo-2.log and foo.log is renamed to
-foo-1.log. A new foo.log file is created and starts being written to.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Finally, as of release 2.8, if the <code>fileIndex</code> attribute is set to <code>nomax</code>
-then the min and max values will be ignored and file numbering will increment by 1 and each rollover will have an incrementally higher value with no maximum number of files.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 29. DefaultRolloverStrategy Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileIndex</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If set to "max" (the default), files with a higher
-index will be newer than files with a smaller index. If set to "min",
-file renaming and the counter will follow the Fixed Window strategy
-described above.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">min</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The minimum value of the counter. The default value is 1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">max</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum value of the counter. Once this value is
-reached older archives will be deleted on subsequent rollovers. The
-default value is 7.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">compressionLevel</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Sets the compression level, 0-9, where 0 =
-none, 1 = best speed, through 9 = best compression. Only implemented for
-ZIP files.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tempCompressedFilePattern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The pattern of the file name of the
-archived log file during compression.</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="DirectWriteRolloverStrategy"><a class="anchor" href="#DirectWriteRolloverStrategy"></a>DirectWriteRolloverStrategy</h4>
-<div class="paragraph">
-<p>DirectWrite Rollover Strategy</p>
-</div>
-<div class="paragraph">
-<p>The DirectWriteRolloverStrategy causes log events to be written directly to files represented by the file pattern.
-With this strategy file renames are not performed.
-If the size-based triggering policy causes multiple files to be written during the specified period they will be numbered starting at one and continually incremented until a time-based rollover occurs.</p>
-</div>
-<div class="paragraph">
-<p>Warning: If the file pattern has a suffix indicating compression should take place the current file will not be compressed when the application is shut down.
-Furthermore, if the time changes such that the file pattern no longer matches the current file it will not be compressed at startup either.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 30. DirectWriteRolloverStrategy Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxFiles</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of files to allow in the period matching
-the file pattern. If the number of files is exceeded the
-oldest file will be deleted. If specified, the value must be greater
-than 1. If the value is less than zero or omitted then the number of
-files will not be limited.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">compressionLevel</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Sets the compression level, 0-9, where 0 =
-none, 1 = best speed, through 9 = best compression. Only implemented for
-ZIP files.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tempCompressedFilePattern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The pattern of the file name of the
-archived log file during compression.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<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:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="logs/app.log"
-                 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy /&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This second example shows a rollover strategy that will keep up to 20 files before removing them.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="logs/app.log"
-                 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy /&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-      &lt;DefaultRolloverStrategy max="20"/&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<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 and will roll every 6 hours when the hour is divisible by 6:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="logs/app.log"
-                 filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy interval="6" modulate="true"/&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This sample configuration uses a RollingFileAppender with both the cron and size-based triggering policies, and writes directly to an unlimited number of archive files.
-The cron trigger causes a rollover every hour while the file size is limited to 250MB:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" filePattern="logs/app-%d{yyyy-MM-dd-HH}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;CronTriggeringPolicy schedule="0 0 * * * ?"/&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This sample configuration is the same as the previous one but limits the number of files saved each hour to 10:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" filePattern="logs/app-%d{yyyy-MM-dd-HH}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;CronTriggeringPolicy schedule="0 0 * * * ?"/&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-      &lt;DirectWriteRolloverStrategy maxFiles="10"/&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="CustomDeleteOnRollover"><a class="anchor" href="#CustomDeleteOnRollover"></a>CustomDeleteOnRollover</h4>
-<div class="paragraph">
-<p>Log Archive Retention Policy: Delete on Rollover</p>
-</div>
-<div class="paragraph">
-<p>Log4j-2.5 introduces a <code>Delete</code> action that gives users more control over what files are deleted at rollover time than what was possible with the DefaultRolloverStrategy <code>max</code> attribute.
-The Delete action lets users configure one or more conditions that select the files to delete relative to a base directory.</p>
-</div>
-<div class="paragraph">
-<p>Note that it is possible to delete any file, not just rolled-over log files, so use this action with care!
-With the <code>testMode</code> parameter you can test your configuration without accidentally deleting the wrong files.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 31. Delete Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">basePath</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> Base path from where to start scanning
-for files to delete.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxDepth</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of levels of directories to visit. A
-value of 0 means that only the starting file (the base path itself) is
-visited unless denied by the security manager. A value of
-Integer.MAX_VALUE indicates that all levels should be visited. The
-default is 1, meaning only the files in the specified base directory.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">followLinks</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Whether to follow symbolic links. Default is
-false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">testMode</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If true, files are not deleted but instead a message
-is printed to the
-<a href="https://logging.apache.org/log4j/2.x/manual/status-logger.html">status logger</a>
-at INFO level. Use this to do a dry run to test if the configuration
-works as expected. The default is false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">pathSorter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathSorter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A plugin implementing the
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/rolling/action/PathSorter.html"><code>PathSorter</code></a>
-interface to sort the files before selecting the files to delete. The
-default is to sort the most recently modified files first.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">pathConditions <a id="DeletePathCondition"></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathCondition[]</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p><em>Required if no ScriptCondition is specified.</em> One or more PathCondition
-elements.</p>
-</div>
-<div class="paragraph">
-<p>If more than one condition is specified, they all need to accept a path
-before it is deleted. Conditions can be nested, in which case the inner
-condition(s) are evaluated only if the outer condition accepts the path.
-If conditions are not nested they may be evaluated in any order.</p>
-</div>
-<div class="paragraph">
-<p>Conditions can also be combined with the logical operators AND, OR and
-NOT by using the <code>IfAll</code>, <code>IfAny</code> and <code>IfNot</code> composite conditions.</p>
-</div>
-<div class="paragraph">
-<p>Users can create custom conditions or use the built-in conditions:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p><a href="#DeleteIfFileName"><code>IfFileName</code></a> - accepts files whose path
-(relative to the base path) matches a
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html">regular expression</a>
-or a
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)">glob</a>.</p>
-</li>
-<li>
-<p><a href="#DeleteIfLastModified"><code>IfLastModified</code></a> - accepts files that are as
-old as or older than the specified
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/rolling/action/Duration.html#parse(CharSequence)">duration</a>.</p>
-</li>
-<li>
-<p><a href="#DeleteIfAccumulatedFileCount"><code>IfAccumulatedFileCount</code></a> - accepts
-paths after some count threshold is exceeded during the file tree walk.</p>
-</li>
-<li>
-<p><a href="#DeleteIfAccumulatedFileSize"><code>IfAccumulatedFileSize</code></a> - accepts
-paths after the accumulated file size threshold is exceeded during the
-file tree walk.</p>
-</li>
-<li>
-<p>IfAll - accepts a path if all nested conditions accept it (logical
-AND). Nested conditions may be evaluated in any order.</p>
-</li>
-<li>
-<p>IfAny - accepts a path if one of the nested conditions accepts it
-(logical OR). Nested conditions may be evaluated in any order.</p>
-</li>
-<li>
-<p>IfNot - accepts a path if the nested condition does not accept it
-(logical NOT).</p>
-</li>
-</ul>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">scriptCondition <a id="DeleteScriptCondition"></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ScriptCondition</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p><em>Required if no PathConditions are specified.</em> A ScriptCondition element
-specifying a script.</p>
-</div>
-<div class="paragraph">
-<p>The ScriptCondition should contain a <a href="#ScriptCondition"><code>Script</code>, <code>ScriptRef</code>, or <code>ScriptFile</code></a> element that specifies the logic to be
-executed. (See also the <a href="filters.html#Script" class="xref page">ScriptFilter</a>
-documentation for more examples of configuring ScriptFiles and
-ScriptRefs.)</p>
-</div>
-<div class="paragraph">
-<p>The script is passed several <a href="#ScriptParameters">parameters</a>,
-including a list of paths found under the base path (up to <code>maxDepth</code>)
-and must return a list with the paths to delete.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-</div>
-</div>
-<div class="sect2">
-<h3 id="DeleteIfFileName"><a class="anchor" href="#DeleteIfFileName"></a>DeleteIfFileName</h3>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 32. IfFileName Condition Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">glob</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required if regex is not specified.</em> Matches the relative
-path (relative to the base path) using a limited pattern language that
-resembles regular expressions but with a
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)">simpler syntax</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">regex</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required if glob not specified.</em> Matches the relative
-path (relative to the base path) using a regular expression as defined
-by the
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html"><code>Pattern</code></a>
-class.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">nestedConditions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathCondition[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">An optional set of nested
-<a href="#DeletePathCondition"><code>PathCondition</code></a>s. If any nested conditions
-exist they all need to accept the file before it is deleted. Nested
-conditions are only evaluated if the outer condition accepts a file (if
-the path name matches).</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect2">
-<h3 id="DeleteIfLastModified"><a class="anchor" href="#DeleteIfLastModified"></a>DeleteIfLastModified</h3>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 33. IfLastModified Condition Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">age</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> Specifies a
-<a href="../javadoc/log4j-core/org/apache/logging/log4j/core/appender/rolling/action/Duration.html#parse(CharSequence)"><code>duration</code></a>.
-The condition accepts files that are as old or older than the specified
-duration.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">nestedConditions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathCondition[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">An optional set of nested
-<a href="#DeletePathCondition"><code>PathCondition</code></a>s. If any nested conditions
-exist they all need to accept the file before it is deleted. Nested
-conditions are only evaluated if the outer condition accepts a file (if
-the file is old enough).</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect2">
-<h3 id="DeleteIfAccumulatedFileCount"><a class="anchor" href="#DeleteIfAccumulatedFileCount"></a>DeleteIfAccumulatedFileCount</h3>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 34. IfAccumulatedFileCount Condition Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">exceeds</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The threshold count from which files will be
-deleted.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">nestedConditions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathCondition[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">An optional set of nested
-<a href="#DeletePathCondition"><code>PathCondition</code></a>s. If any nested conditions
-exist they all need to accept the file before it is deleted. Nested
-conditions are only evaluated if the outer condition accepts a file (if
-the threshold count has been exceeded).</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect2">
-<h3 id="DeleteIfAccumulatedFileSize"><a class="anchor" href="#DeleteIfAccumulatedFileSize"></a>DeleteIfAccumulatedFileSize</h3>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 35. IfAccumulatedFileSize Condition Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">exceeds</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> The threshold accumulated file size from
-which files will be deleted. The size can be specified in bytes, with
-the suffix KB, MB, GB, or TB, for example <code>20MB</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">nestedConditions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathCondition[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">An optional set of nested
-<a href="#DeletePathCondition"><code>PathCondition</code></a>s. If any nested conditions
-exist they all need to accept the file before it is deleted. Nested
-conditions are only evaluated if the outer condition accepts a file (if
-the threshold accumulated file size has been exceeded).</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RollingFileAppender with the cron triggering policy configured to trigger every day at midnight.
-Archives are stored in a directory based on the current year and month.
-All files under the base directory that match the "<strong>/app-</strong>.log.gz" glob and are 60 days old or older are deleted at rollover time.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Properties&gt;
-    &lt;Property name="baseDir"&gt;logs&lt;/Property&gt;
-  &lt;/Properties&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="${baseDir}/app.log"
-          filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz"&gt;
-      &lt;PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /&gt;
-      &lt;CronTriggeringPolicy schedule="0 0 0 * * ?"/&gt;
-      &lt;DefaultRolloverStrategy&gt;
-        &lt;Delete basePath="${baseDir}" maxDepth="2"&gt;
-          &lt;IfFileName glob="*/app-*.log.gz" /&gt;
-          &lt;IfLastModified age="60d" /&gt;
-        &lt;/Delete&gt;
-      &lt;/DefaultRolloverStrategy&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RollingFileAppender with both the time and size-based triggering policies will create up to 100 archives on the same day (1-100) that are stored in a directory based on the current year and month, and will compress each archive using gzip and will roll every hour.
-During every rollover, this configuration will delete files that match "<strong>/app-</strong>.log.gz" and are 30 days old or older, but keep the most recent 100 GB or the most recent 10 files, whichever comes first.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Properties&gt;
-    &lt;Property name="baseDir"&gt;logs&lt;/Property&gt;
-  &lt;/Properties&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="${baseDir}/app.log"
-          filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"&gt;
-      &lt;PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy /&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-      &lt;DefaultRolloverStrategy max="100"&gt;
-        &lt;!--
-        Nested conditions: the inner condition is only evaluated on files
-        for which the outer conditions are true.
-        --&gt;
-        &lt;Delete basePath="${baseDir}" maxDepth="2"&gt;
-          &lt;IfFileName glob="*/app-*.log.gz"&gt;
-            &lt;IfLastModified age="30d"&gt;
-              &lt;IfAny&gt;
-                &lt;IfAccumulatedFileSize exceeds="100 GB" /&gt;
-                &lt;IfAccumulatedFileCount exceeds="10" /&gt;
-              &lt;/IfAny&gt;
-            &lt;/IfLastModified&gt;
-          &lt;/IfFileName&gt;
-        &lt;/Delete&gt;
-      &lt;/DefaultRolloverStrategy&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="ScriptCondition"><a class="anchor" href="#ScriptCondition"></a>ScriptCondition</h3>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 36. ScriptCondition Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">script</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Script, ScriptFile or ScriptRef</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Script element that
-specifies the logic to be executed. The script passes a list of paths
-found under the base path and must return the paths to delete as a
-<code>java.util.List&lt;PathWithAttributes&gt;</code>. See also the
-<a href="filters.html#Script" class="xref page">ScriptFilter</a> documentation for an example of
-how ScriptFiles and ScriptRefs can be configured.</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect2">
-<h3 id="ScriptParameters"><a class="anchor" href="#ScriptParameters"></a>ScriptParameters</h3>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 37. Script Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">basePath</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.nio.file.Path</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The directory from where the Delete
-action started scanning for files to delete. Can be used to relativize
-the paths in the <code>pathList</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">pathList</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.List&lt;PathWithAttributes&gt;</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The list of paths found
-under the base path up to the specified max depth, sorted most recently
-modified files first. The script is free to modify and return this list.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">statusLogger</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">StatusLogger</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The <a href="https://logging.apache.org/log4j/2.x/manual/status-logger.html">status logger</a> that can be used to log
-internal events during script execution.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">configuration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Configuration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Configuration that owns this
-ScriptCondition.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">substitutor</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">StrSubstitutor</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The StrSubstitutor used to replace lookup
-variables.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">?</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Any properties declared in the configuration.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RollingFileAppender with the cron triggering policy configured to trigger every day at midnight.
-Archives are stored in a directory based on the current year and month.
-The script returns a list of rolled-over files under the base directory dated Friday the 13th.
-The Delete action will delete all files returned by the script.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="trace" name="MyApp"&gt;
-  &lt;Properties&gt;
-    &lt;Property name="baseDir"&gt;logs&lt;/Property&gt;
-  &lt;/Properties&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="${baseDir}/app.log"
-          filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd}.log.gz"&gt;
-      &lt;PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /&gt;
-      &lt;CronTriggeringPolicy schedule="0 0 0 * * ?"/&gt;
-      &lt;DefaultRolloverStrategy&gt;
-        &lt;Delete basePath="${baseDir}" maxDepth="2"&gt;
-          &lt;ScriptCondition&gt;
-            &lt;Script name="superstitious" language="groovy"&gt;&lt;![CDATA[
-                import java.nio.file.*;
-
-                def result = [];
-                def pattern = ~/\d*\/app-(\d*)\.log\.gz/;
-
-                pathList.each { pathWithAttributes -&gt;
-                  def relative = basePath.relativize pathWithAttributes.path
-                  statusLogger.trace 'SCRIPT: relative path=' + relative + " (base=$basePath)";
-
-                  // remove files dated Friday the 13th
-
-                  def matcher = pattern.matcher(relative.toString());
-                  if (matcher.find()) {
-                    def dateString = matcher.group(1);
-                    def calendar = Date.parse("yyyyMMdd", dateString).toCalendar();
-                    def friday13th = calendar.get(Calendar.DAY_OF_MONTH) [#13]
-== 13 \
-                                  &amp;&amp; calendar.get(Calendar.DAY_OF_WEEK) [#Calendar]
-== Calendar.FRIDAY;
-                    if (friday13th) {
-                      result.add pathWithAttributes;
-                      statusLogger.trace 'SCRIPT: deleting path ' + pathWithAttributes;
-                    }
-                  }
-                }
-                statusLogger.trace 'SCRIPT: returning ' + result;
-                result;
-              ]]&gt;
-            &lt;/Script&gt;
-          &lt;/ScriptCondition&gt;
-        &lt;/Delete&gt;
-      &lt;/DefaultRolloverStrategy&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="CustomPosixViewAttributeOnRollover"><a class="anchor" href="#CustomPosixViewAttributeOnRollover"></a>CustomPosixViewAttributeOnRollover</h3>
-<div class="paragraph">
-<p>Log Archive File Attribute View Policy: Custom file attribute on Rollover</p>
-</div>
-<div class="paragraph">
-<p>Log4j-2.9 introduces a <code>PosixViewAttribute</code> action that gives users more control over which file attribute permissions, owner and group should be applied.
-The PosixViewAttribute action lets users configure one or more conditions that select the eligible files relative to a base directory.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 38. PosixViewAttribute Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">basePath</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><em>Required.</em> Base path from where to start scanning
-for files to apply attributes.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxDepth</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of levels of directories to visit. A
-value of 0 means that only the starting file (the base path itself) is
-visited unless denied by the security manager. A value of
-Integer.MAX_VALUE indicates that all levels should be visited. The
-default is 1, meaning only the files in the specified base directory.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">followLinks</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Whether to follow symbolic links. Default is
-false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">pathConditions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">PathCondition[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">see <a href="#DeletePathCondition">[DeletePathCondition]</a></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filePermissions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File attribute permissions in POSIX format to apply when action is
-executed.</p>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html"><code>POSIX</code></a>
-file attribute view.</p>
-</div>
-<div class="paragraph">
-<p>Examples: rw------- or rw-rw-rw- etc&#8230;&#8203;</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileOwner</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File owner to define when action is executed.</p>
-</div>
-<div class="paragraph">
-<p>Changing the file&#8217;s owner may be restricted for security reasons 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>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support file
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/FileOwnerAttributeView.html"><code>owner</code></a>
-attribute view.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileGroup</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File group to define when action is executed.</p>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html"><code>POSIX</code></a>
-file attribute view.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RollingFileAppender and defines different POSIX file attribute views for current and rolled log files.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="trace" name="MyApp"&gt;
-  &lt;Properties&gt;
-    &lt;Property name="baseDir"&gt;logs&lt;/Property&gt;
-  &lt;/Properties&gt;
-  &lt;Appenders&gt;
-    &lt;RollingFile name="RollingFile" fileName="${baseDir}/app.log"
-                 filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd}.log.gz"
-                 filePermissions="rw-------"&gt;
-      &lt;PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /&gt;
-      &lt;CronTriggeringPolicy schedule="0 0 0 * * ?"/&gt;
-      &lt;DefaultRolloverStrategy stopCustomActionsOnError="true"&gt;
-        &lt;PosixViewAttribute basePath="${baseDir}/$${date:yyyy-MM}" filePermissions="r--r--r--"&gt;
-            &lt;IfFileName glob="*.gz" /&gt;
-        &lt;/PosixViewAttribute&gt;
-      &lt;/DefaultRolloverStrategy&gt;
-    &lt;/RollingFile&gt;
-  &lt;/Appenders&gt;
-
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="RollingRandomAccessFileAppender"><a class="anchor" href="#RollingRandomAccessFileAppender"></a>RollingRandomAccessFileAppender</h3>
-<div class="paragraph">
-<p>The RollingRandomAccessFileAppender is similar to the standard
-<a href="#RollingFileAppender">[RollingFileAppender]</a> except it is always buffered (this cannot be switched off) and internally it uses a
-<code>ByteBuffer + RandomAccessFile</code> instead of a <code>BufferedOutputStream</code>.
-We saw a 20-200% performance improvement compared to RollingFileAppender with "bufferedIO=true" in our measurements.
-The
-<code>RollingRandomAccessFileAppender</code> writes to the file named in the fileName parameter and rolls the file over according to the TriggeringPolicy and the RolloverPolicy.
-Similar to the RollingFileAppender, RollingRandomAccessFileAppender uses a RollingRandomAccessFileManager to perform the file I/O and perform the rollover.
-While RollingRandomAccessFileAppender from different Configurations cannot be shared, the RollingRandomAccessFileManagers can be if the Manager is accessible.
-For example, two web applications in a servlet container can have their configuration and safely write to the same file if Log4j is in a ClassLoader that is common to both of them.</p>
-</div>
-<div class="paragraph">
-<p>A RollingRandomAccessFileAppender requires a
-<a href="#TriggeringPolicies">triggering policy</a> and a
-<a href="#RolloverStrategies">rollover strategy</a>.
-The triggering policy determines if a rollover should be performed while the <code>RolloverStrategy</code>
-defines how the rollover should be done.
-If no RolloverStrategy is configured, RollingRandomAccessFileAppender will use the
-<a href="#DefaultRolloverStrategy">DefaultRolloverStrategy</a>.
-Since log4j-2.5, a <a href="#CustomDeleteOnRollover">custom delete action</a> can be configured in the DefaultRolloverStrategy to run at rollover.</p>
-</div>
-<div class="paragraph">
-<p>File locking is not supported by the RollingRandomAccessFileAppender.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 39. RollingRandomAccessFileAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">append</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the file to write to. If the file, or any
-of its parent directories, do not exist, they will be created.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filePattern</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/SimpleDateFormat.html"><code>SimpleDateFormat</code></a>
-and/or a %i 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" class="xref page">DateLookup</a> can be included in the
-pattern.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<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>
-</div>
-<div class="paragraph">
-<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>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The buffer size, defaults to 262,144 bytes (256 *
-1024).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout
-is supplied the default pattern layout of "%m%n" will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">policy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">TriggeringPolicy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The policy to use to determine if a rollover
-should occur.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">strategy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">RolloverStrategy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The strategy to use to determine the name
-and the location of the archive file.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filePermissions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File attribute permissions in POSIX format to apply whenever the file is
-created.</p>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html"><code>POSIX</code></a>
-file attribute view.</p>
-</div>
-<div class="paragraph">
-<p>Examples: <code>rw-------</code> or <code>rw-rw-rw-</code> etc&#8230;&#8203;</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileOwner</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File owner to define whenever the file is created.</p>
-</div>
-<div class="paragraph">
-<p>Changing the file&#8217;s owner may be restricted for security reasons 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>
-</div>
-<div class="paragraph">
-<p>The underlying file system shall support file
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/FileOwnerAttributeView.html"><code>owner</code></a>
-attribute view.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">fileGroup</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>File group to define whenever the file is created.</p>
-</div>
-<div class="paragraph">
-<p>The underlying files system shall support
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/file/attribute/PosixFileAttributeView.html"><code>POSIX</code></a>
-file attribute view.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-<div class="sect3">
-<h4 id="_triggering_policies"><a class="anchor" href="#_triggering_policies"></a>Triggering Policies</h4>
-<div class="paragraph">
-<p>See <a href="#TriggeringPolicies">RollingFileAppender Triggering Policies</a>.</p>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_rollover_strategies"><a class="anchor" href="#_rollover_strategies"></a>Rollover Strategies</h4>
-<div class="paragraph">
-<p>See <a href="#RolloverStrategies"><code>RollingFileAppender</code> rollover strategies</a>.</p>
-</div>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RollingRandomAccessFileAppender 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:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/app.log"
-                 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy /&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-    &lt;/RollingRandomAccessFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingRandomAccessFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This second example shows a rollover strategy that will keep up to 20 files before removing them.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/app.log"
-                 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy /&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-      &lt;DefaultRolloverStrategy max="20"/&gt;
-    &lt;/RollingRandomAccessFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingRandomAccessFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RollingRandomAccessFileAppender 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 and will roll every 6 hours when the hour is divisible by 6:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/app.log"
-                 filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"&gt;
-      &lt;PatternLayout&gt;
-        &lt;Pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/Pattern&gt;
-      &lt;/PatternLayout&gt;
-      &lt;Policies&gt;
-        &lt;TimeBasedTriggeringPolicy interval="6" modulate="true"/&gt;
-        &lt;SizeBasedTriggeringPolicy size="250 MB"/&gt;
-      &lt;/Policies&gt;
-    &lt;/RollingRandomAccessFile&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="RollingRandomAccessFile"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="RoutingAppender"><a class="anchor" href="#RoutingAppender"></a>RoutingAppender</h3>
-<div class="paragraph">
-<p>The <code>RoutingAppender</code> 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.
-The <code>RoutingAppender</code> should be configured after any Appenders it references to allow it to shut down properly.</p>
-</div>
-<div class="paragraph">
-<p>You can also configure a <code>RoutingAppender</code> with scripts: you can run a script when the appender starts and when a route is chosen for an log event.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 40. RoutingAppender Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">RewritePolicy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">RewritePolicy</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The RewritePolicy that will manipulate
-the LogEvent.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Routes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Routes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains one or more Route declarations to identify the
-criteria for choosing Appenders.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Script</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Script</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
-<p>This Script runs when Log4j starts the RoutingAppender and returns a
-String Route key to determine the default Route.</p>
-</div>
-<div class="paragraph">
-<p>This script is passed the following variables:</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>|Parameter Name |Type |Description |configuration |Configuration |The active Configuration.</p>
-</div>
-<div class="paragraph">
-<p>|staticVariables |Map |A Map shared between all script invocations for this appender instance.
-This is the same map passed to the Routes Script.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 33.3333%;">
-<col style="width: 33.3334%;">
-</colgroup>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>In this example, the script causes the "ServiceWindows" route to be the default route on Windows and "ServiceOther" on all other operating systems.
-Note that the List Appender is one of our test appenders, any appender can be used, it is only used as a shorthand.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="WARN" name="RoutingTest"&gt;
-  &lt;Appenders&gt;
-    &lt;Routing name="Routing"&gt;
-      &lt;Script name="RoutingInit" language="JavaScript"&gt;&lt;![CDATA[
-        java.lang.System.getProperty("os.name").search("Windows") &gt; -1 ? "ServiceWindows" : "ServiceOther";]]&gt;
-      &lt;/Script&gt;
-      &lt;Routes&gt;
-        &lt;Route key="ServiceOther"&gt;
-          &lt;List name="List1" /&gt;
-        &lt;/Route&gt;
-        &lt;Route key="ServiceWindows"&gt;
-          &lt;List name="List2" /&gt;
-        &lt;/Route&gt;
-      &lt;/Routes&gt;
-    &lt;/Routing&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Routing" /&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="sect3">
-<h4 id="Routes"><a class="anchor" href="#Routes"></a>Routes</h4>
-<div class="paragraph">
-<p>The <code>Routes</code> element accepts a single attribute named "pattern".
-The pattern is evaluated against all the registered Lookups and the result is used to select a <code>Route</code>.
-Each <code>Route</code> may be configured with a key.
-If the key matches the result of evaluating the pattern then that <code>Route</code>
-will be selected.
-If no key is specified on a <code>Route</code> then that <code>Route</code> is the default.
-Only one <code>Route</code> can be configured as the default.</p>
-</div>
-<div class="paragraph">
-<p>The <code>Routes</code> element may contain a <code>Script</code> child element.
-If specified, the
-<code>Script</code> is run for each log event and returns the String Route key to use.</p>
-</div>
-<div class="paragraph">
-<p>You must specify either the pattern attribute or the <code>Script</code> element, but not both.</p>
-</div>
-<div class="paragraph">
-<p>Each <code>Route</code> must reference an <code>Appender</code>.
-If the <code>Route</code> contains a ref attribute then the <code>Route</code> will reference an <code>Appender</code> that was defined in the configuration.
-If the <code>Route</code> contains an <code>Appender</code> definition then an
-<code>Appender</code> will be created within the context of the <code>RoutingAppender</code> and will be reused each time a matching <code>Appender</code> name is referenced through a <code>Route</code>.</p>
-</div>
-<div class="admonitionblock warning">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-warning" title="Warning"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>Lookups in the <strong>children</strong> of the <code>Route</code> component are <strong>not</strong> evaluated at configuration time.
-The substitution is delayed until the <code>Route</code> element is evaluated.
-This means that <code>${...}</code> expression <strong>should not</strong> be escaped as <code>$${...}</code>.</p>
-</div>
-<div class="paragraph">
-<p>See <a href="configuration.html#lazy-property-substitution" class="xref page">lazy property substitution</a> for more details.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-<div class="paragraph">
-<p>This script is passed the following variables:</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 41. RoutingAppender Routes Script Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">configuration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Configuration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The active Configuration.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">staticVariables</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Map</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Map shared between all script invocations for
-this appender instance. This is the same map passed to the Routes
-Script.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">logEvent</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">LogEvent</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The log event.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>In this example, the script runs for each log event and picks a route based on the presence of a Marker named "AUDIT".</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="WARN" name="RoutingTest"&gt;
-  &lt;Appenders&gt;
-    &lt;Console name="STDOUT" target="SYSTEM_OUT" /&gt;
-    &lt;Flume name="AuditLogger" compress="true"&gt;
-      &lt;Agent host="192.168.10.101" port="8800"/&gt;
-      &lt;Agent host="192.168.10.102" port="8800"/&gt;
-      &lt;RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/&gt;
-    &lt;/Flume&gt;
-    &lt;Routing name="Routing"&gt;
-      &lt;Routes&gt;
-        &lt;Script name="RoutingInit" language="JavaScript"&gt;&lt;![CDATA[
-          if (logEvent.getMarker() != null &amp;&amp; logEvent.getMarker().isInstanceOf("AUDIT")) {
-                return "AUDIT";
-            } else if (logEvent.getContextMap().containsKey("UserId")) {
-                return logEvent.getContextMap().get("UserId");
-            }
-            return "STDOUT";]]&gt;
-        &lt;/Script&gt;
-        &lt;Route&gt;
-          &lt;RollingFile
-              name="Rolling-${mdc:UserId}"
-              fileName="${mdc:UserId}.log"
-              filePattern="${mdc:UserId}.%i.log.gz"&gt;
-            &lt;PatternLayout&gt;
-              &lt;pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/pattern&gt;
-            &lt;/PatternLayout&gt;
-            &lt;SizeBasedTriggeringPolicy size="500" /&gt;
-          &lt;/RollingFile&gt;
-        &lt;/Route&gt;
-        &lt;Route ref="AuditLogger" key="AUDIT"/&gt;
-        &lt;Route ref="STDOUT" key="STDOUT"/&gt;
-      &lt;/Routes&gt;
-      &lt;IdlePurgePolicy timeToLive="15" timeUnit="minutes"/&gt;
-    &lt;/Routing&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Routing" /&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="Purge"><a class="anchor" href="#Purge"></a>Purge Policy</h4>
-<div class="paragraph">
-<p>The RoutingAppender can be configured with a PurgePolicy whose purpose is to stop and remove dormant Appenders that have been dynamically created by the RoutingAppender.
-Log4j currently provides the IdlePurgePolicy is the only PurgePolicy available for cleaning up the Appenders.
-The IdlePurgePolicy accepts 2 attributes; timeToLive, which is the number of timeUnits the Appender should survive without having any events sent to it, and timeUnit, the String representation of java.util.concurrent.TimeUnit which is used with the timeToLive attribute.</p>
-</div>
-<div class="paragraph">
-<p>Below is a sample configuration that uses a RoutingAppender to route all Audit events to a FlumeAppender and all other events will be routed to a RollingFileAppender captures only the specific event type.
-Note that the AuditAppender was predefined while the RollingFileAppenders are created as needed.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Flume name="AuditLogger" compress="true"&gt;
-      &lt;Agent host="192.168.10.101" port="8800"/&gt;
-      &lt;Agent host="192.168.10.102" port="8800"/&gt;
-      &lt;RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/&gt;
-    &lt;/Flume&gt;
-    &lt;Routing name="Routing"&gt;
-      &lt;Routes pattern="$${sd:type}"&gt;
-        &lt;Route&gt;
-          &lt;RollingFile name="Rolling-${sd:type}" fileName="${sd:type}.log"
-                       filePattern="${sd:type}.%i.log.gz"&gt;
-            &lt;PatternLayout&gt;
-              &lt;pattern&gt;%d %p %c{1.} [%t] %m%n&lt;/pattern&gt;
-            &lt;/PatternLayout&gt;
-            &lt;SizeBasedTriggeringPolicy size="500" /&gt;
-          &lt;/RollingFile&gt;
-        &lt;/Route&gt;
-        &lt;Route ref="AuditLogger" key="Audit"/&gt;
-      &lt;/Routes&gt;
-      &lt;IdlePurgePolicy timeToLive="15" timeUnit="minutes"/&gt;
-    &lt;/Routing&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Routing"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="SMTPAppender"><a class="anchor" href="#SMTPAppender"></a>SMTPAppender</h3>
-<div class="paragraph">
-<p>Sends an e-mail when a specific logging event occurs, typically on errors or fatal errors.</p>
-</div>
-<div class="paragraph">
-<p>The number of logging events delivered in this e-mail depends on the value of the <code>BufferSize</code> option.
-The <code>SMTPAppender</code> keeps only the last <code>BufferSize</code> logging events in its cyclic buffer.
-This keeps memory requirements at a reasonable level while still delivering useful application context.
-All events in the buffer are included in the email.
-The buffer will contain the most recent events of level TRACE to WARN preceding the event that triggered the email.</p>
-</div>
-<div class="paragraph">
-<p>The default behavior is to trigger sending an email whenever an ERROR or higher severity event is logged and to format it as HTML.
-The circumstances of when the email is sent can be controlled by setting one or more filters on the Appender.
-As with other Appenders, the formatting can be controlled by specifying a Layout for the Appender.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 33.3333%;">
-<col style="width: 33.3334%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">from</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The email address of the sender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">replyTo</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of reply-to email addresses.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">to</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of recipient email addresses.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">cc</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of CC email addresses.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bcc</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of BCC email addresses.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">subject</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The subject of the email message.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of log events to be buffered for inclusion in the message. Defaults to 512.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout is supplied <a href="layouts.html#HTMLLayout" class="xref page">HTML layout</a> will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by this Appender. More than one Filter may be used by using a CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">smtpDebug</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When set to true turns on the session debugging on STDOUT. Defaults to false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">smtpHost</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The SMTP hostname to send to. This parameter is required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">smtpPassword</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The password required to authenticate against the SMTP server.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">smtpPort</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The SMTP port to send to.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">smtpProtocol</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The SMTP transport protocol (such as "smtps", defaults to "smtp").</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">smtpUsername</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The username required to authenticate against the SMTP server.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SSL</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SslConfiguration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains the configuration for the KeyStore and TrustStore. See <a href="#SSL">SSL</a>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;SMTP name="Mail" subject="Error Log" to="errors@logging.apache.org" from="test@logging.apache.org"
-          smtpHost="localhost" smtpPort="25" bufferSize="50"&gt;
-    &lt;/SMTP&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="Mail"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="ScriptAppenderSelector"><a class="anchor" href="#ScriptAppenderSelector"></a>ScriptAppenderSelector</h3>
-<div class="paragraph">
-<p>When the configuration is built, the <code>ScriptAppenderSelector</code> appender calls a <code>ScriptPlugin</code> to compute an appender name.
-Log4j then creates one of the appender named listed under <code>AppenderSet</code> using the name of the
-<code>ScriptAppenderSelector</code>.
-After configuration, Log4j ignores the
-<code>ScriptAppenderSelector</code>.
-Log4j only builds the one selected appender from the configuration tree and ignores other <code>AppenderSet</code> child nodes.</p>
-</div>
-<div class="paragraph">
-<p>In the following example, the script returns the name "List2".
-The appender name is recorded under the name of the
-<code>ScriptAppenderSelector</code>, not the name of the selected appender, in this example, "SelectIt".</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Configuration status="WARN" name="ScriptAppenderSelectorExample"&gt;
-  &lt;Appenders&gt;
-    &lt;ScriptAppenderSelector name="SelectIt"&gt;
-      &lt;Script language="JavaScript"&gt;&lt;![CDATA[
-        java.lang.System.getProperty("os.name").search("Windows") &gt; -1 ? "MyCustomWindowsAppender" : "MySyslogAppender";]]&gt;
-      &lt;/Script&gt;
-      &lt;AppenderSet&gt;
-        &lt;MyCustomWindowsAppender name="MyAppender" ... /&gt;
-        &lt;SyslogAppender name="MySyslog" ... /&gt;
-      &lt;/AppenderSet&gt;
-    &lt;/ScriptAppenderSelector&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="SelectIt" /&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="SocketAppender"><a class="anchor" href="#SocketAppender"></a>SocketAppender</h3>
-<div class="paragraph">
-<p>The <code>SocketAppender</code> 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.
-You can optionally secure communication with <a href="#SSL">SSL</a>.
-Note that the TCP and SSL variants write to the socket as a stream and do not expect a response from the target destination.
-Due to limitations in the TCP protocol that means that when the target server closes its connection some log events may continue to appear to succeed until a closed connection exception is raised, causing those events to be lost.
-If guaranteed delivery is required a protocol that requires acknowledgments must be used.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 42. <code>SocketAppender</code> Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">host</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name or address of the system that is listening for
-log events. This parameter is required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">port</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The port on the host that is listening for log events.
-This parameter must be specified. If the hostname resolves to multiple
-IP addresses the TCP and SSL variations will fail over to the next IP
-address when a connection is lost.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">protocol</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">"TCP" (default), "SSL" or "UDP".</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SSL</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SslConfiguration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains the configuration for the KeyStore and
-TrustStore. See <a href="#SSL">SSL</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFail</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When set to true, log events will not wait to
-try to reconnect and will fail immediately if the socket is not
-available.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferedIO</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When true - the default, events are written to a
-buffer and the data will be written to the socket when the buffer is
-full or, if immediateFlush is set when the record is written.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">bufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When bufferedIO is true, this is the buffer size, the
-default is 8192 bytes.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. Required,
-there is no default. <em>New since 2.9, in previous versions
-SerializedLayout was the default.</em></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">reconnectionDelayMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If set to a value greater than 0,
-after an error, the SocketManager will attempt to reconnect to the server
-after waiting for 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>).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectTimeoutMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The connect timeout in milliseconds. The
-default is 0 (infinite timeout, like <code>Socket.connect()</code> methods).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>This is an unsecured TCP configuration:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Socket name="socket" host="localhost" port="9500"&gt;
-      &lt;JsonTemplateLayout/&gt;
-    &lt;/Socket&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="socket"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This is a secured <a href="#SSL">SSL</a> configuration:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Socket name="socket" host="localhost" port="9500"&gt;
-      &lt;JsonTemplateLayout/&gt;
-      &lt;SSL&gt;
-        &lt;KeyStore location="log4j2-keystore.jks" passwordEnvironmentVariable="KEYSTORE_PASSWORD"/&gt;
-        &lt;TrustStore location="truststore.jks" passwordFile="${sys:user.home}/truststore.pwd"/&gt;
-      &lt;/SSL&gt;
-    &lt;/Socket&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="socket"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="SSL"><a class="anchor" href="#SSL"></a>SSL</h3>
-<div class="paragraph">
-<p>Several appenders can be configured to use either a plain network connection or a Secure Socket Layer (SSL) connection.
-This section documents the parameters available for SSL configuration.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 43. SSL Configuration Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">protocol</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The SSL protocol to use, <code>TLS</code> if omitted. A single value
-may enable multiple protocols, see the
-<a href="https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#sslcontext-algorithms">JVM
-documentation</a> for details.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">KeyStore</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">KeyStore</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains your private keys and certificates, and
-determines which authentication credentials to send to the remote host.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">TrustStore</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">TrustStore</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains the CA certificates of the remote
-counterparty. Determines whether the remote authentication credentials
-(and thus the connection) should be trusted.</p></td>
-</tr>
-</tbody>
-</table>
-<div class="sect3">
-<h4 id="KeyStore"><a class="anchor" href="#KeyStore"></a>KeyStore</h4>
-<div class="paragraph">
-<p>The Keystore is meant to contain your private keys and certificates, and determines which authentication credentials to send to the remote host.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 44. KeyStore Configuration Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">location</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Path to the keystore file.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">password</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">char[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Plain text password to access the keystore. Cannot be
-combined with either <code>passwordEnvironmentVariable</code> or <code>passwordFile</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">passwordEnvironmentVariable</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Name of an environment variable
-that holds the password. Cannot be combined with either <code>password</code> or
-<code>passwordFile</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">passwordFile</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Path to a file that holds the password. Cannot be
-combined with either <code>password</code> or <code>passwordEnvironmentVariable</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">type</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Optional KeyStore type, e.g. <code>JKS</code>, <code>PKCS12</code>, <code>PKCS11</code>,
-<code>BKS</code>, <code>Windows-MY/Windows-ROOT</code>, <code>KeychainStore</code>, etc. The default is
-JKS. See also
-<a href="https://docs.oracle.com/javase/17/docs/technotes/guides/security/StandardNames.html#KeyStore">Standard
-types</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">keyManagerFactoryAlgorithm</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Optional KeyManagerFactory
-algorithm. The default is <code>SunX509</code>. See also
-<a href="https://docs.oracle.com/javase/17/docs/technotes/guides/security/StandardNames.html#KeyManagerFactory">Standard
-algorithms</a>.</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="TrustStore"><a class="anchor" href="#TrustStore"></a>TrustStore</h4>
-<div class="paragraph">
-<p>The trust store is meant to contain the CA certificates you are willing to trust when a remote party presents its certificate.
-Determines whether the remote authentication credentials (and thus the connection) should be trusted.</p>
-</div>
-<div class="paragraph">
-<p>In some cases, they can be the same store, although it is often better practice to use distinct stores (especially when they are file-based).</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 45. TrustStore Configuration Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">location</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Path to the keystore file.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">password</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">char[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Plain text password to access the keystore. Cannot be
-combined with either <code>passwordEnvironmentVariable</code> or <code>passwordFile</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">passwordEnvironmentVariable</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Name of an environment variable
-that holds the password. Cannot be combined with either <code>password</code> or
-<code>passwordFile</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">passwordFile</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Path to a file that holds the password. Cannot be
-combined with either <code>password</code> or <code>passwordEnvironmentVariable</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">type</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Optional KeyStore type, e.g. <code>JKS</code>, <code>PKCS12</code>, <code>PKCS11</code>,
-<code>BKS</code>, <code>Windows-MY/Windows-ROOT</code>, <code>KeychainStore</code>, etc. The default is
-JKS. See also
-<a href="https://docs.oracle.com/javase/17/docs/technotes/guides/security/StandardNames.html#KeyStore">Standard
-types</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">trustManagerFactoryAlgorithm</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Optional TrustManagerFactory
-algorithm. The default is <code>SunX509</code>. See also
-<a href="https://docs.oracle.com/javase/17/docs/technotes/guides/security/StandardNames.html#TrustManagerFactory">Standard
-algorithms</a>.</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="Example"><a class="anchor" href="#Example"></a>Example</h4>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;SSL&gt;
-  &lt;KeyStore   location="log4j2-keystore.jks" passwordEnvironmentVariable="KEYSTORE_PASSWORD"/&gt;
-  &lt;TrustStore location="truststore.jks"      passwordFile="${sys:user.home}/truststore.pwd"/&gt;
-&lt;/SSL&gt;</code></pre>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="SyslogAppender"><a class="anchor" href="#SyslogAppender"></a>SyslogAppender</h3>
-<div class="paragraph">
-<p>The <code>SyslogAppender</code> is a <code>SocketAppender</code> 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>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 46. <code>SyslogAppender</code> Parameters</caption>
-<colgroup>
-<col style="width: 20%;">
-<col style="width: 20%;">
-<col style="width: 60%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">advertise</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Indicates whether the appender should be
-advertised.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">appName</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The value to use as the APP-NAME in the RFC 5424
-syslog record.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">charset</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The character set to use when converting the Syslog
-String to a byte array. The String must be a valid
-<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/charset/Charset.html"><code>Charset</code></a>.
-If not specified, the default system Charset will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">connectTimeoutMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The connect timeout in milliseconds. The
-default is 0 (infinite timeout, like <code>Socket.connect()</code> methods).</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">enterpriseNumber</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The IANA enterprise number as described in
-<a href="https://datatracker.ietf.org/doc/html/rfc5424#section-7.2.2">RFC 5424</a></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by
-this Appender. More than one Filter may be used by using a
-CompositeFilter.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">facility</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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 lowercase characters.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">format</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If set to "RFC5424" the data will be formatted by 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 longer records.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">host</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name or address of the system that is listening for
-log events. This parameter is required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">id</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFail</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">When set to true, log events will not wait to
-try to reconnect and will fail immediately if the socket is not
-available.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">immediateFlush</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">includeMDC</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Indicates whether data from the ThreadContextMap
-will be included in the RFC 5424 Syslog record. Defaults to true.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A custom layout that overrides the <code>format</code> setting.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">loggerFields</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">List of KeyValuePairs</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Allows arbitrary PatternLayout
-patterns to be included as specified ThreadContext fields; no default
-specified. To use, include a <code>LoggerFields</code> nested element, containing
-one or more <code>KeyValuePair</code> elements. Each <code>KeyValuePair</code> must have a key
-attribute, which specifies the key name that will be used to identify
-the field within the MDC Structured Data element, and a value attribute,
-which specifies the PatternLayout pattern to use as the value.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcExcludes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcIncludes</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcRequired</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A comma-separated list of <code>mdc</code> 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.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">mdcPrefix</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">A string that should be prepended to each MDC key
-to distinguish it from event attributes. The default string is
-<code>mdc:</code>. This attribute only applies to RFC 5424 syslog records.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">messageId</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The default value to be used in the MSGID field of
-RFC 5424 syslog records.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">newLine</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If true, a newline will be appended to the end of the
-syslog record. The default is false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">port</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The port on the host that is listening for log events.
-This parameter must be specified.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">protocol</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">"TCP" or "UDP". This parameter is required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SSL</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">SslConfiguration</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Contains the configuration for the KeyStore and
-TrustStore. See <a href="#SSL">SSL</a>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">reconnectionDelayMillis</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If set to a value greater than 0,
-after an error, the SocketManager will attempt to reconnect to the server
-after waiting for 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>).</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>A sample syslogAppender configuration that is configured with two `SyslogAppender`s, one using the BSD format and one using RFC 5424.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Syslog name="bsd" host="localhost" port="514" protocol="TCP"/&gt;
-    &lt;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"/&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Logger name="com.mycorp" level="error"&gt;
-      &lt;AppenderRef ref="RFC5424"/&gt;
-    &lt;/Logger&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="bsd"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>For <a href="#SSL">SSL</a> this appender writes its output to a remote destination specified by a host and port over SSL in a format that conforms with either the BSD Syslog format or the RFC 5424 format.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration status="warn" name="MyApp"&gt;
-  &lt;Appenders&gt;
-    &lt;Syslog name="bsd" host="localhost" port="6514" protocol="SSL"&gt;
-      &lt;SSL&gt;
-        &lt;KeyStore   location="log4j2-keystore.jks" passwordEnvironmentVariable="KEYSTORE_PASSWORD"/&gt;
-        &lt;TrustStore location="truststore.jks"      passwordFile="${sys:user.home}/truststore.pwd"/&gt;
-      &lt;/SSL&gt;
-    &lt;/Syslog&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="error"&gt;
-      &lt;AppenderRef ref="bsd"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="JeroMQAppender"><a class="anchor" href="#JeroMQAppender"></a>ZeroMQ/JeroMQ Appender</h3>
-<div class="paragraph">
-<p>The ZeroMQ appender uses the <a href="https://github.com/zeromq/jeromq">JeroMQ</a> library to send log events to one or more ZeroMQ endpoints.</p>
-</div>
-<div class="paragraph">
-<p>This is a simple JeroMQ configuration:</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;Configuration name="JeroMQAppenderTest" status="TRACE"&gt;
-  &lt;Appenders&gt;
-    &lt;JeroMQ name="JeroMQAppender"&gt;
-      &lt;Property name="endpoint"&gt;tcp://*:5556&lt;/Property&gt;
-      &lt;Property name="endpoint"&gt;ipc://info-topic&lt;/Property&gt;
-    &lt;/JeroMQ&gt;
-  &lt;/Appenders&gt;
-  &lt;Loggers&gt;
-    &lt;Root level="info"&gt;
-      &lt;AppenderRef ref="JeroMQAppender"/&gt;
-    &lt;/Root&gt;
-  &lt;/Loggers&gt;
-&lt;/Configuration&gt;</code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>The table below describes all options.
-Please consult the JeroMQ and ZeroMQ documentation for details.</p>
-</div>
-<table class="tableblock frame-all grid-all stretch">
-<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 33.3333%;">
-<col style="width: 33.3334%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-top">Parameter Name</th>
-<th class="tableblock halign-left valign-top">Type</th>
-<th class="tableblock halign-left valign-top">Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender. Required.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">layout</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent. If no layout is supplied the default pattern layout of "%m%n" will be used.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filters</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Filter</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The Filter(s) of the Appender.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Properties</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Property[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">One or more Property elements, named <code>endpoint</code>.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ignoreExceptions</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">If true, exceptions will be logged and suppressed. If false errors will be logged and then passed to the application.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">affinity</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_AFFINITY option. Defaults to 0.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">backlog</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_BACKLOG option. Defaults to 100.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">delayAttachOnConnect</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_DELAY_ATTACH_ON_CONNECT option. Defaults to false.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">identity</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">byte[]</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_IDENTITY option. Defaults to none.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">ipv4Only</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_IPV4ONLY option. Defaults to true.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">linger</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_LINGER option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">maxMsgSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_MAXMSGSIZE option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">rcvHwm</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_RCVHWM option. Defaults to 1000.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">receiveBufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_RCVBUF option. Defaults to 0.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">receiveTimeOut</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_RCVTIMEO option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">reconnectIVL</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_RECONNECT_IVL option. Defaults to 100.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">reconnectIVLMax</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_RECONNECT_IVL_MAX option. Defaults to 0.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">sendBufferSize</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_SNDBUF option. Defaults to 0.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">sendTimeOut</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_SNDTIMEO option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">sndHwm</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_SNDHWM option. Defaults to 1000.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tcpKeepAlive</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_TCP_KEEPALIVE option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tcpKeepAliveCount</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_TCP_KEEPALIVE_CNT option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tcpKeepAliveIdle</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_TCP_KEEPALIVE_IDLE option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">tcpKeepAliveInterval</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">long</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_TCP_KEEPALIVE_INTVL option. Defaults to -1.</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">xpubVerbose</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The ZMQ_XPUB_VERBOSE option. Defaults to false.</p></td>
-</tr>
-</tbody>
-</table>
 </div>
 </div>
 </div>
@@ -6626,7 +1316,7 @@ This section will guide you on how to create custom ones.</p>
 </td>
 <td class="content">
 <div class="paragraph">
-<p><strong>Implementing a reliable and efficient appender is a difficult task!</strong>
+<p><strong>Implementing a reliable and efficient appender is a challenging task!</strong>
 We strongly advise you to</p>
 </div>
 <div class="olist arabic">
@@ -6676,21 +1366,21 @@ While annotating your appender with <code>@Plugin</code>, you need to make sure
 </div>
 <div class="paragraph">
 <p>Most appender implementation use <strong>managers</strong>, which model an abstraction owning the resources, such as an <code>OutputStream</code> or a socket.
-When a reconfiguration occurs a new appender will be created.
+When a reconfiguration occurs, a new appender will be created.
 However, if nothing significant in the previous manager has changed, the new appender will simply reference it instead of creating a new one.
 This ensures that events are not lost while a reconfiguration is taking place without requiring that logging pause while the reconfiguration takes place.
 You are strongly advised to study the manager concept in <a href="#collection">the predefined appenders</a>, and either use an existing manager, or create your own.</p>
 </div>
 <div class="paragraph">
-<p>You can check out following files for examples:</p>
+<p>You can check out the following files for examples:</p>
 </div>
 <div class="ulist">
 <ul>
 <li>
-<p><a href="https://github.com/apache/logging-log4j2/tree/main/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java"><code>HttpAppender.java</code></a> – <a href="#HttpAppender">HttpAppender</a> sends log events over HTTP using <code>HttpURLConnectionManager</code></p>
+<p><a href="https://github.com/apache/logging-log4j2/tree/main/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java"><code>HttpAppender.java</code></a> – <a href="appenders/network.html#HttpAppender" class="xref page">HttpAppender</a> sends log events over HTTP using <code>HttpURLConnectionManager</code></p>
 </li>
 <li>
-<p><a href="https://github.com/apache/logging-log4j2/tree/main/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java"><code>ConsoleAppender.java</code></a> – <a href="#ConsoleAppender">[ConsoleAppender]</a> writes log events to either <code>System.out</code> or <code>System.err</code> using <code>OutputStreamManager</code></p>
+<p><a href="https://github.com/apache/logging-log4j2/tree/main/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java"><code>ConsoleAppender.java</code></a> – <a href="#ConsoleAppender">Console Appender</a> writes log events to either <code>System.out</code> or <code>System.err</code> using <code>OutputStreamManager</code></p>
 </li>
 </ul>
 </div>
diff --git a/manual/appenders/database.html b/manual/appenders/database.html
new file mode 100644
index 0000000000..d004a589eb
--- /dev/null
+++ b/manual/appenders/database.html
@@ -0,0 +1,2339 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width,initial-scale=1">
+    <title>Database appenders :: Apache Log4j</title>
+    <link rel="canonical" href="https://logging.apache.org/log4j/3.x/manual/appenders/database.html">
+    <meta name="generator" content="Antora 3.2.0-alpha.4">
+<link rel="stylesheet" href="../../_/css/site.css">
+<link rel="icon" href="../../_/../_images/favicon.ico" type="image/x-icon">
+<!-- `@asciidoctor/tabs` extension styles -->
+<link rel="stylesheet" href="../../_/css/vendor/tabs.css">
+<style>
+  /* Swap colors of `IMPORTANT` and `WARNING` blocks */ 
+  .doc .admonitionblock.important .icon { background-color: #f70; }
+  .doc .admonitionblock.warning .icon { background-color: #e40046; }
+  /* Default `h4`, `h5`, and `h6` are smaller than the normal text, fix header font sizing: */
+  .doc h1 { font-size: 1.9rem; }
+  .doc h2 { font-size: 1.7rem; }
+  .doc h3 { font-size: 1.5rem; font-weight: 400; }
+  .doc h4 { font-size: 1.3rem; font-weight: 500; }
+  .doc h5 { font-size: 1.1rem; font-weight: 500; text-decoration: underline; }
+  .doc h6 { font-size: 0.9rem; font-weight: 500; text-decoration: underline; }
+  /* Default `code`, `pre`, and `.colist` (source code annotations) fonts are too big, adjust them: */
+  .doc .colist>table code, .doc p code, .doc thead code { font-size: 0.8em; }
+  .doc pre { font-size: 0.7rem; }
+  .doc .colist { font-size: 0.75rem; }
+  /* Make links more visible: */
+  .doc a { text-decoration: underline; }
+  .doc a code { text-decoration: underline; color: #1565c0; }
+  /* Tab header fonts aren't rendered good, adjusting the font weight: */
+  .tablist > ul li { font-weight: 500; }
+  /* `page-toclevels` greater than 4 are not supported by Antora UI, patching it: */
+  .toc .toc-menu li[data-level="4"] a {
+    padding-left: 2.75rem;
+  }
+  /* Replace the default highlight.js color for strings from red (unnecessarily signaling something negative) to green: */
+  .hljs-string {
+    color: #0f8532;
+  }
+</style>
+  </head>
+  <body class="article">
+<header class="header">
+  <nav class="navbar">
+    <div class="navbar-brand">
+      <div class="navbar-item">
+        <img src="../../_/../_images/logo-small-white.png" alt="Apache Log4j"/>
+      </div>
+    </div>
+    <div id="topbar-nav" class="navbar-menu">
+      <div class="navbar-end">
+        <a class="navbar-item" href="https://logging.apache.org">a subproject of&nbsp;<strong>Apache Logging Services</strong></a>
+      </div>
+    </div>
+  </nav>
+</header>
+<div class="body">
+<div class="nav-container" data-component="ROOT" data-version="">
+  <aside class="nav">
+    <div class="panels">
+<div class="nav-panel-menu is-active" data-panel="menu">
+  <nav class="nav-menu">
+    <button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button>
+    <h3 class="title"><a href="../../index.html">Home</a></h3>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="0">
+<ul class="nav-list">
+  <li class="nav-item" data-depth="1">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../../download.html">Download</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../../release-notes.html">Release Notes</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="https://logging.apache.org/support.html">Support</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="https://logging.apache.org/security.html">Security</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../../thanks.html">Thanks</a>
+  </li>
+</ul>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="0">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../index.html">Manual</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../getting-started.html">Getting started</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../installation.html">Installation</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../architecture.html">Architecture</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../api.html">API</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../config-intro.html">Configuration</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../configuration.html">Configuration file</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../systemproperties.html">Configuration properties</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../customconfig.html">Programmatic Configuration</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../appenders.html">Appenders</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="file.html">File appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="rolling-file.html">Rolling file appenders</a>
+  </li>
+  <li class="nav-item is-current-page" data-depth="3">
+    <a class="nav-link" href="database.html">Database appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="network.html">Network Appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="message-queue.html">Message queue appenders</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="delegating.html">Delegating Appenders</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../layouts.html">Layouts</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="../json-template-layout.html">JSON Template Layout</a>
+  </li>
+  <li class="nav-item" data-depth="3">
+    <a class="nav-link" href="../pattern-layout.html">Pattern Layout</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../lookups.html">Lookups</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../filters.html">Filters</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../scripts.html">Scripts</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../jmx.html">JMX</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../extending.html">Extending</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../plugins.html">Plugins</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <button class="nav-item-toggle"></button>
+    <a class="nav-link" href="../performance.html">Performance</a>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../async.html">Asynchronous loggers</a>
+  </li>
+  <li class="nav-item" data-depth="2">
+    <a class="nav-link" href="../garbagefree.html">Garbage-free logging</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../migration.html">Migrating from Log4j 2</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="0">
+    <button class="nav-item-toggle"></button>
+    <span class="nav-text">References</span>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../plugin-reference.html">Plugin reference</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../javadoc.html">Java API reference</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="0">
+    <button class="nav-item-toggle"></button>
+    <span class="nav-text">Resources</span>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../faq.html">F.A.Q.</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../migrate-from-logback.html">Migrating from Logback</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../migrate-from-slf4j.html">Migrating from SLF4J</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../hibernate.html">Integrating with Hibernate</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../cloud.html">Using Log4j in Cloud Enabled Applications</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../development.html">Development</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="0">
+    <button class="nav-item-toggle"></button>
+    <span class="nav-text">Components</span>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../log4j-flume-ng.html">Flume Appender</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../log4j-docker.html">Log4j Docker Support</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="../../log4j-spring-cloud-config-client.html">Log4j Spring Cloud Configuration</a>
+  </li>
+</ul>
+  </li>
+  <li class="nav-item" data-depth="0">
+    <button class="nav-item-toggle"></button>
+    <span class="nav-text">Related projects</span>
+<ul class="nav-list">
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="https://logging.apache.org/log4j/2.x">Log4j 2</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="/log4j/jakarta">Log4j Jakarta EE</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="/log4j/jmx-gui">Log4j JMX GUI</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="/log4j/kotlin">Log4j Kotlin</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="/log4j/scala">Log4j Scala</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="/log4j/tools">Log4j Tools</a>
+  </li>
+  <li class="nav-item" data-depth="1">
+    <a class="nav-link" href="/log4j/transform">Log4j Transformation Tools</a>
+  </li>
+</ul>
+  </li>
+</ul>
+  </nav>
+</div>
+    </div>
+  </aside>
+</div>
+<main class="article">
+<div class="toolbar" role="navigation">
+<button class="nav-toggle"></button>
+  <a href="../../index.html" class="home-link"></a>
+<nav class="breadcrumbs" aria-label="breadcrumbs">
+  <ul>
+    <li><a href="../../index.html">Home</a></li>
+    <li><a href="../index.html">Manual</a></li>
+    <li><a href="../config-intro.html">Configuration</a></li>
+    <li><a href="../appenders.html">Appenders</a></li>
+    <li><a href="database.html">Database appenders</a></li>
+  </ul>
+</nav>
+<div class="edit-this-page"><a href="https://github.com/apache/logging-log4j2/edit/main/src/site/antora/modules/ROOT/pages/manual/appenders/database.adoc">Edit this Page</a></div>
+</div>
+  <div class="content">
+<aside class="toc sidebar" data-title="Contents" data-levels="4">
+  <div class="toc-menu"></div>
+</aside>
+<article class="doc">
+<h1 class="page">Database appenders</h1>
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>Log4j Core provides multiple appenders to send log events directly to your database.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="common-concerns"><a class="anchor" href="#common-concerns"></a>Common concerns</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="ColumnMapping"><a class="anchor" href="#ColumnMapping"></a>Column mapping</h3>
+<div class="paragraph">
+<p>Since relational databases and some NoSQL databases split data into columns, Log4j Core provides a reusable
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/appender/db/ColumnMapping.html"><code>ColumnMapping</code></a>
+configuration element to allow specifying the content of each column.</p>
+</div>
+<div class="paragraph">
+<p>The Column Mapping element supports the following configuration properties:</p>
+</div>
+<table id="ColumnMapping-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 1. <code>ColumnMapping</code> configuration attributes</caption>
+<colgroup>
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 62.5%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Required</p></th>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-name"></a>name</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the column.</p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Optional</p></th>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-columnType"></a>columnType</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Class&lt;?&gt;</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>It specifies the Java type that will be stored in the column.</p>
+</div>
+<div class="paragraph">
+<p>If set to:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>org.apache.logging.log4j.util.ReadOnlyStringMap</code></dt>
+<dt class="hdlist1"><code>org.apache.logging.log4j.spi.ThreadContextMap</code></dt>
+<dd>
+<p>The column will be filled with the contents of the log event&#8217;s
+<a href="https://logging.apache.org/log4j/2.x/manual/thread-context.html#mdc">context map</a>.</p>
+</dd>
+<dt class="hdlist1"><code>org.apache.logging.log4j.spi.ThreadContextStack</code></dt>
+<dd>
+<p>The column will be filled with the contents of the log event&#8217;s
+<a href="https://logging.apache.org/log4j/2.x/manual/thread-context.html#ndc">context stack</a>.</p>
+</dd>
+<dt class="hdlist1"><code>java.util.Date</code></dt>
+<dd>
+<p>The column will be filled with the log event&#8217;s timestamp.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>For any other value:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>The log event will be formatted using the <a href="#ColumnMapping-element-Layout">nested <code>Layout</code></a>.</p>
+</li>
+<li>
+<p>The resulting <code>String</code> will be converted to the specified type using a
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/config/plugins/convert/TypeConverter.html"><code>TypeConverter</code></a>.
+See the
+<a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-config-plugins-convert-TypeConverter" class="xref page">plugin reference</a>
+for a list of available type converters.</p>
+</li>
+</ol>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-type"></a>type</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Class&lt;?&gt;</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Deprecated</strong>: since <code>2.21.0</code> use <a href="#ColumnMapping-attr-columnType"><code>columnType</code></a> instead.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-literal"></a>literal</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>If set, the value will be added <strong>directly</strong> in the insert statement of the database-specific query language.</p>
+</div>
+<div class="admonitionblock caution">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-caution" title="Caution"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>This value is added as-is, without any validation.
+Never use user-provided data to determine its value.</p>
+</div>
+</td>
+</tr>
+</table>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-parameter"></a>parameter</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>It specifies the database-specific parameter marker to use.
+Otherwise, the default parameter marker for the database language will be used.</p>
+</div>
+<div class="admonitionblock caution">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-caution" title="Caution"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>This value is added as-is, without any validation.
+Never use user-provided data to determine its value.</p>
+</div>
+</td>
+</tr>
+</table>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-pattern"></a>pattern</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">This is a shortcut configuration attribute to set the
+<a href="#ColumnMapping-element-Layout">nested <code>Layout</code> element</a>
+to a <a href="../pattern-layout.html" class="xref page"><code>PatternLayout</code></a>
+instance with the specified <code>pattern</code> property.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-attr-source"></a>source</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#ColumnMapping-attr-name"><code>name</code></a></p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>It specifies which key of a
+<a href="https://logging.apache.org/log4j/2.x/manual/messages.html#MapMessage"><code>MapMessage</code></a>
+will be stored in the column.
+This attribute is used only if:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <a href="#ColumnMapping-element-Layout">nested <code>Layout</code> element</a>
+is a
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/layout/MessageLayout.html"><code>MessageLayout</code></a>.</p>
+</li>
+<li>
+<p>The message being logged is a <code>MapMessage</code></p>
+</li>
+</ul>
+</div></div></td>
+</tr>
+</tbody>
+</table>
+<table id="ColumnMapping-elements" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 2. <code>ColumnMapping</code> nested elements</caption>
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 16.6666%;">
+<col style="width: 66.6668%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Multiplicity</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="ColumnMapping-element-Layout"></a><a href="../layouts.html" class="xref page"><code>Layout</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Formats the value to store in the column.</p>
+<p class="tableblock">See <a href="../layouts.html" class="xref page">Layouts</a> for more information.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-ColumnMapping" class="xref page">Plugin reference for <code>ColumnMapping</code></a></p>
+</div>
+<div class="paragraph">
+<p>An example column mapping might look like this:</p>
+</div>
+<div id="_tabs_1" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_1_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_1_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_1_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_1_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_1_xml--panel" class="tabpanel" aria-labelledby="_tabs_1_xml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/column-mapping.xml"><code>log4j2.xml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><i class="conum" data-value="1"></i><b>(1)</b>
+&lt;ColumnMapping name="id" literal="currval('logging_seq')"/&gt;
+<i class="conum" data-value="2"></i><b>(2)</b>
+&lt;ColumnMapping name="uuid"
+               pattern="%uuid{TIME}"
+               columnType="java.util.UUID"/&gt;
+&lt;ColumnMapping name="message" pattern="%m"/&gt;
+<i class="conum" data-value="3"></i><b>(3)</b>
+&lt;ColumnMapping name="timestamp" columnType="java.util.Date"/&gt;
+&lt;ColumnMapping name="mdc"
+               columnType="org.apache.logging.log4j.spi.ThreadContextMap"/&gt;
+&lt;ColumnMapping name="ndc"
+               columnType="org.apache.logging.log4j.spi.ThreadContextStack"/&gt;
+<i class="conum" data-value="4"></i><b>(4)</b>
+&lt;ColumnMapping name="asJson"&gt;
+  &lt;JsonTemplateLayout/&gt;
+&lt;/ColumnMapping&gt;
+<i class="conum" data-value="5"></i><b>(5)</b>
+&lt;ColumnMapping name="resource" source="resourceId"/&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_1_json--panel" class="tabpanel" aria-labelledby="_tabs_1_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/column-mapping.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"ColumnMapping": [
+  <i class="conum" data-value="1"></i><b>(1)</b>
+  {
+    "name": "id",
+    "literal": "currval('logging_seq')"
+  },
+  <i class="conum" data-value="2"></i><b>(2)</b>
+  {
+    "name": "uuid",
+    "pattern": "%uuid{TIME}",
+    "columnType": "java.util.UUID"
+  },
+  {
+    "name": "message",
+    "pattern": "%m"
+  },
+  <i class="conum" data-value="3"></i><b>(3)</b>
+  {
+    "name": "timestamp",
+    "columnType": "java.util.Date"
+  },
+  {
+    "name": "mdc",
+    "columnType": "org.apache.logging.log4j.spi.ThreadContextMap"
+  },
+  {
+    "name": "ndc",
+    "columnType": "org.apache.logging.log4j.spi.ThreadContextStack"
+  },
+  <i class="conum" data-value="4"></i><b>(4)</b>
+  {
+    "name": "asJson",
+    "JsonTemplateLayout": {}
+  },
+  <i class="conum" data-value="5"></i><b>(5)</b>
+  {
+    "name": "resource",
+    "source": "resourceId"
+  }
+]</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_1_yaml--panel" class="tabpanel" aria-labelledby="_tabs_1_yaml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/column-mapping.yaml"><code>log4j2.yaml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">ColumnMapping:
+  <i class="conum" data-value="1"></i><b>(1)</b>
+  - name: "id"
+    literal: "currval('logging_seq')"
+  <i class="conum" data-value="2"></i><b>(2)</b>
+  - name: "uuid"
+    pattern: "%uuid{TIME}"
+    columnType: "java.util.UUID"
+  - name: "message"
+    pattern: "%m"
+  <i class="conum" data-value="3"></i><b>(3)</b>
+  - name: "timestamp"
+    columnType: "java.util.Date"
+  - name: "mdc"
+    columnType: "org.apache.logging.log4j.spi.ThreadContextMap"
+  - name: "ndc"
+    columnType: "org.apache.logging.log4j.spi.ThreadContextStack"
+  <i class="conum" data-value="4"></i><b>(4)</b>
+  - name: "asJson"
+    JsonTemplateLayout: {}
+  <i class="conum" data-value="5"></i><b>(5)</b>
+  - name: "resource"
+    source: "resourceId"</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_1_properties--panel" class="tabpanel" aria-labelledby="_tabs_1_properties">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/column-mapping.properties"><code>log4j2.properties</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties"><i class="conum" data-value="1"></i><b>(1)</b>
+Appenders.JDBC.ColumnMapping[1].name = id
+Appenders.JDBC.ColumnMapping[1].literal = currval('logging_seq')
+
+<i class="conum" data-value="2"></i><b>(2)</b>
+Appenders.JDBC.ColumnMapping[2].name = uuid
+Appenders.JDBC.ColumnMapping[2].pattern = %uuid{TIME}
+Appenders.JDBC.ColumnMapping[2].columnType = java.util.UUID
+
+Appenders.JDBC.ColumnMapping[3].name = message
+Appenders.JDBC.ColumnMapping[3].pattern = %m
+
+<i class="conum" data-value="3"></i><b>(3)</b>
+Appenders.JDBC.ColumnMapping[4].name = timestamp
+Appenders.JDBC.ColumnMapping[4].timestamp = java.util.Date
+
+Appenders.JDBC.ColumnMapping[5].name = mdc
+Appenders.JDBC.ColumnMapping[5].columnType = org.apache.logging.log4j.spi.ThreadContextMap
+
+Appenders.JDBC.ColumnMapping[6].name = ndc
+Appenders.JDBC.ColumnMapping[6].columnType = org.apache.logging.log4j.spi.ThreadContextStack
+
+<i class="conum" data-value="4"></i><b>(4)</b>
+Appenders.JDBC.ColumnMapping[7].name = asJson
+Appenders.JDBC.ColumnMapping[7].layout.type = JsonTemplateLayout
+
+<i class="conum" data-value="5"></i><b>(5)</b>
+Appenders.JDBC.ColumnMapping[8].name = resource
+Appenders.JDBC.ColumnMapping[8].source = resourceId</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>A database-specific expression is added literally to the <code>INSERT</code> statement.</td>
+</tr>
+<tr>
+<td><i class="conum" data-value="2"></i><b>2</b></td>
+<td>A <a href="../pattern-layout.html" class="xref page">Pattern Layout</a> with the specified pattern is used for these columns.
+The <code>uuid</code> column is additionally converted into a <code>java.util.UUID</code> before being sent to the JDBC driver.</td>
+</tr>
+<tr>
+<td><i class="conum" data-value="3"></i><b>3</b></td>
+<td>Three special column types are replaced with the log event timestamp, context map, and context stack.</td>
+</tr>
+<tr>
+<td><i class="conum" data-value="4"></i><b>4</b></td>
+<td>A <a href="../json-template-layout.html" class="xref page">JSON Template Layout</a> is used to format this column.</td>
+</tr>
+<tr>
+<td><i class="conum" data-value="5"></i><b>5</b></td>
+<td>If the global layout of the appender returns a <code>MapMessage</code>, the value for key <code>resourceId</code> will be put into the <code>resource</code> column.</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="JdbcAppender"><a class="anchor" href="#JdbcAppender"></a>JDBC Appender</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The JDBCAppender writes log events to a relational database table using standard JDBC.
+It can be configured to get JDBC connections from different <a href="#ConnectionSource">connection sources</a>.</p>
+</div>
+<div class="paragraph">
+<p>If batch statements are supported by the configured JDBC driver and
+<a href="#JdbcAppender-attr-bufferSize"><code>bufferSize</code></a>
+is configured to be a positive number, then log events will be batched.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The appender gets a new connection for each batch of log events.
+The connection source <strong>must</strong> be backed by a connection pool, otherwise the performance will suffer greatly.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<table id="JdbcAppender-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 3. JDBC Appender configuration attributes</caption>
+<colgroup>
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 62.5%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Required</p></th>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-attr-name"></a>name</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-attr-tableName"></a>tableName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the table to use.</p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Optional</p></th>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-attr-bufferSize"></a>bufferSize</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The number of log messages to batch before writing.
+If <code>0</code>, batching is disabled.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-attr-ignoreExceptions"></a>ignoreExceptions</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If <code>false</code>, logging exception will be forwarded to the caller of the logging statement.
+Otherwise, they will be ignored.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-attr-immediateFail"></a>immediateFail</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">When set to <code>true</code>, log events will not wait to try to reconnect and will fail immediately if the JDBC resources are not available.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-attr-reconnectIntervalMillis"></a>reconnectIntervalMillis</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>long</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5000</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set to a value greater than 0, after an error, the <code>JdbcDatabaseManager</code> will attempt to reconnect to the database after waiting the specified number of milliseconds.</p>
+<p class="tableblock">If the reconnecting fails then an exception will be thrown and can be caught by the application if
+<a href="#JdbcAppender-attr-ignoreExceptions"><code>ignoreExceptions</code></a>
+is set to <code>false</code>.</p></td>
+</tr>
+</tbody>
+</table>
+<table id="JdbcAppender-elements" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 4. JDBC Appender nested elements</caption>
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 16.6666%;">
+<col style="width: 66.6668%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Multiplicity</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-element-Filter"></a><a href="../filters.html" class="xref page"><code>Filter</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows filtering log events just before they are formatted and sent.</p>
+<p class="tableblock">See also <a href="../filters.html#appender-stage" class="xref page">appender filtering stage</a>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-element-ColumnMapping"></a><a href="#ColumnMapping"><code>ColumnMapping</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or more</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>A list of <a href="#ColumnMapping">column mapping</a> configurations.
+The following database-specific restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the <a href="#ColumnMapping-attr-name"><code>name</code> attribute</a> must be a valid SQL identifier.</p>
+</li>
+<li>
+<p>the <a href="#ColumnMapping-attr-literal"><code>literal</code> attribute</a> must be a valid SQL term.</p>
+</li>
+<li>
+<p>the <a href="#ColumnMapping-attr-parameter"><code>parameter</code> attribute</a> must be a valid SQL term containing a <code>?</code> placeholder.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Required</strong>, unless <a href="#JdbcAppender-element-ColumnConfig"><code>ColumnConfig</code></a> is used.</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-element-ColumnConfig"></a><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-ColumnConfig" class="xref page"><code>ColumnConfig</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or more</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Deprecated</strong>: an older mechanism to define <a href="#JdbcAppender-element-ColumnMapping">column mappings</a>.</p>
+<p class="tableblock"><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-ColumnConfig" class="xref page">&#x1F4D6; Plugin reference for <code>ColumnConfig</code></a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-element-ConnectionSource"></a><a href="#ConnectionSource"><code>ConnectionSource</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>one</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">It specifies how to retrieve JDBC
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html"><code>Connection</code></a>
+objects.</p>
+<p class="tableblock">See <a href="#ConnectionSource">Connection Sources</a> for more details.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="JdbcAppender-element-Layout"></a><a href="#JdbcAppender-MapMessage"><code>Layout</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">An optional
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html"><code>Layout&lt;? extends Message&gt;</code></a>
+implementation that formats a log event as
+<a href="https://logging.apache.org/log4j/2.x/manual/messages.html">log <code>Message</code></a>.</p>
+<p class="tableblock">If supplied <code>MapMessage</code>s will be treated in a special way.</p>
+<p class="tableblock">See <a href="#JdbcAppender-MapMessage">Map Message handling</a> for more details.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-JdbcAppender" class="xref page">&#x1F4D6; Plugin reference for <code>JDBC</code></a></p>
+</div>
+<div class="paragraph">
+<p>Additional runtime dependencies are required to use the JDBC Appender:</p>
+</div>
+<div id="_tabs_2" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_2_maven" class="tab">
+<p>Maven</p>
+</li>
+<li id="_tabs_2_gradle" class="tab">
+<p>Gradle</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_2_maven--panel" class="tabpanel" aria-labelledby="_tabs_2_maven">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;!-- We assume you use `log4j-bom` for dependency management --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
+  &lt;artifactId&gt;log4j-jdbc&lt;/artifactId&gt;
+  &lt;scope&gt;runtime&lt;/scope&gt;
+&lt;/dependency&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_2_gradle--panel" class="tabpanel" aria-labelledby="_tabs_2_gradle">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">// We assume you use `log4j-bom` for dependency management
+runtimeOnly 'org.apache.logging.log4j:log4j-jdbc'</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ConnectionSource"><a class="anchor" href="#ConnectionSource"></a>Connection Sources</h3>
+<div class="paragraph">
+<p>When configuring the JDBC Appender, you must specify an implementation of
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/appender/db/jdbc/ConnectionSource.html"><code>ConnectionSource</code></a>
+that the appender will use to get
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html"><code>Connection</code></a> objects.</p>
+</div>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-ConnectionSource" class="xref page">&#x1F4D6; Plugin reference for <code>ConnectionSource</code></a></p>
+</div>
+<div class="paragraph">
+<p>The following connection sources are available out-of-the-box:</p>
+</div>
+<div class="sect3">
+<h4 id="DataSourceConnectionSource"><a class="anchor" href="#DataSourceConnectionSource"></a><code>DataSource</code></h4>
+<div class="paragraph">
+<p>This connection source uses JNDI to locate a JDBC
+<a href="https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html"><code>DataSource</code></a>.</p>
+</div>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>As of Log4j <code>2.17.0</code> you need to enable the <code>DataSource</code> connection source <strong>explicitly</strong> by setting the
+<a href="../systemproperties.html#log4j.jndi.enableJdbc" class="xref page"><code>log4j.jndi.enableJdbc</code></a>
+configuration property to <code>true</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<table id="DataSourceConnectionSource-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 5. <code>DataSource</code> configuration attributes</caption>
+<colgroup>
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 62.5%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="DataSourceConnectionSource-attr-jndiName"></a>jndiName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://docs.oracle.com/javase/17/docs/api/javax/naming/Name.html"><code>Name</code></a></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">It specifies the JNDI name of a JDBC
+<a href="https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html"><code>DataSource</code></a>.</p>
+<p class="tableblock">Only the <code>java:</code> JNDI protocol is supported.</p>
+<p class="tableblock"><strong>Required</strong></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Additional runtime dependencies are required to use <code>DataSource</code>:</p>
+</div>
+<div id="_tabs_3" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_3_maven" class="tab">
+<p>Maven</p>
+</li>
+<li id="_tabs_3_gradle" class="tab">
+<p>Gradle</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_3_maven--panel" class="tabpanel" aria-labelledby="_tabs_3_maven">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;!-- We assume you use `log4j-bom` for dependency management --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
+  &lt;artifactId&gt;log4j-jndi&lt;/artifactId&gt;
+  &lt;scope&gt;runtime&lt;/scope&gt;
+&lt;/dependency&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_3_gradle--panel" class="tabpanel" aria-labelledby="_tabs_3_gradle">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">// We assume you use `log4j-bom` for dependency management
+runtimeOnly 'org.apache.logging.log4j:log4j-jndi'</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-DataSourceConnectionSource" class="xref page">&#x1F4D6; Plugin reference for <code>DataSource</code></a></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="FactoryMethodConnectionSource"><a class="anchor" href="#FactoryMethodConnectionSource"></a><code>ConnectionFactory</code></h4>
+<div class="paragraph">
+<p>This connection source can use any factory method.
+The method must:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Be <code>public</code> and <code>static</code>.</p>
+</li>
+<li>
+<p>Have an empty parameter list.</p>
+</li>
+<li>
+<p>Return either
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html"><code>Connection</code></a>
+or
+<a href="https://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html"><code>DataSource</code></a>.</p>
+</li>
+</ul>
+</div>
+<table id="FactoryMethodConnectionSource-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 6. <code>ConnectionFactory</code> configuration attributes</caption>
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 22.2222%;">
+<col style="width: 11.1111%;">
+<col style="width: 55.5556%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="FactoryMethodConnectionSource-attr-class"></a>class</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Class&lt;?&gt;</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The fully qualified class name of the class containing the factory method.</p>
+<p class="tableblock"><strong>Required</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="FactoryMethodConnectionSource-attr-method"></a>method</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the factory method.</p>
+<p class="tableblock"><strong>Required</strong></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-FactoryMethodConnectionSource" class="xref page">&#x1F4D6; Plugin reference for <code>ConnectionFactory</code></a></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="DriverManagerConnectionSource"><a class="anchor" href="#DriverManagerConnectionSource"></a><code>DriverManager</code></h4>
+<div class="paragraph">
+<p>This connection source uses
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html"><code>DriverManager</code></a>
+to directly create connections using a JDBC
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/Driver.html"><code>Driver</code></a>.</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>This configuration source is useful during development, but we don&#8217;t recommend it in production.
+Unless the JDBC driver provides connection pooling, the performance of the appender will suffer.</p>
+</div>
+<div class="paragraph">
+<p>See <a href="#PoolingDriverConnectionSource"><code>PoolingDriver</code></a> for a variant of this connection source that uses a connection pool.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<table id="DriverManagerConnectionSource-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 7. <code>DriverManager</code> configuration attributes</caption>
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 22.2222%;">
+<col style="width: 11.1111%;">
+<col style="width: 55.5556%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="DriverManagerConnectionSource-attr-connectionString"></a>connectionString</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The driver-specific JDBC connection string.</p>
+<p class="tableblock"><strong>Required</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="DriverManagerConnectionSource-attr-driverClassName"></a>driverClassName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><em>autodetected</em></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The fully qualified class name of the JDBC driver to use.</p>
+<p class="tableblock">JDBC 4.0 drivers can be automatically detected by <code>DriverManager</code>.
+See
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html"><code>DriverManager</code></a>
+for more details.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="DriverManagerConnectionSource-attr-userName"></a>userName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The username to use to connect to the database.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="DriverManagerConnectionSource-attr-password"></a>password</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The password to use to connect to the database.</p></td>
+</tr>
+</tbody>
+</table>
+<table id="DriverManagerConnectionSource-elements" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 8. <code>DriverManager</code> nested elements</caption>
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 16.6666%;">
+<col style="width: 66.6668%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Multiplicity</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="DriverManagerConnectionSource-element-Property"></a><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-config-Property" class="xref page"><code>Property</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or more</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">A list of key/value pairs to pass to <code>DriverManager</code>.</p>
+<p class="tableblock">If supplied, the <a href="#DriverManagerConnectionSource-attr-userName"><code>userName</code></a> and <a href="#DriverManagerConnectionSource-attr-password"><code>password</code></a> attributes will be ignored.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-db-jdbc-DriverManagerConnectionSource" class="xref page">&#x1F4D6; Plugin reference for <code>DriverManager</code></a></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="PoolingDriverConnectionSource"><a class="anchor" href="#PoolingDriverConnectionSource"></a><code>PoolingDriver</code></h4>
+<div class="paragraph">
+<p>The <code>PoolingDriver</code> uses
+<a href="https://commons.apache.org/proper/commons-dbcp/">Apache Commons DBCP 2</a>
+to configure a JDBC connection pool.</p>
+</div>
+<table id="PoolingDriverConnectionSource-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 9. <code>PoolingDriver</code> configuration attributes</caption>
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 22.2222%;">
+<col style="width: 11.1111%;">
+<col style="width: 55.5556%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-attr-connectionString"></a>connectionString</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The driver-specific JDBC connection string.</p>
+<p class="tableblock"><strong>Required</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-attr-driverClassName"></a>driverClassName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><em>autodetected</em></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The fully qualified class name of the JDBC driver to use.</p>
+<p class="tableblock">JDBC 4.0 drivers can be automatically detected by <code>DriverManager</code>.
+See
+<a href="https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html"><code>DriverManager</code></a>
+for more details.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-attr-userName"></a>userName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The username to use to connect to the database.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-attr-password"></a>password</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The password to use to connect to the database.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-attr-poolName"></a>poolName</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>example</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+<table id="PoolingDriverConnectionSource-elements" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 10. <code>PoolingDriver</code> nested elements</caption>
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 16.6666%;">
+<col style="width: 66.6668%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Multiplicity</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-element-Property"></a><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-config-Property" class="xref page"><code>Property</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or more</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">A list of key/value pairs to pass to <code>DriverManager</code>.</p>
+<p class="tableblock">If supplied, the <a href="#DriverManagerConnectionSource-attr-userName"><code>userName</code></a> and <a href="#DriverManagerConnectionSource-attr-password"><code>password</code></a> attributes will be ignored.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="PoolingDriverConnectionSource-element-PoolingConnectionFactoryConfig"></a><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-jdbc-dbcp2_org-apache-logging-log4j-core-appender-db-jdbc-PoolableConnectionFactoryConfig" class="xref page"><code>PoolableConnectionFactory</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows finely tuning the configuration of the DBCP 2 connection pool.
+The available parameters are the same as those provided by DBCP 2.
+See
+<a href="https://commons.apache.org/proper/commons-dbcp/configuration.html">DBCP 2 configuration</a> for more details.</p>
+<p class="tableblock"><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-jdbc-dbcp2_org-apache-logging-log4j-core-appender-db-jdbc-PoolableConnectionFactoryConfig" class="xref page">&#x1F4D6; Plugin reference for <code>PoolableConnectionFactory</code></a></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Additional runtime dependencies are required for using <code>PoolingDriver</code>:</p>
+</div>
+<div id="_tabs_4" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_4_maven" class="tab">
+<p>Maven</p>
+</li>
+<li id="_tabs_4_gradle" class="tab">
+<p>Gradle</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_4_maven--panel" class="tabpanel" aria-labelledby="_tabs_4_maven">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;!-- We assume you use `log4j-bom` for dependency management --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
+  &lt;artifactId&gt;log4j-jdbc-dbcp2&lt;/artifactId&gt;
+  &lt;scope&gt;runtime&lt;/scope&gt;
+&lt;/dependency&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_4_gradle--panel" class="tabpanel" aria-labelledby="_tabs_4_gradle">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">// We assume you use `log4j-bom` for dependency management
+runtimeOnly 'org.apache.logging.log4j:log4j-jdbc-dbcp2'</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-jdbc-dbcp2_org-apache-logging-log4j-core-appender-db-jdbc-PoolingDriverConnectionSource" class="xref page">&#x1F4D6; Plugin reference for <code>PoolingDriver</code></a></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="JdbcAppender-MapMessage"><a class="anchor" href="#JdbcAppender-MapMessage"></a>Map Message handling</h3>
+<div class="paragraph">
+<p>If the optional <a href="#JdbcAppender-element-Layout">nested element of type <code>Layout&lt;? Extends Message&gt;</code></a> is provided, log events containing messages of type
+<a href="https://logging.apache.org/log4j/2.x/manual/messages.html#MapMessage"><code>MapMessage</code></a>
+will be treated specially.
+For each <a href="#ColumnMapping">column mapping</a> (except those containing literals) the <a href="#ColumnMapping-attr-source"><code>source</code></a> attribute will be used as key to the value in <code>MapMessage</code> that will be stored in column <a href="#ColumnMapping-attr-name"><code>name</code></a>.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="JdbcAppender-examples"><a class="anchor" href="#JdbcAppender-examples"></a>Configuration examples</h3>
+<div class="paragraph">
+<p>Here is an example JDBC Appender configuration:</p>
+</div>
+<div id="_tabs_5" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_5_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_5_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_5_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_5_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_5_xml--panel" class="tabpanel" aria-labelledby="_tabs_5_xml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/jdbc.xml"><code>log4j2.xml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;JDBC name="JDBC"
+      tableName="logs"
+      bufferSize="10"&gt; <i class="conum" data-value="1"></i><b>(1)</b>
+  <i class="conum" data-value="2"></i><b>(2)</b>
+  &lt;DataSource jndiName="java:comp/env/jdbc/logging"/&gt;
+  <i class="conum" data-value="3"></i><b>(3)</b>
+  &lt;ColumnMapping name="id"
+                 pattern="%uuid{TIME}"
+                 columnType="java.util.UUID"/&gt;
+  &lt;ColumnMapping name="timestamp" columnType="java.util.Date"/&gt;
+  &lt;ColumnMapping name="level" pattern="%level"/&gt;
+  &lt;ColumnMapping name="marker" pattern="%marker"/&gt;
+  &lt;ColumnMapping name="logger" pattern="%logger"/&gt;
+  &lt;ColumnMapping name="message" pattern="%message"/&gt;
+  &lt;ColumnMapping name="mdc"
+                 columnType="org.apache.logging.log4j.spi.ThreadContextMap"/&gt;
+  &lt;ColumnMapping name="ndc"
+                 columnType="org.apache.logging.log4j.spi.ThreadContextStack"/&gt;
+&lt;/JDBC&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_5_json--panel" class="tabpanel" aria-labelledby="_tabs_5_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/jdbc.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"JDBC": {
+  "name": "JDBC",
+  "tableName": "logs",
+  <i class="conum" data-value="1"></i><b>(1)</b>
+  "bufferSize": 10,
+  <i class="conum" data-value="2"></i><b>(2)</b>
+  "DataSource": {
+    "jndiName": "java:comp/env/jdbc/logging"
+  },
+  <i class="conum" data-value="3"></i><b>(3)</b>
+  "ColumnMapping": [
+    {
+      "name": "id",
+      "pattern": "%uuid{TIME}",
+      "columnType": "java.util.UUID"
+    },
+    {
+      "name": "timestamp",
+      "columnType": "java.util.Date"
+    },
+    {
+      "name": "level",
+      "pattern": "%level"
+    },
+    {
+      "name": "marker",
+      "pattern": "%marker"
+    },
+    {
+      "name": "logger",
+      "pattern": "%logger"
+    },
+    {
+      "name": "message",
+      "pattern": "%m"
+    },
+    {
+      "name": "mdc",
+      "columnType": "org.apache.logging.log4j.spi.ThreadContextMap"
+    },
+    {
+      "name": "ndc",
+      "columnType": "org.apache.logging.log4j.spi.ThreadContextStack"
+    }
+  ]
+}</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_5_yaml--panel" class="tabpanel" aria-labelledby="_tabs_5_yaml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/jdbc.yaml"><code>log4j2.yaml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">JDBC:
+  name: "JDBC"
+  tableName: "logs"
+  <i class="conum" data-value="1"></i><b>(1)</b>
+  bufferSize: 10
+  <i class="conum" data-value="2"></i><b>(2)</b>
+  DataSource:
+    jndiName: "java:comp/env/jdbc/logging"
+  <i class="conum" data-value="3"></i><b>(3)</b>
+  ColumnMapping:
+    - name: "id"
+      pattern: "%uuid{TIME}"
+      columnType: "java.util.UUID"
+    - name: "timestamp"
+      columnType: "java.util.Date"
+    - name: "level"
+      pattern: "%level"
+    - name: "marker"
+      pattern: "%marker"
+    - name: "logger"
+      pattern: "%logger"
+    - name: "message"
+      pattern: "%message"
+    - name: "mdc"
+      columnType: "org.apache.logging.log4j.spi.ThreadContextMap"
+    - name: "ndc"
+      columnType: "org.apache.logging.log4j.spi.ThreadContextStack"</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_5_properties--panel" class="tabpanel" aria-labelledby="_tabs_5_properties">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/jdbc.properties"><code>log4j2.properties</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">Appenders.0.type = JDBC
+Appenders.0.name = JDBC
+Appenders.0.tableName = logs
+<i class="conum" data-value="1"></i><b>(1)</b>
+Appenders.0.bufferSize = 10
+
+<i class="conum" data-value="2"></i><b>(2)</b>
+Appenders.0.ds.type = DataSource
+Appenders.0.ds.jndiName = java:comp/env/jdbc/logging
+
+<i class="conum" data-value="3"></i><b>(3)</b>
+Appenders.0.col[0].type = ColumnMapping
+Appenders.0.col[0].name = uuid
+Appenders.0.col[0].pattern = %uuid{TIME}
+Appenders.0.col[0].columnType = java.util.UUID
+
+Appenders.0.col[1].type = ColumnMapping
+Appenders.0.col[1].name = timestamp
+Appenders.0.col[1].timestamp = java.util.Date
+
+Appenders.0.col[2].type = ColumnMapping
+Appenders.0.col[2].name = level
+Appenders.0.col[2].pattern = %level
+
+Appenders.0.col[3].type = ColumnMapping
+Appenders.0.col[3].name = marker
+Appenders.0.col[3].pattern = %marker
+
+Appenders.0.col[4].type = ColumnMapping
+Appenders.0.col[4].name = logger
+Appenders.0.col[4].pattern = %logger
+
+Appenders.0.col[5].type = ColumnMapping
+Appenders.0.col[5].name = message
+Appenders.0.col[5].pattern = %message
+
+Appenders.0.col[6].type = ColumnMapping
+Appenders.0.col[6].name = mdc
+Appenders.0.col[6].columnType = org.apache.logging.log4j.spi.ThreadContextMap
+
+Appenders.0.col[7].type = ColumnMapping
+Appenders.0.col[7].name = ndc
+Appenders.0.col[7].columnType = org.apache.logging.log4j.spi.ThreadContextStack</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>Enables buffering.
+Messages are sent in batches of 10.</td>
+</tr>
+<tr>
+<td><i class="conum" data-value="2"></i><b>2</b></td>
+<td>A <a href="#DataSourceConnectionSource"><code>JNDI</code> data source</a> is used.</td>
+</tr>
+<tr>
+<td><i class="conum" data-value="3"></i><b>3</b></td>
+<td>An example of column mapping.
+See <a href="#ColumnMapping">Column mapping</a> for more details.</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The example above uses the following table schema:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-sql hljs" data-lang="sql">CREATE TABLE logs
+(
+    id        BIGINT PRIMARY KEY,
+    level     VARCHAR,
+    marker    VARCHAR,
+    logger    VARCHAR,
+    message   VARCHAR,
+    timestamp TIMESTAMP,
+    mdc       VARCHAR,
+    ndc       VARCHAR
+);</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="NoSqlAppender"><a class="anchor" href="#NoSqlAppender"></a>NoSQL Appender</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The NoSQL Appender writes log events to a
+<a href="https://en.wikipedia.org/wiki/Document-oriented_database#Implementations">document-oriented NoSQL database</a>
+using an internal lightweight provider interface.
+It supports the following configuration options:</p>
+</div>
+<table id="NoSqlAppender-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 11. NoSQL Appender configuration attributes</caption>
+<colgroup>
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 12.5%;">
+<col style="width: 62.5%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Required</p></th>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="NoSqlAppender-attr-name"></a>name</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top" colspan="4"><p class="tableblock">Optional</p></th>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="NoSqlAppender-attr-bufferSize"></a>bufferSize</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The number of log messages to batch before writing to the database.
+If <code>0</code>, batching is disabled.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="NoSqlAppender-attr-ignoreExceptions"></a>ignoreExceptions</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If <code>false</code>, logging exception will be forwarded to the caller of the logging statement.
+Otherwise, they will be ignored.</p></td>
+</tr>
+</tbody>
+</table>
+<table id="NoSqlAppender-elements" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 12. NoSQL Appender nested elements</caption>
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 16.6666%;">
+<col style="width: 66.6668%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Multiplicity</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="NoSqlAppender-element-Filter"></a><a href="../filters.html" class="xref page"><code>Filter</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Allows filtering log events just before they are formatted and sent.</p>
+<p class="tableblock">See also <a href="../filters.html#appender-stage" class="xref page">appender filtering stage</a>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="NoSqlAppender-element-KeyValuePair"></a><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-util-KeyValuePair" class="xref page"><code>KeyValuePair</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Zero or more</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
+<p>Adds a simple key/value field to the NoSQL object.</p>
+</div>
+<div class="paragraph">
+<p>The <code>value</code> attribute of the pair supports
+<a href="../configuration.html#lazy-property-substitution" class="xref page">runtime property substitution</a>
+using the
+<a href="../lookups.html#event-context" class="xref page">current event as context</a>.</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="NoSqlAppender-element-Layout"></a><a href="#NoSqlAppender-formatting"><code>Layout</code></a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">zero or one</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">An optional
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/Layout.html"><code>Layout&lt;? extends MapMessage&gt;</code></a>
+implementation that formats a log event as
+<a href="https://logging.apache.org/log4j/2.x/manual/messages.html#MapMessage"><code>MapMessage</code></a>.</p>
+<p class="tableblock">See <a href="#NoSqlAppender-formatting">Formatting</a> for more details.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-core_org-apache-logging-log4j-core-appender-nosql-NoSqlAppender" class="xref page">&#x1F4D6; Plugin reference for <code>NoSQL</code></a></p>
+</div>
+<div class="sect2">
+<h3 id="NoSqlAppender-formatting"><a class="anchor" href="#NoSqlAppender-formatting"></a>Formatting</h3>
+<div class="paragraph">
+<p>This appender transforms log events into NoSQL documents in two ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the optional <a href="#NoSqlAppender-element-Layout"><code>Layout</code></a> configuration element is provided, the
+<a href="https://logging.apache.org/log4j/2.x/manual/messages.html#MapMessage"><code>MapMessage</code></a>
+returned by the layout will be converted into its NoSQL document.</p>
+</li>
+<li>
+<p>Otherwise, a default conversion will be applied.
+You enhance the format with additional top level key/value pairs using nested
+<a href="#NoSqlAppender-element-KeyValuePair"><code>KeyValuePair</code></a> configuration elements.</p>
+<details>
+<summary class="title">Click to see an example of default log event formatting</summary>
+<div class="content">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{
+  "level": "WARN",
+  "loggerName": "com.example.application.MyClass",
+  "message": "Something happened that you might want to know about.",
+  "source": {
+    "className": "com.example.application.MyClass",
+    "methodName": "exampleMethod",
+    "fileName": "MyClass.java",
+    "lineNumber": 81
+  },
+  "marker": {
+    "name": "SomeMarker",
+    "parent": {
+      "name": "SomeParentMarker"
+    }
+  },
+  "threadName": "Thread-1",
+  "millis": 1368844166761,
+  "date": "2013-05-18T02:29:26.761Z",
+  "thrown": {
+    "type": "java.sql.SQLException",
+    "message": "Could not insert record. Connection lost.",
+    "stackTrace": [
+      {
+        "className": "org.example.sql.driver.PreparedStatement$1",
+        "methodName": "responder",
+        "fileName": "PreparedStatement.java",
+        "lineNumber": 1049
+      },
+      {
+        "className": "org.example.sql.driver.PreparedStatement",
+        "methodName": "executeUpdate",
+        "fileName": "PreparedStatement.java",
+        "lineNumber": 738
+      },
+      {
+        "className": "com.example.application.MyClass",
+        "methodName": "exampleMethod",
+        "fileName": "MyClass.java",
+        "lineNumber": 81
+      },
+      {
+        "className": "com.example.application.MainClass",
+        "methodName": "main",
+        "fileName": "MainClass.java",
+        "lineNumber": 52
+      }
+    ],
+    "cause": {
+      "type": "java.io.IOException",
+      "message": "Connection lost.",
+      "stackTrace": [
+        {
+          "className": "java.nio.channels.SocketChannel",
+          "methodName": "write",
+          "fileName": null,
+          "lineNumber": -1
+        },
+        {
+          "className": "org.example.sql.driver.PreparedStatement$1",
+          "methodName": "responder",
+          "fileName": "PreparedStatement.java",
+          "lineNumber": 1032
+        },
+        {
+          "className": "org.example.sql.driver.PreparedStatement",
+          "methodName": "executeUpdate",
+          "fileName": "PreparedStatement.java",
+          "lineNumber": 738
+        },
+        {
+          "className": "com.example.application.MyClass",
+          "methodName": "exampleMethod",
+          "fileName": "MyClass.java",
+          "lineNumber": 81
+        },
+        {
+          "className": "com.example.application.MainClass",
+          "methodName": "main",
+          "fileName": "MainClass.java",
+          "lineNumber": 52
+        }
+      ]
+    }
+  },
+  "contextMap": {
+    "ID": "86c3a497-4e67-4eed-9d6a-2e5797324d7b",
+    "username": "JohnDoe"
+  },
+  "contextStack": [
+    "topItem",
+    "anotherItem",
+    "bottomItem"
+  ]
+}</code></pre>
+</div>
+</div>
+</div>
+</details>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="NoSqlProvider"><a class="anchor" href="#NoSqlProvider"></a>Providers</h3>
+<div class="paragraph">
+<p>The NoSQL Appender only handles the conversion of log events into NoSQL documents, and it delegates database-specific tasks to a NoSQL provider.
+NoSQL providers are Log4j plugins that implement the
+<a href="../../javadoc/log4j-core/org/apache/logging/log4j/core/appender/nosql/NoSqlProvider.html"><code>NoSqlProvider</code></a>
+interface.</p>
+</div>
+<div class="paragraph">
+<p>Log4j Core 3 provides a single <a href="#NoSQLProvider-MongoDB">MongoDB Provider</a>, but
+<a href="https://logging.apache.org/log4j/2.x/manual/appenders/database.html#NoSqlProvider">version 2 providers</a>
+can also be used.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="NoSQLProvider-MongoDB"><a class="anchor" href="#NoSQLProvider-MongoDB"></a>MongoDB Provider</h3>
+<div class="paragraph">
+<p>Starting with version 2.11.0, Log4j supplies providers for the
+<a href="https://www.mongodb.com/">MongoDB</a>
+NoSQL database engine, based on the
+<a href="https://www.mongodb.com/docs/drivers/java/sync/current/">MongoDB synchronous Java driver</a>.
+The choice of the provider to use depends on:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the major version of the MongoDB Java driver your application uses: Log4j supports all major versions starting from version 2.</p>
+</li>
+<li>
+<p>the type of driver API used: either the <em>Legacy API</em> or the <em>Modern API</em>.
+See <a href="https://www.mongodb.com/docs/drivers/java/sync/current/legacy/">MongoDB documentation</a>
+for the difference between APIs.</p>
+</li>
+</ul>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The list of dependencies of your application provides a hint as to which driver API your application is using.
+If your application contains any one of these dependencies, it might use the <strong>Legacy API</strong>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>org.mongodb:mongo-java-driver</code></p>
+</li>
+<li>
+<p><code>org.mongodb:mongodb-driver-legacy</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If you application only uses <code>org.mongodb:mongodb-driver-sync</code>, it uses the <strong>Modern API</strong>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The version of the MongoDB Java driver is not the same as the version of the MongoDB server.
+See
+<a href="https://www.mongodb.com/docs/drivers/java/sync/current/compatibility/">MongoDB compatibility matrix</a>
+for more information.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>In order to use a Log4j MongoDB appender you need to add the following dependencies to your application:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 13. MongoDB providers compatibility table</caption>
+<colgroup>
+<col style="width: 18.1818%;">
+<col style="width: 18.1818%;">
+<col style="width: 18.1818%;">
+<col style="width: 45.4546%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Driver version</th>
+<th class="tableblock halign-left valign-top">Driver API</th>
+<th class="tableblock halign-left valign-top">Log4j artifact</th>
+<th class="tableblock halign-left valign-top">Notes</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2.x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Legacy</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb2"><code>log4j-mongodb2</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Reached end-of-support.</p>
+<p class="tableblock">Last released version: <code>2.12.4</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a id="NoSQLAppenderMongoDB3"></a><code>3.x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Legacy</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb3"><code>log4j-mongodb3</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Reached end-of-support.</p>
+<p class="tableblock">Last released version: <code>2.23.1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>4.x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Modern</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb4"><code>log4j-mongodb4</code></a></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5.x</code> or later</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Modern</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-mongodb"><code>log4j-mongodb</code></a></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>If you are note sure, which implementation to choose, <code>log4j-mongodb</code> is the recommended choice.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="sect3">
+<h4 id="MongoDbProvider"><a class="anchor" href="#MongoDbProvider"></a>MongoDb Provider (current)</h4>
+<div class="paragraph">
+<p>The <code>MongoDb</code> provider is based on the
+<a href="https://www.mongodb.com/docs/drivers/java/sync/current/">current version of the MongoDB Java driver</a>.
+It supports the following configuration options:</p>
+</div>
+<table id="MongoDbProvider-attributes" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 14. MongoDb Provider configuration attributes</caption>
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 11.1111%;">
+<col style="width: 22.2222%;">
+<col style="width: 55.5556%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Attribute</th>
+<th class="tableblock halign-left valign-top">Type</th>
+<th class="tableblock halign-left valign-top">Default value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="MongoDbProvider-attr-connection"></a>connection</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://mongodb.github.io/mongo-java-driver/5.1/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html"><code>ConnectionString</code></a></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">It specifies the connection URI used to reach the server.</p>
+<p class="tableblock">See
+<a href="https://www.mongodb.com/docs/drivers/java/sync/current/fundamentals/connection/connect/#connection-uri">Connection URI documentation</a>
+for its format.</p>
+<p class="tableblock"><strong>Required</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="MongoDbProvider-attr-capped"></a>capped</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If <code>true</code>, a
+<a href="https://www.mongodb.com/docs/manual/core/capped-collections/">capped collection</a>
+will be used.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a id="MongoDbProvider-attr-collectionSize"></a>collectionSize</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>long</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>512 MiB</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">It specifies the capped collection size of bytes.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Additional runtime dependencies are required to use the <code>MongoDb</code> provider:</p>
+</div>
+<div id="_tabs_6" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_6_maven" class="tab">
+<p>Maven</p>
+</li>
+<li id="_tabs_6_gradle" class="tab">
+<p>Gradle</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_6_maven--panel" class="tabpanel" aria-labelledby="_tabs_6_maven">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;!-- We assume you use `log4j-bom` for dependency management --&gt;
+&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
+  &lt;artifactId&gt;log4j-mongodb&lt;/artifactId&gt;
+  &lt;scope&gt;runtime&lt;/scope&gt;
+&lt;/dependency&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_6_gradle--panel" class="tabpanel" aria-labelledby="_tabs_6_gradle">
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-groovy hljs" data-lang="groovy">// We assume you use `log4j-bom` for dependency management
+runtimeOnly 'org.apache.logging.log4j:log4j-mongodb'</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="paragraph">
+<p><a href="../../plugin-reference.html#org-apache-logging-log4j_log4j-mongodb_org-apache-logging-log4j-mongodb-MongoDbProvider" class="xref page">&#x1F4D6; Plugin reference for <code>MongoDb</code></a></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="NoSqlAppender-examples"><a class="anchor" href="#NoSqlAppender-examples"></a>Configuration examples</h3>
+<div class="paragraph">
+<p>To connect the NoSQL Appender to a MongoDB database, you only need to provide a connection string:</p>
+</div>
+<div id="_tabs_7" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_7_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_7_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_7_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_7_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_7_xml--panel" class="tabpanel" aria-labelledby="_tabs_7_xml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.xml"><code>log4j2.xml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;NoSql name="MONGO"&gt;
+  &lt;MongoDb connection="mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs"/&gt;
+&lt;/NoSql&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_7_json--panel" class="tabpanel" aria-labelledby="_tabs_7_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"NoSql": {
+  "name": "MONGO",
+  "MongoDb": {
+    "connection": "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs"
+  }
+}</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_7_yaml--panel" class="tabpanel" aria-labelledby="_tabs_7_yaml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.yaml"><code>log4j2.yaml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">NoSql:
+  name: "MONGO"
+  MongoDb:
+    connection: "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs"</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_7_properties--panel" class="tabpanel" aria-labelledby="_tabs_7_properties">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.properties"><code>log4j2.properties</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">Appenders.1.type = NoSql
+Appenders.1.name = MONGO
+Appenders.1.provider.type = MongoDB
+Appenders.1.provider.connection = mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Make sure to not let <code>org.bson</code>, <code>com.mongodb</code> log to a MongoDB database on a <code>DEBUG</code> level, since that will cause recursive logging:</p>
+</div>
+<div id="_tabs_8" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_8_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_8_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_8_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_8_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_8_xml--panel" class="tabpanel" aria-labelledby="_tabs_8_xml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.xml"><code>log4j2.xml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;Root level="INFO"&gt;
+  &lt;AppenderRef ref="MONGO"/&gt;
+&lt;/Root&gt;
+&lt;Logger name="org.bson"
+        level="WARN"
+        additivity="false"&gt; <i class="conum" data-value="1"></i><b>(1)</b>
+  &lt;AppenderRef ref="FILE"/&gt;
+&lt;/Logger&gt;
+&lt;Logger name="com.mongodb"
+        level="WARN"
+        additivity="false"&gt; <i class="conum" data-value="1"></i><b>(1)</b>
+  &lt;AppenderRef ref="FILE"/&gt;
+&lt;/Logger&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_8_json--panel" class="tabpanel" aria-labelledby="_tabs_8_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"Root": {
+  "level": "INFO",
+  "AppenderRef": {
+    "ref": "MONGO"
+  }
+},
+"Logger": [
+  {
+    "name": "org.bson",
+    "level": "WARN",
+    "additivity": false, <i class="conum" data-value="1"></i><b>(1)</b>
+    "AppenderRef": {
+      "ref": "FILE"
+    }
+  },
+  {
+    "name": "com.mongodb",
+    "level": "WARN",
+    "additivity": false, <i class="conum" data-value="1"></i><b>(1)</b>
+    "AppenderRef": {
+      "ref": "FILE"
+    }
+  }
+]</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_8_yaml--panel" class="tabpanel" aria-labelledby="_tabs_8_yaml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.yaml"><code>log4j2.yaml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">Root:
+  level: "INFO"
+  AppenderRef:
+    ref: "MONGO"
+Logger:
+  - name: "org.bson"
+    level: "WARN"
+    additivity: false <i class="conum" data-value="1"></i><b>(1)</b>
+    AppenderRef:
+      ref: "FILE"
+  - name: "com.mongodb"
+    level: "WARN"
+    additivity: false <i class="conum" data-value="1"></i><b>(1)</b>
+    AppenderRef:
+      ref: "FILE"</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_8_properties--panel" class="tabpanel" aria-labelledby="_tabs_8_properties">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo.properties"><code>log4j2.properties</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">Loggers.Root.level = INFO
+Loggers.Root.AppenderRef.ref = MONGO
+
+Loggers.Logger[1].name = org.bson
+Loggers.Logger[1].level = WARN
+<i class="conum" data-value="1"></i><b>(1)</b>
+Loggers.Logger[1].additivity = false
+Loggers.Logger[1].AppenderRef.ref = FILE
+
+Loggers.Logger[2].name = com.mongodb
+Loggers.Logger[2].level = WARN
+<i class="conum" data-value="1"></i><b>(1)</b>
+Loggers.Logger[2].additivity = false
+Loggers.Logger[2].AppenderRef.ref = FILE</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>Remember to set the <a href="../configuration.html#logger-attributes-additivity" class="xref page"><code>additivity</code></a> configuration attribute to <code>false</code>.</td>
+</tr>
+</table>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>You can define additional fields to the NoSQL document using <a href="#NoSqlAppender-element-KeyValuePair"><code>KeyValuePair</code> elements</a>, for example:</p>
+</div>
+<div id="_tabs_9" class="openblock tabs is-sync is-loading">
+<div class="content">
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_9_xml" class="tab">
+<p>XML</p>
+</li>
+<li id="_tabs_9_json" class="tab">
+<p>JSON</p>
+</li>
+<li id="_tabs_9_yaml" class="tab">
+<p>YAML</p>
+</li>
+<li id="_tabs_9_properties" class="tab">
+<p>Properties</p>
+</li>
+</ul>
+</div>
+<div id="_tabs_9_xml--panel" class="tabpanel" aria-labelledby="_tabs_9_xml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.xml"><code>log4j2.xml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">&lt;NoSql name="MONGO"&gt;
+  &lt;MongoDb connection="mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs"/&gt;
+  &lt;KeyValuePair key="startTime" value="${date:yyyy-MM-dd hh:mm:ss.SSS}"/&gt; <i class="conum" data-value="1"></i><b>(1)</b>
+  &lt;KeyValuePair key="currentTime" value="$${date:yyyy-MM-dd hh:mm:ss.SSS}"/&gt; <i class="conum" data-value="2"></i><b>(2)</b>
+&lt;/NoSql&gt;</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_9_json--panel" class="tabpanel" aria-labelledby="_tabs_9_json">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.json"><code>log4j2.json</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">"NoSql": {
+  "name": "MONGO",
+  "MongoDb": {
+    "connection": "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs"
+  },
+  "KeyValuePair": [
+    {
+      "key": "startTime",
+      "value": "${date:yyyy-MM-dd hh:mm:ss.SSS}" <i class="conum" data-value="1"></i><b>(1)</b>
+    },
+    {
+      "key": "currentTime",
+      "value": "$${date:yyyy-MM-dd hh:mm:ss.SSS}" <i class="conum" data-value="2"></i><b>(2)</b>
+    }
+  ]
+}</code></pre>
+</div>
+</div>
+</div>
+<div id="_tabs_9_yaml--panel" class="tabpanel" aria-labelledby="_tabs_9_yaml">
+<div class="listingblock">
+<div class="title">Snippet from an example <a href="https://github.com/apache/logging-log4j2/tree/main/src/site/antora/modules/ROOT/examples/manual/appenders/database/nosql-mongo-keys.yaml"><code>log4j2.yaml</code></a></div>
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">NoSql:
+  name: "MONGO"
+  MongoDb:
+    connection: "mongodb://${env:DB_USER}:${env:DB_PASS}@localhost:27017/logging.logs"
... 11557 lines suppressed ...