You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gi...@apache.org on 2025/03/21 08:28:01 UTC
(logging-log4j2) branch 2.x-site-pro-out updated: Add website content generated from `d42d28ff963a83b59550e768bf9b168107f513e3`
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch 2.x-site-pro-out
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/2.x-site-pro-out by this push:
new ec7a623421 Add website content generated from `d42d28ff963a83b59550e768bf9b168107f513e3`
ec7a623421 is described below
commit ec7a623421f410aa087eb22599f749dba69d2afb
Author: ASF Logging Services RM <pr...@logging.apache.org>
AuthorDate: Fri Mar 21 08:27:56 2025 +0000
Add website content generated from `d42d28ff963a83b59550e768bf9b168107f513e3`
---
...ag-01168003b98f120d2f0736e5172de8e1218f189e.svg | 1 -
...ag-232cdf1d44336897239fa03f6521cc730f38f32d.svg | 1 -
...ag-3f8a04c810525cc09a5e7564abf3aa14ed1f7c81.svg | 1 -
...ag-581e854ee8ecdb00104bac5affda10a653d8f76d.svg | 1 -
...ag-58c484caf8cd616db4f1c7ed31b51c123b5859d4.svg | 1 -
...ag-5ffe377615be9b0375b26533bbf7b10507dc946b.svg | 1 -
...ag-63d449f3bcd24cfa522a41f6e2f545416de30322.svg | 1 -
...ag-73365a4d8197b5441a98fd1d661b07760da178be.svg | 1 -
...ag-77a13b00749af95e3ed0eefd605a73f25d70973c.svg | 1 -
...ag-892fd9dbd9ea6bece55c1d4078ae1de2edd5c689.svg | 1 -
...ag-fd71b342bbb89cd55a1ddb592976b9ac26b6348e.svg | 1 -
manual/architecture.html | 520 +++++++++++++++++++--
manual/lookups.html | 41 +-
manual/systemproperties.html | 31 ++
manual/thread-context.html | 33 +-
migrate-from-slf4j.html | 58 ++-
plugin-reference.html | 14 +-
sitemap.xml | 116 ++---
18 files changed, 705 insertions(+), 119 deletions(-)
diff --git a/_images/diag-01168003b98f120d2f0736e5172de8e1218f189e.svg b/_images/diag-01168003b98f120d2f0736e5172de8e1218f189e.svg
deleted file mode 100644
index ee9dca5100..0000000000
--- a/_images/diag-01168003b98f120d2f0736e5172de8e1218f189e.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="278px" preserveAspectRatio="none" style="width:781px;height:278px;background:#FFFFFF;" version="1.1" viewBox="0 0 781 278" width="781px" zoomAndPan="magnify"><defs/><g><!--cluster LoggerContext--><g id="cluster_LoggerContext"><path d="M8.5,6 L127.5,6 A3.75,3.75 0 0 1 130,8.5 L137,28.2969 L621.5,28.2969 A2.5,2.5 0 0 [...]
\ No newline at end of file
diff --git a/_images/diag-232cdf1d44336897239fa03f6521cc730f38f32d.svg b/_images/diag-232cdf1d44336897239fa03f6521cc730f38f32d.svg
deleted file mode 100644
index 253990d3c1..0000000000
--- a/_images/diag-232cdf1d44336897239fa03f6521cc730f38f32d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="218px" preserveAspectRatio="none" style="width:197px;height:218px;background:#FFFFFF;" version="1.1" viewBox="0 0 197 218" width="197px" zoomAndPan="magnify"><defs/><g><!--class Appender--><g id="elem_Appender"><rect codeLine="1" fill="#F1F1F1" height="80.5938" id="Appender" rx="2.5" ry="2.5" style="stroke:#181818; [...]
\ No newline at end of file
diff --git a/_images/diag-3f8a04c810525cc09a5e7564abf3aa14ed1f7c81.svg b/_images/diag-3f8a04c810525cc09a5e7564abf3aa14ed1f7c81.svg
deleted file mode 100644
index 19bc3dd128..0000000000
--- a/_images/diag-3f8a04c810525cc09a5e7564abf3aa14ed1f7c81.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1022px" preserveAspectRatio="none" style="width:1327px;height:1022px;background:#FFFFFF;" version="1.1" viewBox="0 0 1327 1022" width="1327px" zoomAndPan="magnify"><defs/><g><!--cluster c--><g id="cluster_c"><path d="M8.5,150.89 L116.5,150.89 A3.75,3.75 0 0 1 119,153.39 L126,173.1869 L806.5,173.1869 A2.5,2.5 0 0 1 [...]
\ No newline at end of file
diff --git a/_images/diag-581e854ee8ecdb00104bac5affda10a653d8f76d.svg b/_images/diag-581e854ee8ecdb00104bac5affda10a653d8f76d.svg
deleted file mode 100644
index 13bad114d3..0000000000
--- a/_images/diag-581e854ee8ecdb00104bac5affda10a653d8f76d.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="614px" preserveAspectRatio="none" style="width:551px;height:614px;background:#FFFFFF;" version="1.1" viewBox="0 0 551 614" width="551px" zoomAndPan="magnify"><defs/><g><!--class Configuration--><g id="elem_Configuration"><rect codeLine="1" fill="#F1F1F1" height="129.4844" id="Configuration" rx="2.5" ry="2.5" style= [...]
\ No newline at end of file
diff --git a/_images/diag-58c484caf8cd616db4f1c7ed31b51c123b5859d4.svg b/_images/diag-58c484caf8cd616db4f1c7ed31b51c123b5859d4.svg
deleted file mode 100644
index cf669cbdd8..0000000000
--- a/_images/diag-58c484caf8cd616db4f1c7ed31b51c123b5859d4.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="134px" preserveAspectRatio="none" style="width:615px;height:134px;background:#FFFFFF;" version="1.1" viewBox="0 0 615 134" width="615px" zoomAndPan="magnify"><defs/><g><rect fill="#F1F1F1" height="36.2969" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:1.5;" width="48" x="10" y="48.1484"/><text fill="#00000 [...]
\ No newline at end of file
diff --git a/_images/diag-5ffe377615be9b0375b26533bbf7b10507dc946b.svg b/_images/diag-5ffe377615be9b0375b26533bbf7b10507dc946b.svg
deleted file mode 100644
index ea30fa85b9..0000000000
--- a/_images/diag-5ffe377615be9b0375b26533bbf7b10507dc946b.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="489px" preserveAspectRatio="none" style="width:917px;height:489px;background:#FFFFFF;" version="1.1" viewBox="0 0 917 489" width="917px" zoomAndPan="magnify"><defs/><g><!--class LoggerContext--><g id="elem_LoggerContext"><rect codeLine="1" fill="#F1F1F1" height="96.8906" id="LoggerContext" rx="2.5" ry="2.5" style=" [...]
\ No newline at end of file
diff --git a/_images/diag-63d449f3bcd24cfa522a41f6e2f545416de30322.svg b/_images/diag-63d449f3bcd24cfa522a41f6e2f545416de30322.svg
deleted file mode 100644
index 407cf3e990..0000000000
--- a/_images/diag-63d449f3bcd24cfa522a41f6e2f545416de30322.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="754px" preserveAspectRatio="none" style="width:549px;height:754px;background:#FFFFFF;" version="1.1" viewBox="0 0 549 754" width="549px" zoomAndPan="magnify"><defs/><g><!--class Configuration--><g id="elem_Configuration"><rect codeLine="1" fill="#F1F1F1" height="129.4844" id="Configuration" rx="2.5" ry="2.5" style= [...]
\ No newline at end of file
diff --git a/_images/diag-73365a4d8197b5441a98fd1d661b07760da178be.svg b/_images/diag-73365a4d8197b5441a98fd1d661b07760da178be.svg
deleted file mode 100644
index c9b6b7b12e..0000000000
--- a/_images/diag-73365a4d8197b5441a98fd1d661b07760da178be.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="507px" preserveAspectRatio="none" style="width:649px;height:507px;background:#FFFFFF;" version="1.1" viewBox="0 0 649 507" width="649px" zoomAndPan="magnify"><defs/><g><!--class Configuration--><g id="elem_Configuration"><rect codeLine="1" fill="#F1F1F1" height="129.4844" id="Configuration" rx="2.5" ry="2.5" style= [...]
\ No newline at end of file
diff --git a/_images/diag-77a13b00749af95e3ed0eefd605a73f25d70973c.svg b/_images/diag-77a13b00749af95e3ed0eefd605a73f25d70973c.svg
deleted file mode 100644
index d9566cac31..0000000000
--- a/_images/diag-77a13b00749af95e3ed0eefd605a73f25d70973c.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="442px" preserveAspectRatio="none" style="width:298px;height:442px;background:#FFFFFF;" version="1.1" viewBox="0 0 298 442" width="298px" zoomAndPan="magnify"><defs/><g><!--class LoggerContext--><g id="elem_LoggerContext"><rect codeLine="1" fill="#F1F1F1" height="96.8906" id="LoggerContext" rx="2.5" ry="2.5" style=" [...]
\ No newline at end of file
diff --git a/_images/diag-892fd9dbd9ea6bece55c1d4078ae1de2edd5c689.svg b/_images/diag-892fd9dbd9ea6bece55c1d4078ae1de2edd5c689.svg
deleted file mode 100644
index cbe9bce8db..0000000000
--- a/_images/diag-892fd9dbd9ea6bece55c1d4078ae1de2edd5c689.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="134px" preserveAspectRatio="none" style="width:347px;height:134px;background:#FFFFFF;" version="1.1" viewBox="0 0 347 134" width="347px" zoomAndPan="magnify"><defs/><g><rect fill="#F1F1F1" height="36.2969" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:1.5;" width="48" x="10" y="48.1484"/><text fill="#00000 [...]
\ No newline at end of file
diff --git a/_images/diag-fd71b342bbb89cd55a1ddb592976b9ac26b6348e.svg b/_images/diag-fd71b342bbb89cd55a1ddb592976b9ac26b6348e.svg
deleted file mode 100644
index dcd88d33a2..0000000000
--- a/_images/diag-fd71b342bbb89cd55a1ddb592976b9ac26b6348e.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="300px" preserveAspectRatio="none" style="width:649px;height:300px;background:#FFFFFF;" version="1.1" viewBox="0 0 649 300" width="649px" zoomAndPan="magnify"><defs/><g><!--class LoggerContext--><g id="elem_LoggerContext"><rect codeLine="1" fill="#F1F1F1" height="96.8906" id="LoggerContext" rx="2.5" ry="2.5" style=" [...]
\ No newline at end of file
diff --git a/manual/architecture.html b/manual/architecture.html
index fedd8d5ee6..ec5e40a52b 100644
--- a/manual/architecture.html
+++ b/manual/architecture.html
@@ -356,11 +356,146 @@
In this section we will try to explain major pillars its architecture stands on.
An overview these major classes can be depicted as follows:</p>
</div>
-<div id="architecture-diagram" class="imageblock kroki">
+<div id="architecture-diagram" class="literalblock kroki-error">
+<div class="title">An overview of major classes and their relation</div>
<div class="content">
-<img src="../_images/diag-3f8a04c810525cc09a5e7564abf3aa14ed1f7c81.svg" alt="An overview of major classes and their relation">
+<pre>@startuml
+
+class LoggerContext {
+ Configuration config
+ Logger[] loggers
+ Logger getLogger(String name)
+}
+
+note left of LoggerContext {
+ Anchor for the logging system
+}
+
+LoggerContext --> "0..*" Logger
+
+package "Configuration" as c {
+
+ class Configuration {
+ Appender[] appenders
+ Filter filter
+ LoggerConfig[] loggerConfigs
+ LoggerConfig getLoggerConfig(String name)
+ StrSubstitutor substitutor
+ }
+
+ note left of Configuration
+ Encapsulates components compiled
+ from a user-provided configuration
+ file (e.g., `log4j2.xml`)
+ end note
+
+ Configuration --> Filter
+
+ Configuration --> "0..*" Appender
+
+ Configuration --> "0..*" LoggerConfig
+
+ Configuration --> StrSubstitutor
+
+ class Appender {
+ AbstractManager manager
+ Layout layout
+ Filter filter
+ void append(LogEvent)
+ }
+
+ Appender --> Layout
+
+ Appender --> Filter
+
+ class Layout {
+ byte[] encode(LogEvent)
+ }
+
+ class Filter {
+ Result filter(LogEvent)
+ }
+
+ note right of Filter
+ Note that a `Filter` can
+ be provided at 4 levels:
+ 1. `Configuration`
+ 2. `LoggerConfig`
+ 3. `AppenderControl`
+ 4. `Appender`
+ end note
+
+ class LoggerConfig {
+ AppenderControl[] appenderControls
+ Level level
+ Filter filter
+ void log(LogEvent)
+ }
+
+ LoggerConfig -[#green,thickness=6]-> "0..*" AppenderControl
+
+ LoggerConfig --> Filter
+
+ class AppenderControl {
+ Appender appender
+ Filter filter
+ void append(LogEvent)
+ }
+
+ note right of AppenderControl
+ Decorates an `Appender`
+ with a `Filter`
+ end note
+
+ AppenderControl -[#green,thickness=6]-> Appender
+
+ AppenderControl --> Filter
+
+ class StrSubstitutor {
+ Interpolator interpolator
+ String replace(String input)
+ }
+
+ note right of StrSubstitutor
+ Responsible for
+ property substitution
+ (e.g., `${env:USER}`)
+ end note
+
+ StrSubstitutor --> Interpolator
+
+ class Interpolator {
+ StrLookup[] lookups
+ String lookup(String input)
+ }
+
+ Interpolator --> "0..*" StrLookup
+
+ class StrLookup {
+ String lookup(String input)
+ }
+}
+
+LoggerContext --> Configuration
+
+class Logger {
+ void log(Level level, Message message)
+}
+
+note right of Logger
+ The main API entry point
+ users interact with
+end note
+
+Logger -[#green,thickness=6]-> LoggerConfig : delegates `log()`
+
+class AbstractManager {
+}
+
+Appender -[#green,thickness=6]-> AbstractManager
+
+@enduml</pre>
</div>
-<div class="title">Figure 1. An overview of major classes and their relation</div>
</div>
<div class="paragraph">
<p>At a really high level,</p>
@@ -384,7 +519,7 @@ Both can be created either directly (i.e., programmatically) or indirectly at fi
<p><a href="#Configuration"><code>Configuration</code></a> is equipped with <a href="#StrSubstitutor"><code>StrSubstitutor</code> et al.</a> to allow property substitution in <code>String</code>-typed values.</p>
</li>
<li>
-<p>A typical <code>log()</code> call triggers a chain of invocations through classes <code>Logger</code>, <code>LoggerConfig</code>, <code>AppenderControl</code>, <code>Appender</code>, and <code>AbstractManager</code> in order – this is depicted using green arrows in <a href="#architecture-diagram">Figure 1</a>.</p>
+<p>A typical <code>log()</code> call triggers a chain of invocations through classes <code>Logger</code>, <code>LoggerConfig</code>, <code>AppenderControl</code>, <code>Appender</code>, and <code>AbstractManager</code> in order – this is depicted using green arrows in <a href="#architecture-diagram">An overview of major classes and their relation</a>.</p>
</li>
</ul>
</div>
@@ -400,11 +535,35 @@ Both can be created either directly (i.e., programmatically) or indirectly at fi
<p>The <a href="../javadoc/log4j-api/org/apache/logging/log4j/spi/LoggerContext.html"><code>LoggerContext</code></a> acts as the anchor point for the logging system.
It is associated with an active <a href="#Configuration"><code>Configuration</code></a> and is primarily responsible for instantiating <a href="#Logger"><code>Logger</code></a>s.</p>
</div>
-<div id="LoggerContext-diagram" class="imageblock kroki">
+<div id="LoggerContext-diagram" class="literalblock kroki-error">
+<div class="title"><code>LoggerContext</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-fd71b342bbb89cd55a1ddb592976b9ac26b6348e.svg" alt="`LoggerContext` and other directly related classes">
+<pre>@startuml
+
+class LoggerContext #line.bold {
+ Configuration config
+ Logger[] loggers
+ Logger getLogger(String name)
+}
+
+LoggerContext --> Configuration
+
+LoggerContext --> "0..*" Logger
+
+class Configuration {
+ Appender[] appenders
+ Filter filter
+ LoggerConfig[] loggerConfigs
+ LoggerConfig getLoggerConfig(String name)
+ StrSubstitutor substitutor
+}
+
+class Logger {
+ void log(Level level, Message message)
+}
+
+@enduml</pre>
</div>
-<div class="title">Figure 2. <code>LoggerContext</code> and other directly related classes</div>
</div>
<div class="paragraph">
<p>In most cases, applications have a single global <code>LoggerContext</code>.
@@ -420,11 +579,58 @@ Refer to <a href="../jakarta.html#log-separation" class="xref page">Log Separati
<p>Every <a href="#LoggerContext"><code>LoggerContext</code></a> is associated with an active <a href="../javadoc/log4j-core/org/apache/logging/log4j/core/config/Configuration.html"><code>Configuration</code></a>.
It models the configuration of all appenders, layouts, filters, loggers, and contains the reference to <a href="#StrSubstitutor"><code>StrSubstitutor</code> et al.</a>.</p>
</div>
-<div id="Configuration-diagram" class="imageblock kroki">
+<div id="Configuration-diagram" class="literalblock kroki-error">
+<div class="title"><code>Configuration</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-5ffe377615be9b0375b26533bbf7b10507dc946b.svg" alt="`Configuration` and other directly related classes">
+<pre>@startuml
+
+class LoggerContext {
+ Configuration config
+ Logger[] loggers
+ Logger getLogger(String name)
+}
+
+LoggerContext --> Configuration
+
+class Configuration #line.bold {
+ Appender[] appenders
+ Filter filter
+ LoggerConfig[] loggerConfigs
+ LoggerConfig getLoggerConfig(String name)
+ StrSubstitutor substitutor
+}
+
+Configuration --> "0..*" Filter
+
+Configuration --> "0..*" Appender
+
+Configuration --> "0..*" LoggerConfig
+
+Configuration --> StrSubstitutor
+
+class Appender {
+ Layout layout
+ void append(LogEvent)
+}
+
+class Filter {
+ Result filter(LogEvent)
+}
+
+class LoggerConfig {
+ AppenderRef[] appenderRefs
+ AppenderControl[] appenderControls
+ Level level
+ Filter filter
+ void log(LogEvent)
+}
+
+class StrSubstitutor {
+ Interpolator interpolator
+ String replace(String input)
+}
+@enduml</pre>
</div>
-<div class="title">Figure 3. <code>Configuration</code> and other directly related classes</div>
</div>
<div class="paragraph">
<p>Configuration of Log4j Core is typically done at application initialization.
@@ -461,11 +667,41 @@ Threads that already started processing a log event will either:</p>
</li>
</ul>
</div>
-<div class="imageblock kroki">
+<div class="literalblock kroki-error">
+<div class="title">Overview of the reconfiguration process</div>
<div class="content">
-<img src="../_images/diag-01168003b98f120d2f0736e5172de8e1218f189e.svg" alt="Overview of the reconfiguration process">
+<pre>@startuml
+left to right direction
+
+package LoggerContext {
+ object Logger
+
+ package "New Configuration" as c2 {
+ object "LoggerConfig" as lc2
+ object "AppenderControl" as ac2
+ object "Appender" as app2
+ }
+
+ package "Old Configuration" as c1 {
+ object "LoggerConfig" as lc1
+ object "AppenderControl" as ac1
+ object "Appender" as app1
+ }
+}
+
+object AbstractManager
+
+Logger ..> lc1
+lc1 --> ac1
+ac1 --> app1
+app1 --> AbstractManager
+
+Logger --> lc2
+lc2 --> ac2
+ac2 --> app2
+app2 --> AbstractManager
+@enduml</pre>
</div>
-<div class="title">Figure 4. Overview of the reconfiguration process</div>
</div>
</div>
</div>
@@ -479,11 +715,35 @@ They are created by calling one of the <code>getLogger()</code> methods of <a hr
The <code>Logger</code> itself performs no direct actions.
It simply has a name and is associated with a <a href="#LoggerConfig"><code>LoggerConfig</code></a>.</p>
</div>
-<div id="Logger-diagram" class="imageblock kroki">
+<div id="Logger-diagram" class="literalblock kroki-error">
+<div class="title"><code>Logger</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-77a13b00749af95e3ed0eefd605a73f25d70973c.svg" alt="`Logger` and other directly related classes">
+<pre>@startuml
+
+class LoggerContext {
+ Configuration config
+ Logger[] loggers
+ Logger getLogger(String name)
+}
+
+LoggerContext --> "0..*" Logger
+
+class LoggerConfig {
+ AppenderRef[] appenderRefs
+ AppenderControl[] appenderControls
+ Level level
+ Filter filter
+ void log(LogEvent)
+}
+
+class Logger #line.bold {
+ void log(Level level, Message message)
+}
+
+Logger -[#green,thickness=6]-> LoggerConfig : delegates `log()`
+
+@enduml</pre>
</div>
-<div class="title">Figure 5. <code>Logger</code> and other directly related classes</div>
</div>
<div class="paragraph">
<p>The hierarchy between <a href="#LoggerConfig"><code>LoggerConfig</code></a>s, implies the very same hierarchy between <code>Logger</code>s too.
@@ -521,11 +781,59 @@ A <code>LoggerConfig</code> essentially contains</p>
</li>
</ul>
</div>
-<div id="LoggerConfig-diagram" class="imageblock kroki">
+<div id="LoggerConfig-diagram" class="literalblock kroki-error">
+<div class="title"><code>LoggerConfig</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-73365a4d8197b5441a98fd1d661b07760da178be.svg" alt="`LoggerConfig` and other directly related classes">
+<pre>@startuml
+
+class Configuration {
+ Appender[] appenders
+ Filter filter
+ LoggerConfig[] loggerConfigs
+ LoggerConfig getLoggerConfig(String name)
+ StrSubstitutor substitutor
+}
+
+Configuration --> "0..*" LoggerConfig
+
+class Filter {
+ Result filter(LogEvent)
+}
+
+class LoggerConfig #line.bold {
+ AppenderRef[] appenderRefs
+ AppenderControl[] appenderControls
+ Level level
+ Filter filter
+ void log(LogEvent)
+}
+
+LoggerConfig --> "0..*" AppenderRef
+
+LoggerConfig -[#green,thickness=6]-> "0..*" AppenderControl
+
+LoggerConfig --> Filter
+
+class AppenderRef {
+ String appenderName
+ Level level
+ Filter filter
+}
+
+class AppenderControl {
+ Appender appender
+ Filter filter
+ void append(LogEvent)
+}
+
+class Logger {
+ void log(Level level, Message message)
+}
+
+Logger -[#green,thickness=6]-> LoggerConfig : delegates `log()`
+
+@enduml</pre>
</div>
-<div class="title">Figure 6. <code>LoggerConfig</code> and other directly related classes</div>
</div>
<div class="sect2">
<h3 id="logger-hierarchy"><a class="anchor" href="#logger-hierarchy"></a>Logger hierarchy</h3>
@@ -534,13 +842,19 @@ A <code>LoggerConfig</code> essentially contains</p>
A <code>LoggerConfig</code> called <code>child</code> is said to be parented by <code>parent</code>, if <code>parent</code> has the <em>longest prefix match</em> on name.
This match is case-sensitive and performed after tokenizing the name by splitting it from <code>.</code> (dot) characters.
For a positive name match, tokens must match exhaustively.
-See <a href="#logger-hiearchy-diagram">Figure 7</a> for an example.</p>
+See <a href="#logger-hiearchy-diagram">Example hierarchy of loggers named <code>X</code>, <code>X.Y</code>, <code>X.Y.Z</code>, and <code>X.YZ</code></a> for an example.</p>
</div>
-<div id="logger-hiearchy-diagram" class="imageblock kroki">
+<div id="logger-hiearchy-diagram" class="literalblock kroki-error">
+<div class="title">Example hierarchy of loggers named <code>X</code>, <code>X.Y</code>, <code>X.Y.Z</code>, and <code>X.YZ</code></div>
<div class="content">
-<img src="../_images/diag-892fd9dbd9ea6bece55c1d4078ae1de2edd5c689.svg" alt="Example hierarchy of loggers named `X`, `X.Y`, `X.Y.Z`, and `X.YZ`">
+<pre>@startmindmap
+* root
+** X
+*** X.Y
+**** X.Y.Z
+*** X.YZ
+@endmindmap</pre>
</div>
-<div class="title">Figure 7. Example hierarchy of loggers named <code>X</code>, <code>X.Y</code>, <code>X.Y.Z</code>, and <code>X.YZ</code></div>
</div>
<div class="paragraph">
<p>If a <code>LoggerConfig</code> is not provided an explicit level, it will be inherited from its parent.
@@ -782,11 +1096,57 @@ That is, we will examine the effective level of a <code>Logger</code> in various
<div class="paragraph">
<p>In addition to <a href="#LoggerConfig">the level-based filtering facilitated by <code>LoggerConfig</code></a>, Log4j provides <a href="../javadoc/log4j-core/org/apache/logging/log4j/core/Filter.html"><code>Filter</code></a>s to evaluate the parameters of a logging call (i.e., context-wide filter) or a log event, and decide if it should be processed further in the pipeline.</p>
</div>
-<div id="Filter-diagram" class="imageblock kroki">
+<div id="Filter-diagram" class="literalblock kroki-error">
+<div class="title"><code>Filter</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-581e854ee8ecdb00104bac5affda10a653d8f76d.svg" alt="`Filter` and other directly related classes">
+<pre>@startuml
+
+class Configuration {
+ Appender[] appenders
+ Filter filter
+ LoggerConfig[] loggerConfigs
+ LoggerConfig getLoggerConfig(String name)
+ StrSubstitutor substitutor
+}
+
+Configuration --> Filter
+
+Configuration --> "0..*" LoggerConfig
+
+class Filter #line.bold {
+ Result filter(LogEvent)
+}
+
+class LoggerConfig {
+ AppenderRef[] appenderRefs
+ AppenderControl[] appenderControls
+ Level level
+ Filter filter
+ void log(LogEvent)
+}
+
+LoggerConfig --> "0..*" AppenderRef
+
+LoggerConfig -[#green,thickness=6]-> "0..*" AppenderControl
+
+LoggerConfig --> Filter
+
+class AppenderRef {
+ String appenderName
+ Level level
+ Filter filter
+}
+
+class AppenderControl {
+ Filter filter
+}
+
+AppenderRef --> Filter
+
+AppenderControl --> Filter
+
+@enduml</pre>
</div>
-<div class="title">Figure 8. <code>Filter</code> and other directly related classes</div>
</div>
<div class="paragraph">
<p>Refer to <a href="filters.html" class="xref page">Filters</a> for further information.</p>
@@ -801,11 +1161,74 @@ That is, we will examine the effective level of a <code>Logger</code> in various
While doing so, they typically use <a href="#Layout"><code>Layout</code></a>s to encode the log event.
See <a href="appenders.html" class="xref page">Appenders</a> for the complete guide.</p>
</div>
-<div id="Appender-diagram" class="imageblock kroki">
+<div id="Appender-diagram" class="literalblock kroki-error">
+<div class="title"><code>Appender</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-63d449f3bcd24cfa522a41f6e2f545416de30322.svg" alt="`Appender` and other directly related classes">
+<pre>@startuml
+
+class Configuration {
+ Appender[] appenders
+ Filter filter
+ LoggerConfig[] loggerConfigs
+ LoggerConfig getLoggerConfig(String name)
+ StrSubstitutor substitutor
+}
+
+Configuration --> "0..*" Filter
+
+Configuration --> "0..*" Appender
+
+Configuration --> "0..*" LoggerConfig
+
+class Appender #line.bold {
+ Layout layout
+ void append(LogEvent)
+}
+
+Appender -[#green,thickness=6]-> Layout
+
+class Layout {
+ byte[] encode(LogEvent)
+}
+
+class Filter {
+ Result filter(LogEvent)
+}
+
+class LoggerConfig {
+ AppenderRef[] appenderRefs
+ AppenderControl[] appenderControls
+ Level level
+ Filter filter
+ void log(LogEvent)
+}
+
+LoggerConfig --> "0..*" AppenderRef
+
+LoggerConfig -[#green,thickness=6]-> "0..*" AppenderControl
+
+LoggerConfig --> Filter
+
+class AppenderRef {
+ String appenderName
+ Level level
+ Filter filter
+}
+
+AppenderRef --> Filter
+
+class AppenderControl {
+ Appender appender
+ Filter filter
+ void append(LogEvent)
+}
+
+AppenderControl -[#green,thickness=6]-> Appender
+
+AppenderControl --> Filter
+
+@enduml</pre>
</div>
-<div class="title">Figure 9. <code>Appender</code> and other directly related classes</div>
</div>
<div class="paragraph">
<p>An <code>Appender</code> can be added to a <a href="#Logger"><code>Logger</code></a> by calling the <a href="../javadoc/log4j-core/org/apache/logging/log4j/core/config/Configuration.html#addLoggerAppender(org.apache.logging.log4j.core.Logger,%20org.apache.logging.log4j.core.Appender)"><code>addLoggerAppender()</code></a> method of the current <a href="#Configuration"><code>Configuration</code></a>.
@@ -828,17 +1251,25 @@ However, if an ancestor of the <code>LoggerConfig</code> associated with <code>L
<details>
<summary class="title">Click for an example on appender additivity</summary>
<div class="content">
-<div id="appender-additivity-diagram" class="imageblock kroki">
+<div id="appender-additivity-diagram" class="literalblock kroki-error">
+<div class="title">Example hierarchy of logger configurations to demonstrate appender additivity</div>
<div class="content">
-<img src="../_images/diag-58c484caf8cd616db4f1c7ed31b51c123b5859d4.svg" alt="Example hierarchy of logger configurations to demonstrate appender additivity">
+<pre>@startmindmap
+* root
+** A
+*** A.B1 (additivity=false)
+**** A.B1.C
+***** A.B1.C.D
+*** A.B2.C
+**** A.B2.C.D (additivity=false)
+@endmindmap</pre>
</div>
-<div class="title">Figure 10. Example hierarchy of logger configurations to demonstrate appender additivity</div>
</div>
<div class="paragraph">
-<p>In <a href="#appender-additivity-diagram">Figure 10</a>, the effective appenders for each logger configuration are as follows:</p>
+<p>In <a href="#appender-additivity-diagram">Example hierarchy of logger configurations to demonstrate appender additivity</a>, the effective appenders for each logger configuration are as follows:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
-<caption class="title">Table 6. Effective appenders of logger configurations in <a href="#appender-additivity-diagram">Figure 10</a></caption>
+<caption class="title">Table 6. Effective appenders of logger configurations in <a href="#appender-additivity-diagram">Example hierarchy of logger configurations to demonstrate appender additivity</a></caption>
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 14.2857%;">
@@ -970,11 +1401,24 @@ Since during a <a href="#reconfiguration">reconfiguration event</a> multiple ins
<div class="paragraph">
<p>An <a href="#Appender"><code>Appender</code></a> uses a <strong>layout</strong> to encode a <a href="../javadoc/log4j-core/org/apache/logging/log4j/core/LogEvent.html"><code>LogEvent</code></a> into a form that meets the needs of whatever will be consuming the log event.</p>
</div>
-<div id="Layout-diagram" class="imageblock kroki">
+<div id="Layout-diagram" class="literalblock kroki-error">
+<div class="title"><code>Layout</code> and other directly related classes</div>
<div class="content">
-<img src="../_images/diag-232cdf1d44336897239fa03f6521cc730f38f32d.svg" alt="`Layout` and other directly related classes">
+<pre>@startuml
+
+class Appender {
+ Layout layout
+ void append(LogEvent)
+}
+
+Appender -[#green,thickness=6]-> Layout
+
+class Layout #line.bold {
+ byte[] encode(LogEvent)
+}
+
+@enduml</pre>
</div>
-<div class="title">Figure 11. <code>Layout</code> and other directly related classes</div>
</div>
<div class="paragraph">
<p>Refer to <a href="layouts.html" class="xref page">Layouts</a> for details.</p>
@@ -993,7 +1437,7 @@ It accepts an <a href="../javadoc/log4j-core/org/apache/logging/log4j/core/looku
<div class="content">
<img src="../_images/diag-7a08e5a79432e9299cc0d9671bd39677be5618e8.svg" alt="`StrSubstitutor` et al. and other directly related classes">
</div>
-<div class="title">Figure 12. <code>StrSubstitutor</code> et al. and other directly related classes</div>
+<div class="title">Figure 1. <code>StrSubstitutor</code> et al. and other directly related classes</div>
</div>
<div class="paragraph">
<p>See <a href="configuration.html#property-substitution" class="xref page">how property substitution works</a> and <a href="lookups.html" class="xref page">the predefined lookups</a> for further information.</p>
diff --git a/manual/lookups.html b/manual/lookups.html
index d48de87813..32a2322034 100644
--- a/manual/lookups.html
+++ b/manual/lookups.html
@@ -2191,8 +2191,21 @@ If you are using those application servers, you should replace the dependencies
<div class="sect1">
<h2 id="third-party"><a class="anchor" href="#third-party"></a>Third-party lookups</h2>
<div class="sectionbody">
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
<div class="paragraph">
-<p>The following additional lookups are available from third-party vendors:</p>
+<p>These lookups are provided by <strong>third-party</strong> vendors and are not maintained by the
+<a href="https://logging.apache.org">Apache Logging Services</a>
+(Log4j, Log4cxx, Log4net) project.</p>
+</div>
+</td>
+</tr>
+</table>
</div>
<div class="sect2">
<h3 id="KubernetesLookup"><a class="anchor" href="#KubernetesLookup"></a>Kubernetes Lookup</h3>
@@ -2256,6 +2269,32 @@ If you are upgrading to Spring Boot 3, make sure to remove the latter from your
</table>
</div>
</div>
+<div class="sect2">
+<h3 id="TomcatLookup"><a class="anchor" href="#TomcatLookup"></a>Tomcat Lookup</h3>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 80%;">
+</colgroup>
+<tbody>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Syntax</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tomcat:<key></code></p>
+<p class="tableblock">where <code>key</code> is one of the
+<a href="https://oss.copernik.eu/tomcat/3.x/components/log4j-tomcat#TomcatLookup-keys">supported Tomcat Lookup keys</a></p></td>
+</tr>
+<tr>
+<th class="tableblock halign-left valign-top"><p class="tableblock">Dependency</p></th>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://oss.copernik.eu/tomcat/3.x/components/log4j-tomcat#installation"><code>eu.copernik:log4j-tomcat</code></a></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The Tomcat Lookup allows retrieving the names of the currently active Tomcat engine, host and application context.
+See
+<a href="https://oss.copernik.eu/tomcat/3.x/components/log4j-tomcat#TomcatLookup">Copernik.eu Tomcat Lookup documentation</a> for more details.</p>
+</div>
+</div>
</div>
</div>
<div class="sect1">
diff --git a/manual/systemproperties.html b/manual/systemproperties.html
index d6f779b0db..422013616c 100644
--- a/manual/systemproperties.html
+++ b/manual/systemproperties.html
@@ -1370,6 +1370,37 @@ implementation to use.</p>
</dd>
</dl>
</div>
+<div class="paragraph">
+<p>There are also third-party context selector implementations:</p>
+</div>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>These context selectors are provided by <strong>third-party</strong> vendors and are not maintained by the
+<a href="https://logging.apache.org">Apache Logging Services</a>
+(Log4j, Log4cxx, Log4net) project.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="https://oss.copernik.eu/tomcat/3.x/components/log4j-tomcat#TomcatContextSelector"><code>eu.copernik.log4j.tomcat.TomcatContextSelector</code></a></dt>
+<dd>
+<p>Selects the currently active Tomcat web application and creates synchronous loggers.</p>
+</dd>
+<dt class="hdlist1"><a href="https://oss.copernik.eu/tomcat/3.x/components/log4j-tomcat#TomcatContextSelector"><code>eu.copernik.log4j.tomcat.TomcatAsyncContextSelector</code></a></dt>
+<dd>
+<p>Selects the currently active Tomcat web application and creates <a href="async.html" class="xref page">asynchronous loggers</a>.</p>
+</dd>
+</dl>
+</div>
</div>
</div>
<div class="sect2">
diff --git a/manual/thread-context.html b/manual/thread-context.html
index 29d0ab428e..8b57875ae0 100644
--- a/manual/thread-context.html
+++ b/manual/thread-context.html
@@ -568,10 +568,41 @@ You can provide a custom <code>ContextDataProvider</code> implementation as foll
</div>
</li>
<li>
-<p>Write the fully-qualified class name of your custom implementation (e.g., <code>com.mycompany.CustomContextDataProvider</code>) to the file created in the previous step</p>
+<p>Write the fully-qualified class name of your custom implementation (e.g., <code>com.mycompany.CustomContextDataProvider</code>) to the file created in the previous step.</p>
</li>
</ol>
</div>
+<div class="sect3">
+<h4 id="_third_party_custom_thread_context_data_providers"><a class="anchor" href="#_third_party_custom_thread_context_data_providers"></a>Third-party custom thread context data providers</h4>
+<div class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>These context data providers are supplied by <strong>third-party</strong> vendors and are not maintained by the
+<a href="https://logging.apache.org">Apache Logging Services</a>
+(Log4j, Log4cxx, Log4net) project.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure">OpenTelemetry Context Data Provider</a></dt>
+<dd>
+<p>Injects trace context data into log events.</p>
+</dd>
+<dt class="hdlist1"><a href="https://oss.copernik.eu/tomcat/3.x/components/log4j-tomcat#TomcatContextDataProvider">Copernik.eu Tomcat Context Data Provider</a></dt>
+<dd>
+<p>Injects the name of the currently active Tomcat engine, host and web application into log events.</p>
+</dd>
+</dl>
+</div>
+</div>
</div>
<div class="sect2">
<h3 id="custom-ThreadContextMap"><a class="anchor" href="#custom-ThreadContextMap"></a>Custom thread context map</h3>
diff --git a/migrate-from-slf4j.html b/migrate-from-slf4j.html
index a5363e8609..1b7f0c5f70 100644
--- a/migrate-from-slf4j.html
+++ b/migrate-from-slf4j.html
@@ -406,11 +406,63 @@ For instance, <code>log4j-slf4j2-impl</code> <em>bridges</em> SLF4J calls to Log
<div class="paragraph">
<p>To make things a little bit more tangible, consider the following visualization of a typical Log4j Core installation with bridges for an application:</p>
</div>
-<div class="imageblock kroki">
+<div class="literalblock kroki-error">
+<div class="title">Visualization of a typical Log4j Core installation with SLF4J, JUL, and JPL bridges</div>
<div class="content">
-<img src="_images/diag-a51b68065f249459078382aa4c61888857f01b2c.svg" alt="Visualization of a typical Log4j Core installation with SLF4J, JUL, and JPL bridges">
+<pre>@startuml
+
+frame "Compile time" {
+ [Application] --> [Log4j API] : logs to
+
+ [Log4j API] #Cyan
+
+ [SLF4J] #Cyan
+
+ [Library 1] --> [SLF4J] : logs to
+ [Application] --> [Library 1] : uses
+ [Application] --> [Library 2] : uses
+ [Application] --> [Library 3] : uses
+}
+
+frame Runtime {
+
+ [Log4j Core] <.. [Log4j API] : is implemented by
+ [Log4j Core] <.. (log4j2.xml) : is provided to
+ [Log4j Core] #LightGreen
+
+ [JPL-to-Log4j] ..> [Log4j Core] : forwards to
+ [JPL-to-Log4j] #Yellow
+
+ [SLF4J-to-Log4j] ..> [Log4j Core] : forwards to
+ [SLF4J-to-Log4j] #Yellow
+
+ [JUL-to-Log4j] ..> [Log4j Core] : forwards to
+ [JUL-to-Log4j] #Yellow
+
+ frame JRE {
+ [JPL] #Cyan
+ [JUL] #Cyan
+ }
+
+}
+
+[Library 2] --> [JUL] : logs to
+[Library 3] --> [JPL] : logs to
+
+[JPL] ..> [JPL-to-Log4j] : is implemented by
+[JUL] ..> [JUL-to-Log4j] : is implemented by
+[SLF4J] ..> [SLF4J-to-Log4j] : is implemented by
+
+legend top right
+ | <#LightGreen> | Logging implementation |
+ | <#Yellow> | Logging bridge |
+ | <#Cyan> | Logging API |
+ | <size:18><U+2192></size> | Compile-time usage |
+ | <size:18><U+21E2></size> | Runtime usage |
+endlegend
+
+@enduml</pre>
</div>
-<div class="title">Figure 1. Visualization of a typical Log4j Core installation with SLF4J, JUL, and JPL bridges</div>
</div>
</div>
</details>
diff --git a/plugin-reference.html b/plugin-reference.html
index dd23413378..d6900545cd 100644
--- a/plugin-reference.html
+++ b/plugin-reference.html
@@ -1474,7 +1474,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>
@@ -16131,10 +16131,10 @@ Supports Lookup expressions.</p>
<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 class="paragraph">
-<p>If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".</p>
+<p>If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".</p>
</div>
<div class="paragraph">
-<p>If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".</p>
+<p>If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".</p>
</div></div></td>
</tr>
<tr>
@@ -17428,10 +17428,10 @@ Supports Lookup expressions.</p>
<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 class="paragraph">
-<p>If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".</p>
+<p>If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".</p>
</div>
<div class="paragraph">
-<p>If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".</p>
+<p>If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".</p>
</div></div></td>
</tr>
<tr>
@@ -17627,10 +17627,10 @@ Supports Lookup expressions.</p>
<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 class="paragraph">
-<p>If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".</p>
+<p>If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".</p>
</div>
<div class="paragraph">
-<p>If "true", includes the stacktrace of any Throwable in the generated data, defaults to "true".</p>
+<p>If "true", includes the stacktrace of any Throwable in the generated JSON, defaults to "true".</p>
</div></div></td>
</tr>
<tr>
diff --git a/sitemap.xml b/sitemap.xml
index 831ee94e8f..4b759f8ee3 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -2,234 +2,234 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://logging.apache.org/log4j/2.x/components.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/development.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/download.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/faq.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/hibernate.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/index.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/jakarta.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/javadoc.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-iostreams.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-jul.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-spring-boot.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-spring-cloud-config-client.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/log4j-to-jul.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/api.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders/database.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders/delegating.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders/file.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders/message-queue.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders/network.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/architecture.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/async.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/compatibility.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/config-intro.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/configuration.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/customconfig.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/customloglevels.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/eventlogging.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/extending.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/filters.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/flowtracing.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/garbagefree.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/getting-started.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/implementation.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/index.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/installation.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/jmx.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/json-template-layout.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/layouts.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/logbuilder.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/lookups.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/markers.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/messages.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/pattern-layout.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/performance.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/plugins.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/scripts.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/simple-logger.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/status-logger.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/systemproperties.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/manual/thread-context.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/migrate-from-log4j1.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/migrate-from-logback.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/migrate-from-slf4j.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/plugin-reference.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/release-notes.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
<url>
<loc>https://logging.apache.org/log4j/2.x/soa.html</loc>
-<lastmod>2025-03-05T11:34:08.807Z</lastmod>
+<lastmod>2025-03-21T08:27:27.124Z</lastmod>
</url>
</urlset>