This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch 2.x-site-stg-out
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/2.x-site-stg-out by this push:
new b8156080cc Add website content generated from
`34c8b4af6a46bf7ad994e04052f40cc1d233ce54`
b8156080cc is described below
commit b8156080ccb898afbb71d44e4e2d6f90e9474880
Author: ASF Logging Services RM <[email protected]>
AuthorDate: Wed Jun 12 19:21:06 2024 +0000
Add website content generated from
`34c8b4af6a46bf7ad994e04052f40cc1d233ce54`
---
.htaccess | 28 +-
_images/whichjar-log4j-1.2-api.png | Bin 24992 -> 0 bytes
_images/whichjar-log4j-api.png | Bin 16515 -> 0 bytes
log4j-1.2-api.html | 489 --------------
manual/appenders.html | 6 +-
manual/extending.html | 2 +-
manual/migration.html | 1290 +++++++++++++++++++++++++-----------
plugin-reference.html | 2 +-
sitemap.xml | 122 ++--
9 files changed, 979 insertions(+), 960 deletions(-)
diff --git a/.htaccess b/.htaccess
index 708c2c5df7..ce7adc4556 100644
--- a/.htaccess
+++ b/.htaccess
@@ -33,26 +33,17 @@ RewriteRule "^(.+)$" "$1.html"
# The content moved between pages
RewriteRule "^articles\.html$" "manual/index.html" [R=permanent]
+RewriteRule "^log4j-1\.2-api(/index)?\.html$" "manual/migration.html"
[R=permanent]
RewriteRule "^log4j-api/apidocs(.*)$" "javadoc/log4j-api$1" [R=permanent]
-RewriteRule "^log4j-api/index\.html$" "manual/api.html" [R=permanent]
-RewriteRule "^log4j-api\.html$" "manual/api.html" [R=permanent]
+RewriteRule "^log4j-api(/index)?\.html$" "manual/api.html" [R=permanent]
RewriteRule "^log4j-core/apidocs(.*)$" "javadoc/log4j-core$1" [R=permanent]
-RewriteRule "^log4j-jcl/index\.html$"
"manual/installation.html#impl-core-bridge-jcl" [R=permanent,NE]
-RewriteRule "^log4j-jcl\.html$"
"manual/installation.html#impl-core-bridge-jcl" [R=permanent,NE]
-RewriteRule "^log4j-jmx-gui/index\.html$" "/log4j/jmx-gui/latest/index.html"
[R=permanent]
-RewriteRule "^log4j-jmx-gui\.html$" "/log4j/jmx-gui/latest/index.html"
[R=permanent]
-RewriteRule "^log4j-jpl/index\.html$"
"manual/installation.html#impl-core-bridge-jpl" [R=permanent,NE]
-RewriteRule "^log4j-jpl\.html$"
"manual/installation.html#impl-core-bridge-jpl" [R=permanent,NE]
-RewriteRule "^log4j-jul/index\.html$"
"manual/installation.html#impl-core-bridge-jul" [R=permanent,NE]
-RewriteRule "^log4j-jul\.html$"
"manual/installation.html#impl-core-bridge-jul" [R=permanent,NE]
-RewriteRule "^log4j-mongodb3\.html$"
"manual/appenders.html#NoSQLAppenderMongoDB" [R=permanent,NE]
-RewriteRule "^log4j-mongodb3/index\.html$"
"manual/appenders.html#NoSQLAppenderMongoDB" [R=permanent,NE]
-RewriteRule "^log4j-mongodb4\.html$" "manual/appenders.html#log4j-mongodb4"
[R=permanent,NE]
-RewriteRule "^log4j-mongodb4/index\.html$"
"manual/appenders.html#log4j-mongodb4" [R=permanent,NE]
-RewriteRule "^log4j-slf4j-impl/index\.html$"
"manual/installation.html#impl-core-bridge-slf4j" [R=permanent,NE]
-RewriteRule "^log4j-slf4j-impl\.html$"
"manual/installation.html#impl-core-bridge-slf4j" [R=permanent,NE]
-RewriteRule "^log4j-slf4j2-impl/index\.html$"
"manual/installation.html#impl-core-bridge-slf4j" [R=permanent,NE]
-RewriteRule "^log4j-slf4j2-impl\.html$"
"manual/installation.html#impl-core-bridge-slf4j" [R=permanent,NE]
+RewriteRule "^log4j-jcl(/index)?\.html$"
"manual/installation.html#impl-core-bridge-jcl" [R=permanent,NE]
+RewriteRule "^log4j-jmx-gui(/index)?\.html$"
"/log4j/jmx-gui/latest/index.html" [R=permanent]
+RewriteRule "^log4j-jpl(/index)?\.html$"
"manual/installation.html#impl-core-bridge-jpl" [R=permanent,NE]
+RewriteRule "^log4j-jul(/index)?\.html$"
"manual/installation.html#impl-core-bridge-jul" [R=permanent,NE]
+RewriteRule "^log4j-mongodb3(/index)?\.html$"
"manual/appenders.html#NoSQLAppenderMongoDB" [R=permanent,NE]
+RewriteRule "^log4j-mongodb4(/index)?\.html$"
"manual/appenders.html#log4j-mongodb4" [R=permanent,NE]
+RewriteRule "^log4j-slf4j2?-impl(/index)?\.html$"
"manual/installation.html#impl-core-bridge-slf4j" [R=permanent,NE]
RewriteRule "^manual/api-separation\.html$" "manual/api.html" [R=permanent]
RewriteRule "^manual/extending\.html#Layouts$" "manual/layouts.html#extending"
[R=permanent]
RewriteRule "^manual/extending\.html#PatternConverters$"
"manual/pattern-layout.html#extending-converters" [R=permanent]
@@ -106,7 +97,6 @@ RewriteRule "^thanks\.html$" "/support.html#sponsors"
[R=permanent,NE]
# 2. we replaced a directory like `log4j-api/` with a file that has the same
prefix like `log4j-api.html`,
#
# if the URI path is `/log4j/2.x/log4j-api/foo` we must match
`log4j-api.html/foo`.
-RewriteRule "^log4j-1\.2-api\.html/index\.html$" "log4j-1.2-api.html"
[R=permanent]
RewriteRule "^log4j-appserver\.html/index\.html$" "log4j-appserver.html"
[R=permanent]
RewriteRule "^log4j-cassandra\.html/index\.html$" "log4j-cassandra.html"
[R=permanent]
RewriteRule "^log4j-couchdb\.html/index\.html$" "log4j-couchdb.html"
[R=permanent]
diff --git a/_images/whichjar-log4j-1.2-api.png
b/_images/whichjar-log4j-1.2-api.png
deleted file mode 100644
index 8b54810904..0000000000
Binary files a/_images/whichjar-log4j-1.2-api.png and /dev/null differ
diff --git a/_images/whichjar-log4j-api.png b/_images/whichjar-log4j-api.png
deleted file mode 100644
index 194196aad3..0000000000
Binary files a/_images/whichjar-log4j-api.png and /dev/null differ
diff --git a/log4j-1.2-api.html b/log4j-1.2-api.html
deleted file mode 100644
index 6bde58ce41..0000000000
--- a/log4j-1.2-api.html
+++ /dev/null
@@ -1,489 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <title>Log4j 1.2 Bridge :: Apache Log4j</title>
- <link rel="canonical"
href="https://logging.apache.org/log4j/2.x/log4j-1.2-api.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>
- /* 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 <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">Support</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="https://logging.apache.org/security">Security</a>
- </li>
-</ul>
- </li>
-</ul>
- </li>
- <li class="nav-item" data-depth="0">
- <button class="nav-item-toggle"></button>
- <a class="nav-link" href="manual/index.html">Manual</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="1">
- <a class="nav-link" href="manual/getting-started.html">Getting started</a>
- </li>
- <li class="nav-item" data-depth="1">
- <a class="nav-link" href="manual/installation.html">Installation</a>
- </li>
- <li class="nav-item" data-depth="1">
- <a class="nav-link" href="manual/architecture.html">Architecture</a>
- </li>
- <li class="nav-item" data-depth="1">
- <button class="nav-item-toggle"></button>
- <a class="nav-link" href="manual/api.html">API</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="2">
- <button class="nav-item-toggle"></button>
- <a class="nav-link" href="manual/api.html#loggers">Loggers</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/eventlogging.html">Event Logger</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/resource-logger.html">Resource Logger</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/simple-logger.html">Simple Logger</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/status-logger.html">Status Logger</a>
- </li>
-</ul>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/logbuilder.html">Fluent API</a>
- </li>
- <li class="nav-item" data-depth="2">
- <button class="nav-item-toggle"></button>
- <a class="nav-link" href="manual/api.html#fish-tagging">Fish tagging</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/customloglevels.html">Levels</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/markers.html">Markers</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/scoped-context.html">Scoped Context</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/thread-context.html">Thread Context</a>
- </li>
-</ul>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/messages.html">Messages</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/flowtracing.html">Flow Tracing</a>
- </li>
-</ul>
- </li>
- <li class="nav-item" data-depth="1">
- <button class="nav-item-toggle"></button>
- <span class="nav-text">Configuration</span>
-<ul class="nav-list">
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/configuration.html">Configuration file</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/systemproperties.html">Configuration
properties</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/customconfig.html">Programmatic
Configuration</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/appenders.html">Appenders</a>
- </li>
- <li class="nav-item" data-depth="2">
- <button class="nav-item-toggle"></button>
- <a class="nav-link" href="manual/layouts.html">Layouts</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/json-template-layout.html">JSON Template
Layout</a>
- </li>
- <li class="nav-item" data-depth="3">
- <a class="nav-link" href="manual/pattern-layout.html">Pattern Layout</a>
- </li>
-</ul>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/lookups.html">Lookups</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/filters.html">Filters</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/scripts.html">Scripts</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/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="manual/extending.html">Extending</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/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="manual/performance.html">Performance</a>
-<ul class="nav-list">
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/async.html">Asynchronous loggers</a>
- </li>
- <li class="nav-item" data-depth="2">
- <a class="nav-link" href="manual/garbagefree.html">Garbage-free logging</a>
- </li>
-</ul>
- </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="manual/migration.html">Migrating from Log4j 1</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="manual/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-iostreams.html">Log4j IOStreams</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="/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="log4j-1.2-api.html">Log4j 1.2 Bridge</a></li>
- </ul>
-</nav>
-<div class="edit-this-page"><a
href="https://github.com/apache/logging-log4j2/edit/2.x/src/site/antora/modules/ROOT/pages/log4j-1.2-api.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">Log4j 1.2 Bridge</h1>
-<div id="preamble">
-<div class="sectionbody">
-<div class="paragraph">
-<p>The Log4j 1.2 Bridge allows applications coded to use Log4j 1.2 API to use
Log4j 2 instead.</p>
-</div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_requirements"><a class="anchor"
href="#_requirements"></a>Requirements</h2>
-<div class="sectionbody">
-<div class="paragraph">
-<p>The Log4j 1.2 bridge is dependent on the Log4j 2 API.
-The following Log4j 1.x methods will behave differently when the Log4j 2 Core
module is included then when it is not:</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">Method</th>
-<th class="tableblock halign-left valign-top">Without log4j-core</th>
-<th class="tableblock halign-left valign-top">With log4j-core</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Category.getParent()</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Returns
null</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Returns
parent logger</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Category.setLevel()</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">NoOp</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Sets
Logger Level</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Category.setPriority()</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">NoOp</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Sets
Logger Level</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Category.getAdditivity()</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Returns
false</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Returns
Logger’s additivity setting</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Category.setAdditivity()</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">NoOp</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Sets
additivity of LoggerConfig</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Category.getResourceBundle()</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">NoOp</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Returns
the resource bundle associated with the Logger</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">BasicConfigurator.configure()</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">NoOp</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Reconfigures Log4j 2</p></td>
-</tr>
-</tbody>
-</table>
-<div class="paragraph">
-<p>If log4j-core is not present location information will not be accurate in
calls using the Log4j 1.2 API.
-The config package which attempts to convert Log4j 1.x configurations to Log4j
2 is not supported without Log4j 2.</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>In order to use the Log4j 1.2 Bridge, additional dependencies are
required:</p>
-</div>
-<details id="log4j-1.2-api-deps">
-<summary class="title">Runtime dependencies</summary>
-<div class="content">
-<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 id="_tabs_1_gradle" class="tab">
-<p>Gradle</p>
-</li>
-</ul>
-</div>
-<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"><dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-1.2-api</artifactId>
- <version>2.23.1</version>
- <scope>runtime</scope>
-</dependency></code></pre>
-</div>
-</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.apache.logging.log4j:log4j-1.2-api:2.23.1'</code></pre>
-</div>
-</div>
-</div>
-</div>
-</div>
-</div>
-</details>
-</td>
-</tr>
-</table>
-</div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_usage"><a class="anchor" href="#_usage"></a>Usage</h2>
-<div class="sectionbody">
-<div class="paragraph">
-<p>To use the Log4j Legacy Bridge, you must first identify and remove all the
Log4j 1.x JARs from the application and replace them with the bridge JAR.
-Once in place, all logging that uses Log4j 1.x will be routed to Log4j 2.</p>
-</div>
-<div class="paragraph">
-<p>If you are using Maven, you can easily identify any Log4j 1.x dependencies
in your project by running the following command in your terminal:</p>
-</div>
-<div class="literalblock">
-<div class="content">
-<pre>mvn dependency:tree | grep 'log4j:log4j:'</pre>
-</div>
-</div>
-<div class="paragraph">
-<p>This command will generate a dependency tree for your project and filter
the results to show only Log4j 1.x dependencies.
-If you find any, you will need to update your pom.xml file to remove Log4j1 or
exclude them otherwise.</p>
-</div>
-<div class="paragraph">
-<p>While we have improved the compatibility of the bridge in the past,
applications that try to modify legacy Log4j by adding Appenders, Filters,
etc, may experience problems.
-In this case, migrating those components to Log4j 2 first is recommended.</p>
-</div>
-</div>
-</div>
-</article>
- </div>
-</main>
-</div>
-<footer class="footer">
- <p>
- Copyright © 1999-2024 <a href="https://www.apache.org/">The Apache
Software Foundation</a>.
- Licensed under the <a
href="https://www.apache.org/licenses/LICENSE-2.0">Apache Software License,
Version 2.0</a>.
- Please read our <a
href="https://privacy.apache.org/policies/privacy-policy-public.html">privacy
policy</a>.
- </p>
- <p>
- Apache, Log4j, and the Apache feather logo are trademarks or registered
trademarks of The Apache Software Foundation.
- Oracle and Java are registered trademarks of Oracle and/or its affiliates.
- Other names may be trademarks of their respective owners.
- </p>
-</footer>
-<script id="site-script" src="./_/js/site.js" data-ui-root-path="./_"></script>
-<script async src="./_/js/vendor/highlight.js"></script>
-<!-- `@asciidoctor/tabs` extension scripts -->
-<script async src="./_/js/vendor/tabs.js"></script>
- </body>
-</html>
diff --git a/manual/appenders.html b/manual/appenders.html
index a8e750dada..482f60bf54 100644
--- a/manual/appenders.html
+++ b/manual/appenders.html
@@ -2232,7 +2232,7 @@ table based on a Log4j `MapMessage</code> instead of
values from <code>LogEvent<
</div>
</div>
<div class="sect1">
-<h2 id="_jms_appender"><a class="anchor" href="#_jms_appender"></a>JMS
Appender</h2>
+<h2 id="jms-appender"><a class="anchor" href="#jms-appender"></a><a
id="JMSAppender"></a>JMS Appender</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The JMS Appender sends the formatted log event to a JMS Destination.</p>
@@ -4237,7 +4237,7 @@ and falls back to Log4J initialization time instead.)</p>
</div>
</div>
<div class="sect2">
-<h3 id="_sizebased_triggering_policy"><a class="anchor"
href="#_sizebased_triggering_policy"></a>SizeBased Triggering Policy</h3>
+<h3 id="sizebased-triggering-policy"><a class="anchor"
href="#sizebased-triggering-policy"></a>SizeBased Triggering Policy</h3>
<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>.
@@ -4250,7 +4250,7 @@ When used without a time-based triggering policy the
SizeBased Triggering Policy
</div>
</div>
<div class="sect2">
-<h3 id="_timebased_triggering_policy"><a class="anchor"
href="#_timebased_triggering_policy"></a>TimeBased Triggering Policy</h3>
+<h3 id="timebased-triggering-policy"><a class="anchor"
href="#timebased-triggering-policy"></a>TimeBased Triggering Policy</h3>
<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
diff --git a/manual/extending.html b/manual/extending.html
index bd9245ace8..ed147d79c8 100644
--- a/manual/extending.html
+++ b/manual/extending.html
@@ -365,7 +365,7 @@ and bound to the LogManager. In Log4j 2 this is provided by
</li>
<li>
<p>Implement a class that extends
-<a
href="../javadoc/log4j-api/org/apache/logging/spi/Provider.html"><code>org.apache.logging.spi.Provider</code></a>
+<a
href="../javadoc/log4j-api/org/apache/logging/log4j/spi/Provider.html"><code>org.apache.logging.log4j.spi.Provider</code></a>
with a no-arg constructor that calls super-class’s constructor with the
Priority, the API version(s), <code>LoggerContextFactory</code> class, and
optionally, a
diff --git a/manual/migration.html b/manual/migration.html
index 4f31038395..5f29733107 100644
--- a/manual/migration.html
+++ b/manual/migration.html
@@ -321,558 +321,1080 @@
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
-<p><a href="http://logging.apache.org/log4j/1.2/">Log4j 1.x</a> has <a
href="https://blogs.apache.org/foundation/entry/apache_logging_services_project_announces">reached
End of Life</a> in 2015 and is no longer supported.</p>
+<p><a href="https://logging.apache.org/log4j/1.x/index.html">Log4j 1</a>
+has reached <strong>End of Life</strong> in 2015 (see
+<a
href="https://blogs.apache.org/foundation/entry/apache_logging_services_project_announces">announcement</a>)
+and is no longer supported.</p>
</div>
<div class="paragraph">
-<p>This page explains how to migrate applications or libraries currently using
the Log4j 1.x API to use Log4j v2 as their main logging framework.</p>
-</div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="Log4j12Bridge"><a class="anchor" href="#Log4j12Bridge"></a>Option 1:
use the Log4j 1.x bridge (log4j-1.2-api)</h2>
-<div class="sectionbody">
-<div class="paragraph">
-<p>You may be able to convert an application to Log4j 2 <em>without any code
changes</em> by replacing the Log4j 1.x jar file with Log4j 2’s
<code>log4j-1.2-api.jar</code>.</p>
-</div>
-<div class="paragraph">
-<p>The Log4j 1.x bridge is useful when:</p>
+<p>Since Log4j 2 has been rewritten from scratch, it introduces many breaking
changes to its predecessor.
+Most notably:</p>
</div>
<div class="ulist">
<ul>
<li>
-<p>the application itself is (maybe partly) still using the Log4j 1.x API, or
if</p>
+<p>It uses a new package namespace (<code>org.apache.logging.log4j</code>),
whereas Log4j 1 used the <code>org.apache.log4j</code> namespace,</p>
</li>
<li>
-<p>the application depends on a library which depends on the Log 1.x API,
or</p>
+<p>It features a
+<a href="api.html" class="xref page">logging API</a>
+which is independent of its reference implementation,</p>
</li>
<li>
-<p>the application needs to support logging configurations in the old Log4j
1.x format.</p>
+<p>It uses a new more flexible
+<a href="configuration.html" class="xref page">configuration file format</a>,
+which is <strong>incompatible</strong> with the format used by Log4j 1.</p>
</li>
</ul>
</div>
-<div class="paragraph">
-<p>To use this option, applications need to use the following three jar files:
the Log4j 2 API jar (<code>log4j-api.jar</code>), the Log4j 2 implementation
jar (<code>log4j-core.jar</code>) and the Log4j 1.x bridge jar
(<code>log4j-1.2-api.jar</code>).</p>
-</div>
-<div class="paragraph">
-<p><span class="image"><img src="../_images/whichjar-log4j-1.2-api.png"
alt="Using log4j 2 via the log4j 1.x API"></span></p>
</div>
-<div class="paragraph">
-<p>For most applications this is sufficient.
-This is a low-effort way to migrate, and may also allow for migration to
proceed gradually over time.</p>
</div>
-<div class="sect2">
-<h3 id="enabling-the-log4j-1-x-bridge"><a class="anchor"
href="#enabling-the-log4j-1-x-bridge"></a>Enabling the Log4j 1.x bridge</h3>
+<div class="sect1">
+<h2 id="prepare-to-migrate"><a class="anchor"
href="#prepare-to-migrate"></a>Prepare to migrate</h2>
+<div class="sectionbody">
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+<div class="title">Are you a library developer?</div>
<div class="paragraph">
-<p>Enable the Log4j 1.x bridge via one of the following steps:</p>
-</div>
-<div class="olist arabic">
-<ol class="arabic">
-<li>
-<p>Set the system property "log4j1.compatibility" to a value of "true".
-Log4j 2 will then add log4j.properties, log4j-test.properties, log4j.xml and
log4j-test.xml to the <a href="configuration.html#AutomaticConfiguration"
class="xref page">configuration files</a> it searches for on the class path.</p>
-</li>
-<li>
-<p>Set the Log4j 1 system property "log4j.configuration" to the location of
the log4j 1 configuration file.
-The files must have a file extension of either ".properties" or ".xml".</p>
-</li>
-</ol>
+<p>If you are developing a library, which functionality is not related to
logging, you only need to rewrite the library to use Log4j 2 API.
+Skip directly to <a href="#api-migration">Log4j 1 API migration</a>.</p>
</div>
+</td>
+</tr>
+</table>
</div>
-<div class="sect2">
-<h3 id="APICompatibility"><a class="anchor" href="#APICompatibility"></a>API
Compatibility</h3>
<div class="paragraph">
-<p>Log4j 2 provides support for the Log4j 1 logging methods by providing
alternate implementations of the classes containing those methods.
-These classes may be found in the log4j-1.2-api jar distributed with the
project.
-All calls to perform logging will result in the data passed to the logging
methods to be forwarded to the Log4j2 API where they can be processed by
implementations of the Log4j 2 API.</p>
+<p>In order to migrate your application to Log4j 2 you need to assess first
how your application <strong>and</strong> its dependencies use Log4j 1.
+While Log4j 1 didn’t have a formal split between a logging API and a
logging backend, for the purpose of this guide, we’ll introduce the
following split:</p>
</div>
-</div>
-<div class="sect2">
-<h3 id="ConfigurationCompatibility"><a class="anchor"
href="#ConfigurationCompatibility"></a>Configuration Compatibility</h3>
+<div id="log4j-1-api-methods" class="dlist">
+<dl>
+<dt class="hdlist1">Log4j 1 API</dt>
+<dd>
<div class="paragraph">
-<p>Log4j 2 provides support for Log4j 1 configuration files.
-Configuration of the Appenders, Layouts and Filters that were provided in the
Log4j 1 distribution will be redirected to their Log4j 2 counterparts - with
the exception of the implemented Rewrite Policies.
-This means that although the behavior of these components will be similar,
they may not be exactly the same.
-For example, the XML generated by the XMLLayout may not exactly match the XML
generated by the Log4j1XMLLayout.</p>
+<p>It is the part of the Log4j 1 library that produces log events, and it is
the most commonly used.
+The methods that are considered part of the Log4j 1 API are listed below:</p>
</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 1. Log4j 1 API methods</caption>
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 66.6667%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Class name</th>
+<th class="tableblock halign-left valign-top">Methods</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/MDC.html">org.apache.log4j.MDC</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All
methods</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/NDC.html">org.apache.log4j.NDC</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All
methods</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Priority.html">org.apache.log4j.Priority</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All
methods</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Level.html">org.apache.log4j.Level</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All
methods</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Category.html">org.apache.log4j.Category</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All
methods, except: methods for the
+<a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/spi/AppenderAttachable.html">AppenderAttachable</a>
interface, <code>callsAppenders</code> and <code>setLevel</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Logger.html">org.apache.log4j.Logger</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Same as
<code>Category</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/LogManager.html">org.apache.log4j.LogManager</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All
methods</p></td>
+</tr>
+</tbody>
+</table>
+</dd>
+<dt class="hdlist1">Log4j 1 Backend</dt>
+<dd>
<div class="paragraph">
-<p>In addition, Log4j 2 supports custom Log4j 1 Appenders, Filters, and
Layouts with some constraints.
-Since the original Log4j 1 components may not be present in Log4j 2, custom
components that extend them will fail.</p>
-</div>
-<div class="sect3">
-<h4 id="_supported_components"><a class="anchor"
href="#_supported_components"></a>Supported Components</h4>
-<div class="paragraph">
-<p>Supported Appenders include: AsyncAppender, ConsoleAppender,
DailyRollingFileAppender, FileAppender, NullAppender, RewriteAppender
(limited), RollingFileAppender, SyslogAppender.</p>
+<p>This is the part of the logging library that consumes log events, formats
them and writes to their destination.
+It also allows to configure Log4j 1 programmatically.
+It is usually <strong>not used</strong> in code, since the recommended way to
configure Log4j 1 is through a configuration file.</p>
</div>
-<div class="paragraph">
-<p>Supported Filters include: DenyAllFilter, LevelMatchFilter,
LevelRangeFilter, StringMatchFilter.</p>
+</dd>
+</dl>
</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>Supported Layouts include: HtmlLayout, PatternLayout, SimpleLayout,
TTCCLayout , XmlLayout.</p>
+<p>While it is fairly simple to check which classes and methods in the
<code>org.apache.log4j</code> package are used by your own application, the
task is much more complex, when it comes to your application dependencies.</p>
</div>
<div class="paragraph">
-<p>Supported Rewrite Policies include: MapRewritePolicy,
PropertyRewritePolicy.</p>
-</div>
+<p>All the libraries that use <strong>Log4j 1 API</strong> in their code must
have a compile dependency on either
+<a href="https://central.sonatype.com/artifact/log4j/log4j">log4j:log4j</a>
+or its clone
+<a
href="https://central.sonatype.com/artifact/ch.qos.reload4j/reload4j">ch.qos.reload4j:reload4j</a>.
+There are however misconfigured libraries that declare those dependencies,
even if they don’t directly use Log4j 1 <strong>at all</strong>.</p>
</div>
-<div class="sect3">
-<h4 id="_unsupported_or_unimplemented_components"><a class="anchor"
href="#_unsupported_or_unimplemented_components"></a>Unsupported or
Unimplemented Components</h4>
<div class="paragraph">
-<p>If your configuration contains any of the below components, consider <a
href="#Log4j2ConfigurationFormat">migrating your configuration</a> to the Log4j
2 format.</p>
+<p>To distinguish between libraries that use Log4j 1 and those that
don’t, you can look for the presence of other logging APIs. If a library
<strong>directly</strong> depends on:</p>
</div>
-<div class="sect4">
-<h5 id="_appenders"><a class="anchor" href="#_appenders"></a>Appenders</h5>
<div class="ulist">
<ul>
<li>
-<p>JDBCAppender (cannot be mapped to Log4j 2’s JdbcAppender)</p>
+<p><a
href="https://central.sonatype.com/artifact/commons-logging/commons-logging"><code>commons-logging:commons-logging</code></a>,</p>
</li>
<li>
-<p>JMSAppender</p>
+<p><a
href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-api"><code>org.apache.logging.log4j:log4j-api</code></a>,</p>
</li>
<li>
-<p>SMTPAppender</p>
+<p><a
href="https://central.sonatype.com/artifact/org.slf4j/slf4j-api"><code>org.slf4j:slf4j-api</code></a>,</p>
</li>
<li>
-<p>SocketAppender (Requires the use of the SerializedLayout which is a
security risk)</p>
+<p><a
href="https://central.sonatype.com/artifact/org.jboss.logging/jboss-logging"><code>jboss-logging</code></a>,</p>
</li>
<li>
-<p>SocketHubAppender (Requires the use of the SerializedLayout which is a
security risk)</p>
+<p>other logging APIs,</p>
</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>it is fair to assume that it uses those libraries <strong>instead</strong>
of <strong>Log4j 1 API</strong>, even if it has a direct dependency on
<code>log4j:log4j</code> or <code>ch.qos.reload4j:reload4j</code>.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The following sections explain how to migrate from Log4j 1 to Log4j 2,
depending on the way Log4j 1 is used in your application:</p>
+</div>
+<div class="ulist">
+<ul>
<li>
-<p>TelnetAppender (Security risk)</p>
+<p>if your application or one of its dependencies is coded against Log4j 1
API, see <a href="#api-migration">Log4j 1 API migration</a>,</p>
+</li>
+<li>
+<p>if your application uses Log4j 1 only as logging backend, see <a
href="#backend-migration">Log4j 1 Backend migration</a>.</p>
</li>
</ul>
</div>
</div>
-<div class="sect4">
-<h5 id="_rewrite_policies"><a class="anchor"
href="#_rewrite_policies"></a>Rewrite Policies</h5>
+</div>
+<div class="sect1">
+<h2 id="api-migration"><a class="anchor" href="#api-migration"></a>Log4j 1 API
migration</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>To migrate an application that uses Log4j 1 API as logging API, the
recommended approach is to modify your code.
+See <a href="#api-code-migration">Migrate code from Log4j 1 API to Log4j 2
API</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>In the case one of your libraries uses Log4j 1 API or you can not modify
your logging code at the moment, a Log4j 1 to Log4j 2 bridge is available.
+See <a href="#api-use-bridge">Use Log4j 1 to Log4j 2 API bridge</a> for
details.</p>
+</div>
+<div class="sect2">
+<h3 id="api-code-migration"><a class="anchor"
href="#api-code-migration"></a>Migrate code from Log4j 1 API to Log4j 2 API</h3>
+<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>You can migrate your code from Log4j 1 to Log4j 2 automatically, by using
the
+<a
href="https://docs.openrewrite.org/recipes/java/logging/log4j/log4j1tolog4j2">Log4j1ToLog4j2</a>
OpenRewrite recipe.
+See
+<a
href="https://docs.openrewrite.org/recipes/java/logging/log4j/log4j1tolog4j2">OpenRewrite
site</a> for more details.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Except the change in the package name from <code>org.apache.log4j</code> to
<code>org.apache.logging.log4j</code>, most of the class and method names in
Log4j 2 API are inherited from Log4j 1 API.</p>
+</div>
+<div class="paragraph">
+<p>In order to migrate you code, you need to:</p>
+</div>
<div class="ulist">
<ul>
<li>
-<p>ReflectionRewritePolicy</p>
+<p>modify the imports and types used by your application, according to the
following table:</p>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 2. Migration of types from Log4j 1 to Log4j
2</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Migrate Log4j 1 type</th>
+<th class="tableblock halign-left valign-top">to Log4j type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/MDC.html">org.apache.log4j.MDC</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/ThreadContext.html">org.apache.logging.log4j.ThreadContext</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/NDC.html">org.apache.log4j.NDC</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/ThreadContext.html">org.apache.logging.log4j.ThreadContext</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Priority.html">org.apache.log4j.Priority</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/Level.html">org.apache.logging.log4j.Level</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Level.html">org.apache.log4j.Level</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/Level.html">org.apache.logging.log4j.Level</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Category.html">org.apache.log4j.Category</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/Logger.html">org.apache.logging.log4j.Logger</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Logger.html">org.apache.log4j.Logger</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/Logger.html">org.apache.logging.log4j.Logger</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/LogManager.html">org.apache.log4j.LogManager</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/LogManager.html">org.apache.logging.log4j.LogManager</a></code></p></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li>
+<p>Some Log4j 1 methods were renamed or moved to a different class.
+Therefore, you need to replace the following methods with their Log4j 2 API
equivalents:</p>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 3. Migration of methods from Log4j 1 to Log4j
2</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Migrate Log4j 1 method</th>
+<th class="tableblock halign-left valign-top">to Log4j method</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Logger.html#getLogger(java.lang.String)">Logger.getLogger()</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/LogManager.html#getLogger()">LogManager.getLogger()</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Logger.html#getRootLogger()">Logger.getRootLogger()</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/LogManager.html#getRootLogger()">LogManager.getRootLogger()</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Category.html#getEffectiveLevel()">Category.getEffectiveLevel()</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="../javadoc/log4j-api/org/apache/logging/log4j/Logger.html#getLevel()">Logger.getLevel()</a></code></p></td>
+</tr>
+</tbody>
+</table>
</li>
<li>
-<p>Custom rewrite policies since LoggingEvent is currently a no-op.</p>
+<p>Finally, some methods need specific conversion rules to be applied:</p>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 4. Special Log4j 1 method migration
rules</caption>
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Method</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
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Logger.html#getLogger(java.lang.String,%20org.apache.log4j.spi.LoggerFactory)"><code>Logger.getLogger(String,
LoggerFactory)</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Remove the
<code>LoggerFactory</code> parameter and use one of Log4j 2’s other
extension mechanisms.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/LogManager.html#shutdown()"><code>LogManager.shutdown()</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Since
Log4j 2.6, an equivalent
+<a
href="../javadoc/log4j-api/org/apache/logging/log4j/LogManager.html#shutdown()"><code>o.a.l.l.LogManager.shutdown()</code></a>
+method can be used.</p>
+<p class="tableblock">The utility of this method call depends upon the logging
backend used with Log4j API.</p>
+<p class="tableblock">The Log4j Core backend automatically adds a JVM shutdown
hook on start up to perform any cleanups, so the
<code>LogManager.shutdown()</code> call can be safely removed.
+Starting in Log4j 2.1, you can also specify a custom
+<a
href="../javadoc/log4j-core/org/apache/logging/log4j/core/util/ShutdownCallbackRegistry.html">ShutdownCallbackRegistry</a>.</p>
+<p class="tableblock">See
+<a href="systemproperties.html#log4j2.shutdownCallbackRegistry" class="xref
page">log4j2.shutdownCallbackRegistry</a>
+for more details.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Non Log4j
1 API methods</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Methods
outside of those listed in <a
href="#log4j-1-api-methods">[log4j-1-api-methods]</a>, such as
<code>Logger.setLevel()</code> need to be replaced with a method
+call specific to the logging backend used by the application.</p>
+<p class="tableblock">Some third-party integrators, such as Spring Boot,
provide utility methods that let you abstract the logging backend, e.g. the
+<a
href="https://docs.spring.io/spring-boot/api/java/org/springframework/boot/logging/LoggingSystem.html#setLogLevel(java.lang.String,org.springframework.boot.logging.LogLevel)"><code>LoggingSystem.setLogLevel()</code></a>
+Spring Boot method.</p></td>
+</tr>
+</tbody>
+</table>
</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>To prevent a performance penalty from string concatenation in disabled log
statements, Log4j 1 required the use of <code>is*Enabled()</code> guards:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-java hljs"
data-lang="java">if (LOGGER.isInfoEnabled()) {
+ LOGGER.info("Hello " + username + "!");
+}</code></pre>
+</div>
</div>
-<div class="sect4">
-<h5 id="_renderers"><a class="anchor" href="#_renderers"></a>Renderers</h5>
<div class="paragraph">
-<p>Log4j 2 currently ignores renderers.</p>
+<p>Since Log4j 2 API introduces
+<a href="api.html#best-practice-concat" class="xref page">parameterized
logging</a>
+these guards are no longer necessary and the same statement can be rewritten
as:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-java hljs"
data-lang="java">LOGGER.info("Hello {}!", username);</code></pre>
+</div>
</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect2">
+<h3 id="api-use-bridge"><a class="anchor" href="#api-use-bridge"></a><a
id="APICompatibility"></a>Use Log4j 1 to Log4j 2 API bridge</h3>
+<div class="paragraph">
+<p>If you can not modify your application’s code or one of your
dependencies is using
+<a href="#log4j-1-api-methods">Log4j 1 API</a>
+as logging API, you can delay the migration process by
+<a href="#log4j-1-2-api-installation">installing the Log4j 1 to Log4j 2
bridge</a>.</p>
+</div>
+<div class="paragraph">
+<p>Since forwarding Log4j 1 API calls to Log4j 2 API calls is the basic
functionality of the bridge, no further configuration is required from your
part.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="backend-migration"><a class="anchor"
href="#backend-migration"></a>Log4j 1 Backend migration</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>If your application uses Log4j 1 <strong>only</strong> as logging backend
bound to another logging API, such as Apache Commons Logging (JCL) or SLF4J,
you only need to:</p>
</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Configure all logging bridges to log to Log4j 2 API instead.
+This can be done by replacing the following dependencies on your
application’s runtime classpath:</p>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 5. Dependency migration from Log4j 1 to Log4j
2</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Replace Log4j 1 dependency</th>
+<th class="tableblock halign-left valign-top">with Log4j 2 dependency</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/log4j/log4j"><code>log4j:log4j</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-core"><code>org.apache.logging.log4j:log4j-core</code></a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/ch.qos.reload4j/reload4j"><code>ch.qos.reload4j:reload4j</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-core"><code>org.apache.logging.log4j:log4j-core</code></a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/commons-logging/commons-logging"><code>commons-logging:commons-logging</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">either
upgrade to version 1.3.0 (or later)</p>
+<p class="tableblock">or replace with
+<a
href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-slf4j2-impl"><code>org.apache.logging.log4j:log4j-jcl</code></a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/org.slf4j/slf4j-log4j12"><code>org.slf4j:slf4j-log4j12</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-slf4j2-impl"><code>org.apache.logging.log4j:log4j-slf4j2-impl</code></a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/org.slf4j/slf4j-reload4j"><code>org.slf4j:slf4j-reload4j</code></a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-slf4j2-impl"><code>org.apache.logging.log4j:log4j-slf4j2-impl</code></a></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>See <a href="installation.html" class="xref page">Installation</a> for more
details.</p>
</div>
+</li>
+<li>
+<p>Convert your configuration files from the Log4j 1 to the Log4j 2
configuration format.
+See <a href="#configuration-file-migration">Log4j 1 Configuration file
migration</a> below for more details.</p>
+</li>
+</ol>
</div>
<div class="sect2">
-<h3 id="Log4j12BridgeLimitations"><a class="anchor"
href="#Log4j12BridgeLimitations"></a>Limitations of the Log4j 1.x bridge</h3>
+<h3 id="migrate-custom-components"><a class="anchor"
href="#migrate-custom-components"></a>Migrate Log4j 1 custom components</h3>
<div class="paragraph">
-<p>Applications can migrate by just using the bridge without further code
changes, if they meet the following requirements:</p>
+<p>Since Log4j 1 offered a limited amount of appenders and layouts, over the
years users implemented many <strong>custom</strong> components that offered
additional features.
+If you are currently using a custom Log4j 1 component you should proceed as
follows:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
-<p>They must not access methods and classes internal to the Log4j 1.x
implementation such as <code>Appender</code>s, <code>LoggerRepository</code> or
<code>Category</code>'s <code>callAppenders</code> method.</p>
+<p>Log4j 2 provides many improvements to Log4j 1 components and many new
components.
+Check if the feature offered by your custom component is not already available
in Log4j 2.
+If you can not find the feature, ask on our <a href="/support.html">support
channels</a>.</p>
</li>
<li>
-<p>They must not programmatically configure Log4j.</p>
+<p>Since Log4j 2.17.2, the Log4j 1 to Log4j 2 bridge has a limited support for
using native Log4j 1 appenders and layouts.
+Native Log4j 1 components can only be configured using Log4j 1 configuration
files (see <a href="#ConfigurationCompatibility">Use Log4j 1 to Log4j 2
bridge</a>)
+and require the <a href="#log4j-1-2-api-installation">installation of the
Log4j 1 to Log4j 2 bridge</a>.</p>
+<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>Mixing Log4j 1 and Log4j 2 components will most certainly reduce the
performance of the logging system.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
</li>
<li>
-<p>They must not configure by calling the Log4j 1.x classes
<code>DOMConfigurator</code> or <code>PropertyConfigurator</code>.</p>
+<p>If your Log4j 1 native component is not supported by the Log4j 1 to Log4j 2
bridge, we suggest to rewrite it directly as Log4j 2 component.
+See <a href="extending.html" class="xref page">Extending Log4j</a> for more
details.</p>
</li>
</ol>
</div>
</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="configuration-file-migration"><a class="anchor"
href="#configuration-file-migration"></a>Log4j 1 Configuration file
migration</h2>
+<div class="sectionbody">
<div class="sect2">
-<h3 id="_when_to_stop_using_the_log4j_1_x_bridge"><a class="anchor"
href="#_when_to_stop_using_the_log4j_1_x_bridge"></a>When to stop using the
Log4j 1.x bridge</h3>
+<h3 id="Log4j2ConfigurationFormat"><a class="anchor"
href="#Log4j2ConfigurationFormat"></a>Convert configuration file from Log4j 1
to Log4j 2</h3>
<div class="paragraph">
-<p>Once you have migrated all of your own application and library code under
your control, you may not need the bridge anymore.
-Note that when you use a library/framework that can be configured to use
several logging frameworks, then you typically don’t need the
log4j-1.2-api bridge either, as you may be able to directly configure it to use
Log4j v2 instead v1.
-Some libraries/frameworks even auto-detect the presence of certain logging
framework implementations on their classpath, and automagically switch their
internal logging delegation accordingly;
-try simple removing the Log4j v1 dependency instead of replacing it with this
bridge, and test if logging from all of your dependencies still work.</p>
+<p>Although the Log4j 2 configuration syntax is different from that of Log4j
1, most, if not all, of the same functionality is available.</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 you own or can contribute open source to the library you depend on,
consider replacing its use of the Log4j v1 API with the v2 API.</p>
+<p>The <code>log4j-1.2-api</code> bridge contains a small utility that
converts <code>log4j.properties</code> files into <code>log4j2.xml</code> file.
+In order to use it you need to:</p>
</div>
-<div class="paragraph">
-<p>While the Log4j 1.x bridge supports logging configurations that use the
Log4j 1.x properties or XML format, migrating to the new 2.x format is not
difficult.
-The Log4j 2 website contains extensive documentation on the 2.x configuration
format.
-Examples for migrating logging configurations from the v1 format to the v2
format are below.</p>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Download the <code>log4j-api</code>, <code>log4j-core</code> and
<code>log4j-1.2-api</code> artifacts.
+To retrieve them all at once, see the <a href="../download.html" class="xref
page">Download</a> page.</p>
+</li>
+<li>
+<p>Set the <code>CLASSPATH</code> environment variable to contain the
artifacts mentioned above.</p>
+</li>
+<li>
+<p>Run</p>
+</li>
+</ol>
</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-shell hljs"
data-lang="shell">java org.apache.log4j.config.Log4j1ConfigurationConverter \
+ --in log4j.properties --out log4j2.xml</code></pre>
</div>
</div>
+</td>
+</tr>
+</table>
</div>
-<div class="sect1">
-<h2 id="Log4j2API"><a class="anchor" href="#Log4j2API"></a>Option 2: convert
your application to the Log4j 2 API (log4j-api)</h2>
-<div class="sectionbody">
+<div class="sect3">
+<h4 id="configuration-interpolation"><a class="anchor"
href="#configuration-interpolation"></a>Interpolation</h4>
<div class="paragraph">
-<p>The other migration option involves changing your application code to use
the Log4j 2 API.
-For the most part, converting from the Log4j 1.x API to Log4j 2 should be
fairly simple.
-Many of the log statements will require no modification.
-However, where necessary the following changes must be made.</p>
+<p>Log4j 1 only supports interpolation using system properties and properties
from the <code>log4j.properties</code> file using the <code>${foo}</code>
syntax.
+Log4j 2 extended this mechanism, by introducing pluggable <a
href="lookups.html" class="xref page">Lookups</a>.</p>
</div>
<div class="paragraph">
-<p><span class="image"><img src="../_images/whichjar-log4j-api.png" alt="Using
log4j 2 via the log4j 2.x API"></span></p>
+<p>In order to convert a Log4j 1 configuration file that uses interpolation to
a Log4j 2 configuration file, replace all occurrences of <code>${foo}</code>
with <code>${sys:foo}</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="configuration-appenders"><a class="anchor"
href="#configuration-appenders"></a>Appenders</h4>
+<div class="paragraph">
+<p>Log4j 2 contains an equivalent for most Log4j 1 appenders:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 6. Log4j 2 equivalents of Log4j 1
appenders</caption>
<colgroup>
-<col style="width: 50%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
-<th class="tableblock halign-left valign-top">Log4j 1.x</th>
-<th class="tableblock halign-left valign-top">Log4j 2.x</th>
+<th class="tableblock halign-left valign-top">Log4j 1 appender</th>
+<th class="tableblock halign-left valign-top">Log4j 2 equivalent</th>
+<th class="tableblock halign-left valign-top">Notes</th>
</tr>
</thead>
<tbody>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Package
name: <code>org.apache.log4j</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>org.apache.logging.log4j</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/AsyncAppender.html">org.apache.log4j.AsyncAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#AsyncAppender" class="xref page">Async</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/ConsoleAppender.html">org.apache.log4j.ConsoleAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#ConsoleAppender" class="xref
page">Console</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Calls to
<code>org.apache.log4j.Logger.getLogger()</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>org.apache.logging.log4j.LogManager.getLogger()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/DailyRollingFileAppender.html">org.apache.log4j.DailyRollingFileAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#RollingFileAppender" class="xref
page">RollingFile</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">See <a
href="#rolling-file-conversion">additional steps below</a>.</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Calls to
<code>org.apache.log4j.Logger.getRootLogger()</code> or
<code>org.apache.log4j.LogManager.getRootLogger()</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>org.apache.logging.log4j.LogManager.getRootLogger()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/FileAppender.html">org.apache.log4j.FileAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#FileAppender" class="xref page">File</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Calls to
<code>org.apache.log4j.Logger.getLogger</code> that accept a
<code>LoggerFactory</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Remove the
<code>org.apache.log4j.spi.LoggerFactory</code> and use one of Log4j 2’s
other extension mechanisms</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/RollingFileAppender.html">org.apache.log4j.RollingFileAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#RollingFileAppender" class="xref
page">RollingFile</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">See <a
href="#rolling-file-conversion">additional steps below</a>.</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Calls to
<code>org.apache.log4j.Logger.getEffectiveLevel()</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>org.apache.logging.log4j.Logger.getLevel()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/jdbc/JDBCAppender.html">org.apache.log4j.jdbc.JDBCAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#JDBCAppender" class="xref page">JDBC</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Calls to
<code>org.apache.log4j.LogManager.shutdown()</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Not needed
in version 2 because the Log4j Core now automatically adds a JVM shutdown hook
on start up to perform any Core clean ups.
-Starting in Log4j 2.1, you can specify a custom <a
href="../javadoc/log4j-core/org/apache/logging/log4j/core/util/ShutdownCallbackRegistry.html"><code>ShutdownCallbackRegistry</code></a>
to override the default JVM shutdown hook strategy.
-Starting in Log4j 2.6, you can use
<code>org.apache.logging.log4j.LogManager.shutdown()</code> to initiate
shutdown manually.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/net/JMSAppender.html">org.apache.log4j.net.JMSAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#jms-appender" class="xref page">JMS</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Calls to
<code>org.apache.log4j.Logger.setLevel()</code> or similar methods</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Not
supported at API level.
-Equivalent functionality is provided in the Log4j 2 implementation classes,
see <code>org.apache.logging.log4j.core.config.Configurator.setLevel()</code>,
but this may leave the application susceptible to changes in Log4j 2
internals.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/net/SocketAppender.html">org.apache.log4j.net.SocketAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#SocketAppender" class="xref
page">Socket</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">String
concatenation like <code>logger.info("hi " + userName)</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Parameterized messages like <code>logger.info("hi {}",
userName)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/net/SMTPAppender.html">org.apache.log4j.net.SMTPAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#SMTPAppender" class="xref page">SMTP</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html"><code>org.apache.log4j.MDC</code></a>
and <a
href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/NDC.html"><code>org.apache.log4j.NDC</code></a></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="thread-context.html" class="xref page">Thread Context</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/net/SyslogAppender.html">org.apache.log4j.net.SyslogAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#SyslogAppender" class="xref
page">Syslog</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Does not
support custom layouts.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/rewrite/RewriteAppender.html">org.apache.log4j.rewrite.RewriteAppender</a></code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html#RewriteAppender" class="xref
page">Rewrite</a></code></p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
+<div id="rolling-file-conversion" class="paragraph">
+<p>The rolling file appender in Log4j 2 is based on the
+<a
href="/log4j/extras/apidocs/org/apache/log4j/rolling/RollingFileAppender.html">org.apache.log4j.rolling.RollingFileAppender</a>
+from
+<a href="/log4j/extras/index.html">Apache™ Extras for Apache
Log4j®</a>
+and additional care must be taken to convert the Log4j 1 rolling appenders to
their Log4j 2 equivalent:</p>
</div>
-</div>
-<div class="sect1">
-<h2 id="Log4j2ConfigurationFormat"><a class="anchor"
href="#Log4j2ConfigurationFormat"></a>Migrating logging configurations to the
Log4j 2 format</h2>
-<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p>Log4j 2 by default uses a different strategy to determine the index of the
archived log files.
+Log4j 1 always rolls the current log file (e.g. <code>app.log</code>) to a log
file with index <code>1</code> (e.g. <code>app.log.1</code>).
+Log4j 2 on the other hand uses the first available index (e.g.
<code>app.log.42</code> if files <code>app.log.1</code> thru
<code>app.log.41</code> already exist).</p>
<div class="paragraph">
-<p>Although the Log4j 2 configuration syntax is different from that of Log4j
1.x, most, if not all, of the same functionality is available.</p>
+<p>To use the same algorithm to determine the index of the logged file in
Log4j 1 and Log4j 2, you need to configure the <code>fileIndex</code> attribute
of the
+<a href="appenders.html#DefaultRolloverStrategy" class="xref page">default
rollover strategy</a> to <code>min</code>.</p>
</div>
-<div class="sect2">
-<h3 id="_interpolation"><a class="anchor"
href="#_interpolation"></a>Interpolation</h3>
+<div class="listingblock">
+<div class="content">
+<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><DefaultRolloverStrategy fileIndex="min"/></code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>The two rolling file appenders available in Log4j 1, use an implicit file
pattern and triggering policy for the archived log files.
+If the current log file is called <code>app.log</code>, you need to configure
the Log4j 2 rolling file appender with the following <code>filePattern</code>
and triggering policy configuration options:</p>
+</li>
+</ul>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 7. Rolling file appender conversion</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Log4j 1 appender</th>
+<th class="tableblock halign-left valign-top">Log4j 2
<code>filePattern</code></th>
+<th class="tableblock halign-left valign-top">Log4j 2 triggering policy</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>org.apache.log4j.DailyRollingFileAppender</code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>app.%d{YYYY-MM-dd}</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html" class="xref
page">TimeBasedTriggeringPolicy</a></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>org.apache.log4j.RollingFileAppender</code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>app.%i</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code><a
href="appenders.html" class="xref
page">SizeBasedTriggeringPolicy</a></code></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect3">
+<h4 id="configuration-layouts"><a class="anchor"
href="#configuration-layouts"></a>Layouts</h4>
<div class="paragraph">
-<p>Note that system property interpolation via the <code>${foo}</code> syntax
has been extended to allow property lookups from many different sources.
-See the <a href="lookups.html" class="xref page">Lookups</a> documentation for
more details.
-For example, using a lookup for the system property named
<code>catalina.base</code>, in Log4j 1.x, the syntax would be
<code>${catalina.base}</code>.
-In Log4j 2, the syntax would be <code>${sys:catalina.base}</code>.</p>
+<p>Log4j 1 layouts can be converted to Log4j 2 layouts using the following
conversion rules:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/EnhancedPatternLayout.html">org.apache.log4j.EnhancedPatternLayout</a></dt>
+<dd>
+<p>can be converted to a
+<a href="layouts.html#PatternLayout" class="xref
page"><code>PatternLayout</code></a>
+that uses the same pattern,</p>
+</dd>
+<dt class="hdlist1"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/HTMLLayout.html">org.apache.log4j.HTMLLayout</a></dt>
+<dd>
+<p>can be converted to an
+<a href="layouts.html#HTMLLayout" class="xref
page"><code>HtmlLayout</code></a>.</p>
+</dd>
+<dt class="hdlist1"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/PatternLayout.html">org.apache.log4j.PatternLayout</a></dt>
+<dd>
+<p>can be converted to a
+<a href="layouts.html#PatternLayout" class="xref
page"><code>PatternLayout</code></a>
+that uses the same pattern,</p>
+</dd>
+<dt class="hdlist1"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/SimpleLayout.html">org.apache.log4j.SimpleLayout</a></dt>
+<dd>
+<p>can be converted to a
+<a href="layouts.html#PatternLayout" class="xref
page"><code>PatternLayout</code></a>
+that uses the <code>%p - %m%n</code> pattern,</p>
+</dd>
+<dt class="hdlist1"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/TTCCLayout.html">org.apache.log4j.TTCCLayout</a></dt>
+<dd>
+<p>can be converted to a
+<a href="layouts.html#PatternLayout" class="xref
page"><code>PatternLayout</code></a>
+that uses the <code>%r [%t] %p %c %notEmpty{%x }- %m%n</code> pattern,</p>
+</dd>
+<dt class="hdlist1"><a
href="https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/xml/XMLLayout.html">org.apache.log4j.xml.XMLLayout</a></dt>
+<dd>
+<p>does not have an exact equivalent in Log4j 2 Core.
+If backward compatibility is required, you can <a
href="#log4j-1-2-api-installation">install the Log4j 1 to Log4j 2 bridge</a>
and use the
+<a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-layout-Log4j1XmlLayout"
class="xref page"><code>Log4j1XmlLayout</code></a>
+plugin.</p>
+</dd>
+</dl>
+</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 formatting of the <code>%p</code> (when used with custom levels),
<code>%x</code> and <code>%X</code> pattern converters slightly changed between
Log4j 1 and Log4j 2.
+If an exact backward compatibility is required, you need to <a
href="#log4j-1-2-api-installation">install the Log4j 1 to Log4j 2 bridge</a>
and use the following extended patterns:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Log4j 1 pattern</th>
+<th class="tableblock halign-left valign-top">Log4j 1 to Log4j 2 bridge
pattern</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code><code>%p</code></code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code><code>%v1Level</code></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code><code>%x</code></code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code><code>%ndc</code></code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code><code>%X</code></code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code><code>%properties</code></code></p></td>
+</tr>
+</tbody>
+</table>
+</td>
+</tr>
+</table>
+</div>
</div>
</div>
<div class="sect2">
-<h3 id="_layouts"><a class="anchor" href="#_layouts"></a>Layouts</h3>
+<h3 id="ConfigurationCompatibility"><a class="anchor"
href="#ConfigurationCompatibility"></a>Use Log4j 1 to Log4j 2 bridge</h3>
<div class="paragraph">
-<p>Log4j 1.x has a XMLLayout which is different from the XmlLayout in Log4j 2.
-The log4j-1.2-api module contains a <code>Log4j1XmlLayout</code> that produces
output in the Log4j 1.x format.</p>
+<p>If you can not convert your configuration files from Log4j 1 to Log4j 2,
the Log4j 1 to Log4j 2 bridge can convert your configuration files at runtime.
+In order to use this feature you need to <a
href="#log4j-1-2-api-installation">Install the Log4j 1 to Log4j 2 bridge</a>
and set one of the following configuration properties:</p>
</div>
+<div class="sect3">
+<h4 id="log4j1.compatibility"><a class="anchor"
href="#log4j1.compatibility"></a><code>log4j1.compatibility</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">Env.
variable</p></th>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">LOG4J_COMPATIBILITY</p></td>
+</tr>
+<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>false</code></p></td>
+</tr>
+</tbody>
+</table>
<div class="paragraph">
-<p>The Log4j 1.x <code>SimpleLayout</code> can be emulated with PatternLayout
"%level - %m%n".</p>
+<p>If set to <code>true</code>, Log4j 2 will scan the classpath to find Log4j
1 configuration files in the following standard locations:</p>
</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>log4j-test.properties</code>,</p>
+</li>
+<li>
+<p><code>log4j-test.xml</code>,</p>
+</li>
+<li>
+<p><code>log4j.properties</code>,</p>
+</li>
+<li>
+<p><code>log4j.xml</code>.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="log4j.configuration"><a class="anchor"
href="#log4j.configuration"></a><code>log4j.configuration</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">Env.
variable</p></th>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">LOG4J_CONFIGURATION_FILE</p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top"><p
class="tableblock">Type</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a
href="https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html">Path</a>
+or
+<a
href="https://docs.oracle.com/javase/8/docs/api/java/net/URI.html">URI</a></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>null</code></p></td>
+</tr>
+</tbody>
+</table>
<div class="paragraph">
-<p>The Log4j 1.x <code>TTCCLayout</code> can be emulated with PatternLayout
"%r [%t] %p %c %notEmpty{%ndc }- %m%n".</p>
+<p>If not <code>null</code>, Log4j 2 will try to retrieve a <strong>Log4j
1</strong> configuration file from the given location.
+The configuration file name must end in <code>.properties</code> (Log4j 1
properties format) or <code>.xml</code> (Log4j 1 XML format).
+See also
+<a href="#configuration-limitations">limitations of Log4j 1 configuration
compatibility layer</a>.</p>
+</div>
</div>
+<div class="sect3">
+<h4 id="limitations-of-the-log4j-1-x-bridge"><a class="anchor"
href="#limitations-of-the-log4j-1-x-bridge"></a><a
id="Log4j1.2BridgeLimitations"></a>Limitations of runtime configuration
conversion</h4>
<div class="paragraph">
-<p>Both <code>PatternLayout</code> and <code>EnhancedPatternLayout</code> in
Log4j 1.x can be replaced with <code>PatternLayout</code> in Log4j 2.
-The log4j-1.2-api module contains two pattern conversions "%ndc" and
"%properties" which can be used to emulate "%x" and "%X" in Log4j 1.x
PatternLayout ("%x" and %X" in Log4j 2 have a slightly different format).</p>
+<p>The support for Log4j 1 configuration files uses Log4j 2 Core plugin system
and can be extended by implementing a plugin of type
+<code>org.apache.log4j.builders.Builder</code>.</p>
</div>
<div class="paragraph">
-<p>Below are some example configurations for Log4j 1.x and their counterparts
in Log4j 2.</p>
+<p>The Log4j 1 to Log4j 2 bridge supports out-of-the-box the following
+<a href="https://logging.apache.org/log4j/1.x/index.html">Log4j 1</a>
+and
+<a href="/log4j/extras/index/html">Apache Extras for Log4j 1</a>
+components:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">Appenders</dt>
+<dd>
+<div class="ulist">
+<ul>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-AsyncAppenderBuilder"
class="xref page"><code>org.apache.log4j.AsyncAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-ConsoleAppenderBuilder"
class="xref page"><code>org.apache.log4j.ConsoleAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-DailyRollingFileAppenderBuilder"
class="xref
page"><code>org.apache.log4j.DailyRollingFileAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-FileAppenderBuilder"
class="xref page"><code>org.apache.log4j.FileAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-RollingFileAppenderBuilder"
class="xref page"><code>org.apache.log4j.RollingFileAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-SocketAppenderBuilder"
class="xref page"><code>org.apache.log4j.net.SocketAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-SyslogAppenderBuilder"
class="xref page"><code>org.apache.log4j.net.SyslogAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-RewriteAppenderBuilder"
class="xref
page"><code>org.apache.log4j.rewrite.RewriteAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-EnhancedRollingFileAppenderBuilder"
class="xref
page"><code>org.apache.log4j.rolling.RollingFileAppender</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-appender-NullAppenderBuilder"
class="xref page"><code>org.apache.log4j.varia.NullAppender</code></a>.</p>
+</li>
+</ul>
</div>
+</dd>
+<dt class="hdlist1">Filters</dt>
+<dd>
+<div class="ulist">
+<ul>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-filter-DenyAllFilterBuilder"
class="xref page"><code>org.apache.log4j.varia.DenyAllFilter</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-filter-LevelMatchFilterBuilder"
class="xref page"><code>org.apache.log4j.varia.LevelMatchFilter</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-filter-LevelRangeFilterBuilder"
class="xref page"><code>org.apache.log4j.varia.LevelRangeFilter</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-filter-StringMatchFilterBuilder"
class="xref
page"><code>org.apache.log4j.varia.StringMatchFilter</code></a>.</p>
+</li>
+</ul>
+</div>
+</dd>
+<dt class="hdlist1">Layouts</dt>
+<dd>
+<div class="ulist">
+<ul>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-layout-HtmlLayoutBuilder"
class="xref page"><code>org.apache.log4j.HTMLLayout</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-layout-PatternLayoutBuilder"
class="xref page"><code>org.apache.log4j.PatternLayout</code></a> and
<code>org.apache.log4j.EnhancedPatternLayout</code>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-layout-SimpleLayoutBuilder"
class="xref page"><code>org.apache.log4j.SimpleLayout</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-layout-TTCCLayoutBuilder"
class="xref page"><code>org.apache.log4j.TTCCLayout</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-layout-XmlLayoutBuilder"
class="xref page"><code>org.apache.log4j.xml.XMLLayout</code></a>.</p>
+</li>
+</ul>
+</div>
+</dd>
+<dt class="hdlist1">Triggering policies</dt>
+<dd>
+<div class="ulist">
+<ul>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-rolling-CompositeTriggeringPolicyBuilder"
class="xref
page"><code>org.apache.log4j.rolling.CompositeTriggeringPolicy</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-rolling-SizeBasedTriggeringPolicyBuilder"
class="xref
page"><code>org.apache.log4j.rolling.SizeBasedTriggeringPolicy</code></a>,</p>
+</li>
+<li>
+<p><a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-rolling-TimeBasedRollingPolicyBuilder"
class="xref
page"><code>org.apache.log4j.rolling.TimeBasedRollingPolicy</code></a>.</p>
+</li>
+</ul>
+</div>
+</dd>
+</dl>
</div>
-<div class="sect2">
-<h3 id="_sample_1_migrating_a_simple_console_appender_configuration"><a
class="anchor"
href="#_sample_1_migrating_a_simple_console_appender_configuration"></a>Sample
1 - Migrating a simple Console Appender configuration</h3>
<div class="paragraph">
-<p>Log4j 1.x XML configuration</p>
+<p>See
+<a
href="../plugin-reference.html#org-apache-logging-log4j_log4j-1-2-api_org-apache-log4j-builders-Builder"
class="xref page">the plugin reference</a> for a complete list.</p>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J
1.2//EN" "log4j.dtd">
-<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) -
%m%n"/>
- </layout>
- </appender>
- <category name="org.apache.log4j.xml">
- <priority value="info" />
- </category>
- <Root>
- <priority value ="debug" />
- <appender-ref ref="STDOUT" />
- </Root>
-</log4j:configuration></code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Log4j 2 XML configuration</p>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><Configuration>
- <Appenders>
- <Console name="STDOUT" target="SYSTEM_OUT">
- <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Logger name="org.apache.log4j.xml" level="info"/>
- <Root level="debug">
- <AppenderRef ref="STDOUT"/>
- </Root>
- </Loggers>
-</Configuration></code></pre>
</div>
</div>
</div>
-<div class="sect2">
-<h3
id="_sample_2_migrating_a_simple_file_appender_xmllayout_and_simplelayout_configuration"><a
class="anchor"
href="#_sample_2_migrating_a_simple_file_appender_xmllayout_and_simplelayout_configuration"></a>Sample
2 - Migrating a simple File Appender, XMLLayout and SimpleLayout
configuration</h3>
+<div class="sect1">
+<h2 id="option-1-use-the-log4j-1-x-bridge-log4j-1-2-api"><a class="anchor"
href="#option-1-use-the-log4j-1-x-bridge-log4j-1-2-api"></a><a
id="Log4j1.2Bridge"></a>Log4j 1 to Log4j 2 bridge</h2>
+<div class="sectionbody">
<div class="paragraph">
-<p>Log4j 1.x XML configuration</p>
+<p>In order to help users with the migration process, a Log4j 1 to Log4j 2
bridge is available.
+The bridge can fulfill three separate functions:</p>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J
1.2//EN" "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="A1" class="org.apache.log4j.FileAppender">
- <param name="File" value="A1.log" />
- <param name="Append" value="false" />
- <layout class="org.apache.log4j.xml.XMLLayout" />
- </appender>
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.SimpleLayout" />
- </appender>
- <category name="org.apache.log4j.xml">
- <priority value="debug" />
- <appender-ref ref="A1" />
- </category>
- <root>
- <priority value ="debug" />
- <appender-ref ref="STDOUT" />
- </Root>
-</log4j:configuration></code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Log4j 2 XML configuration</p>
+<div class="ulist">
+<ul>
+<li>
+<p>it forwards all <a href="#log4j-1-api-methods">Log4j 1 API</a> method calls
to the corresponding Log4j 2 API calls,</p>
+</li>
+<li>
+<p>since version 2.17.2 is supports the usage of some components written for
Log4j 1 inside Log4j 2 Core,</p>
+</li>
+<li>
+<p>it provides a limited support for programmatic configuration of Log4j 2
Core, using Log4j 1 method calls,</p>
+</li>
+<li>
+<p>it provides a limited support for Log4j 1 configuration file formats.</p>
+</li>
+</ul>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><Configuration>
- <Appenders>
- <File name="A1" fileName="A1.log" append="false">
- <Log4j1XmlLayout />
- </File>
- <Console name="STDOUT" target="SYSTEM_OUT">
- <PatternLayout pattern="%level - %m%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Logger name="org.apache.log4j.xml" level="debug">
- <AppenderRef ref="A1"/>
- </Logger>
- <Root level="debug">
- <AppenderRef ref="STDOUT"/>
- </Root>
- </Loggers>
-</Configuration></code></pre>
+<div class="sect2">
+<h3 id="log4j-1-2-api-installation"><a class="anchor"
href="#log4j-1-2-api-installation"></a>Installation</h3>
+<div class="paragraph">
+<p>Since the Log4j 1 to Log4j 2 Bridge <strong>replaces</strong> Log4j 1
classes, it is incompatible with the following artifacts:</p>
</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a
href="https://central.sonatype.com/artifact/log4j/log4j"><code>log4j:log4j</code></a></p>
+</li>
+<li>
+<p><a
href="https://central.sonatype.com/artifact/ch.qos.reload4j/reload4j"><code>ch.qos.reload4j:reload4j</code></a>,</p>
+</li>
+<li>
+<p><a
href="https://central.sonatype.com/artifact/org.slf4j/log4j-over-slf4j"><code>org.slf4j:log4j-over-slf4j</code></a></p>
+</li>
+</ul>
</div>
+<div class="paragraph">
+<p>Before installing the bridge, you need to make sure that none of the
artifacts above are present in your runtime classpath.</p>
</div>
-<div class="sect2">
-<h3 id="_sample_3_migrating_a_socketappender_configuration"><a class="anchor"
href="#_sample_3_migrating_a_socketappender_configuration"></a>Sample 3 -
Migrating a SocketAppender configuration</h3>
<div class="paragraph">
-<p>Log4j 1.x XML configuration.
-This example from Log4j 1.x is misleading.
-The SocketAppender does not actually use a Layout.
-Configuring one will have no effect.</p>
+<p>To install the bridge, add the following dependency to your application:</p>
</div>
-<div class="listingblock">
+<div id="_tabs_1" class="openblock tabs is-sync is-loading">
<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J
1.2//EN" "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="A1" class="org.apache.log4j.net.SocketAppender">
- <param name="RemoteHost" value="localhost"/>
- <param name="Port" value="5000"/>
- <param name="LocationInfo" value="true"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
- </layout>
- </appender>
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) -
%m%n"/>
- </layout>
- </appender>
- <category name="org.apache.log4j.xml">
- <priority value="debug"/>
- <appender-ref ref="A1"/>
- </category>
- <root>
- <priority value="debug"/>
- <appender-ref ref="STDOUT"/>
- </Root>
-</log4j:configuration></code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Log4j 2 XML configuration</p>
+<div class="ulist tablist">
+<ul>
+<li id="_tabs_1_maven" class="tab">
+<p>Maven</p>
+</li>
+<li id="_tabs_1_gradle" class="tab">
+<p>Gradle</p>
+</li>
+</ul>
</div>
+<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"><Configuration>
- <Appenders>
- <Socket name="A1" host="localHost" port="5000">
- <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
- </Socket>
- <Console name="STDOUT" target="SYSTEM_OUT">
- <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Logger name="org.apache.log4j.xml" level="debug">
- <AppenderRef ref="A1"/>
- </Logger>
- <Root level="debug">
- <AppenderRef ref="STDOUT"/>
- </Root>
- </Loggers>
-</Configuration></code></pre>
-</div>
+<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-1.2-api</artifactId>
+ <version>2.23.1</version>
+ <scope>runtime</scope>
+</dependency></code></pre>
</div>
</div>
-<div class="sect2">
-<h3 id="_sample_4_migrating_an_asyncappender_and_ttcclayout_configuration"><a
class="anchor"
href="#_sample_4_migrating_an_asyncappender_and_ttcclayout_configuration"></a>Sample
4 - Migrating an AsyncAppender and TTCCLayout configuration</h3>
-<div class="paragraph">
-<p>Log4j 1.x XML configuration using the AsyncAppender.</p>
</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-xml hljs"
data-lang="xml"><!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J
1.2//EN" "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
configDebug="true">
- <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
- <appender-ref ref="TEMP"/>
- </appender>
- <appender name="TEMP" class="org.apache.log4j.FileAppender">
- <param name="File" value="temp"/>
- <layout class="org.apache.log4j.TTCCLayout">
- <param name="ThreadPrinting" value="true"/>
- <param name="CategoryPrefixing" value="true"/>
- <param name="ContextPrinting" value="true"/>
- </layout>
- </appender>
- <root>
- <priority value="debug"/>
- <appender-ref ref="ASYNC"/>
- </Root>
-</log4j:configuration></code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Log4j 2 XML configuration.</p>
+<pre class="highlightjs highlight"><code class="language-groovy hljs"
data-lang="groovy">runtimeOnly
'org.apache.logging.log4j:log4j-1.2-api:2.23.1'</code></pre>
+</div>
+</div>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><Configuration status="debug">
- <Appenders>
- <File name="TEMP" fileName="temp">
- <PatternLayout pattern="%r [%t] %p %c %notEmpty{%ndc }- %m%n"/>
- </File>
- <Async name="ASYNC">
- <AppenderRef ref="TEMP"/>
- </Async>
- </Appenders>
- <Loggers>
- <Root level="debug">
- <AppenderRef ref="ASYNC"/>
- </Root>
- </Loggers>
-</Configuration></code></pre>
</div>
</div>
</div>
<div class="sect2">
-<h3
id="_sample_5_migrating_a_configuration_using_asyncappender_with_console_and_file"><a
class="anchor"
href="#_sample_5_migrating_a_configuration_using_asyncappender_with_console_and_file"></a>Sample
5 - Migrating a configuration using AsyncAppender with Console and File</h3>
+<h3 id="when-to-stop-using-the-log4j-1-x-bridge"><a class="anchor"
href="#when-to-stop-using-the-log4j-1-x-bridge"></a>When to stop using the
Log4j 1 to Log4j 2 bridge</h3>
<div class="paragraph">
-<p>Log4j 1.x XML configuration using the AsyncAppender.</p>
+<p>The Log4j 1 to Log4j 2 bridge is not conceived as a long term solution.
+Once:</p>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J
1.2//EN" "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
configDebug="true">
- <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
- <appender-ref ref="TEMP"/>
- <appender-ref ref="CONSOLE"/>
- </appender>
- <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) -
%m%n"/>
- </layout>
- </appender>
- <appender name="TEMP" class="org.apache.log4j.FileAppender">
- <param name="File" value="temp"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) -
%m%n"/>
- </layout>
- </appender>
- <root>
- <priority value="debug"/>
- <appender-ref ref="ASYNC"/>
- </Root>
-</log4j:configuration></code></pre>
-</div>
-</div>
-<div class="paragraph">
-<p>Log4j 2 XML configuration.
-Note that the Async Appender should be configured after the appenders it
references.
-This will allow it to shut down properly.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>you have migrated your logging code to use Log4j 2 API (see <a
href="#api-code-migration">Migrate code from Log4j 1 API to Log4j 2
API</a>),</p>
+</li>
+<li>
+<p>you have migrated your configuration files to use the Log4j 2 configuration
format (see <a href="#configuration-file-migration">Log4j 1 Configuration file
migration</a>),</p>
+</li>
+<li>
+<p>upgraded all the dependencies that use Log4j 1 directly to newer versions
that use a proper logging API (JCL, Log4j 2 API, JBoss logging, SLF4J),</p>
+</li>
+</ul>
</div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlightjs highlight"><code class="language-xml hljs"
data-lang="xml"><Configuration status="debug">
- <Appenders>
- <Console name="CONSOLE" target="SYSTEM_OUT">
- <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
- </Console>
- <File name="TEMP" fileName="temp">
- <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
- </File>
- <Async name="ASYNC">
- <AppenderRef ref="TEMP"/>
- <AppenderRef ref="CONSOLE"/>
- </Async>
- </Appenders>
- <Loggers>
- <Root level="debug">
- <AppenderRef ref="ASYNC"/>
- </Root>
- </Loggers>
-</Configuration></code></pre>
+<div class="paragraph">
+<p>the bridge is no longer necessary and should be removed.</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 separation of logging APIs from logging implementations started in
2002, with the release of
+<a href="https://commons.apache.org/proper/commons-logging/">Apache Commons
Logging</a> (formerly known as Jakarta Commons Logging).</p>
+</div>
+<div class="paragraph">
+<p>We are unaware of any <strong>maintained</strong> library that is currently
using Log4j 1.
+However, if this is your case, please contact the library maintainer and ask
them to migrate to one of the available logging APIs.</p>
+</div>
+</td>
+</tr>
+</table>
</div>
</div>
</div>
diff --git a/plugin-reference.html b/plugin-reference.html
index 429110046f..5545ff4ffc 100644
--- a/plugin-reference.html
+++ b/plugin-reference.html
@@ -1444,7 +1444,7 @@ Originally developed by Ceki Glc and Anders
Kristensen.</p>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>header</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>boolean?</code></p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><div class="content"></div></td>
</tr>
diff --git a/sitemap.xml b/sitemap.xml
index 02ca3bdc99..0996cca706 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -2,242 +2,238 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://logging.apache.org/log4j/2.x/development.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/download.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/faq.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/hibernate.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/index.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/javadoc.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
-</url>
-<url>
-<loc>https://logging.apache.org/log4j/2.x/log4j-1.2-api.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-appserver.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-cassandra.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-couchdb.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-docker.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-flume-ng.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-iostreams.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-jakarta-web.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-spring-boot.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-spring-cloud-config-client.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-spring-cloud-config.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-taglib.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-web.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/api.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/architecture.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/async.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/cloud.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/compatibility.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/configuration.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/customconfig.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/customloglevels.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/eventlogging.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/extending.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/filters.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/flowtracing.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/garbagefree.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/getting-started.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/index.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/installation.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/jmx.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/json-template-layout.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/layouts.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/logbuilder.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/logsep.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/lookups.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/markers.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/messages.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/migration.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/pattern-layout.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/performance.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/plugins.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/resource-logger.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/scoped-context.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/scripts.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/simple-logger.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/status-logger.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/systemproperties.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/thread-context.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/webapp.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/migrate-from-logback.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/migrate-from-slf4j.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/plugin-reference.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/release-notes.html</loc>
-<lastmod>2024-06-12T13:29:58.032Z</lastmod>
+<lastmod>2024-06-12T19:20:46.196Z</lastmod>
</url>
</urlset>