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

asf-gitbox-commits pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/struts-site.git


The following commit(s) were added to refs/heads/asf-staging by this push:
     new 96180e90c Updates stage by Jenkins
96180e90c is described below

commit 96180e90c66aa17cd1063d828b2ae0cdbf1ae434
Author: jenkins <[email protected]>
AuthorDate: Mon Aug 3 13:27:24 2026 +0000

    Updates stage by Jenkins
---
 content/core-developers/default-properties.html |  14 +++
 content/core-developers/logging.html            | 122 ++++--------------------
 2 files changed, 34 insertions(+), 102 deletions(-)

diff --git a/content/core-developers/default-properties.html 
b/content/core-developers/default-properties.html
index 8b3f4d106..d73264040 100644
--- a/content/core-developers/default-properties.html
+++ b/content/core-developers/default-properties.html
@@ -192,6 +192,9 @@ on the classpath, but it is typically found under <code 
class="language-plaintex
 
 ### This can be used to set your default locale and encoding scheme
 # struts.locale=en_US
+### When true, restrict request-derived locales (Accept-Language, used when 
struts.locale is unset) to the
+### JVM's available-locale set; unavailable values fall back to the default 
locale. Defaults to false.
+struts.locale.validateRequestLocale=false
 struts.i18n.encoding=UTF-8
 
 ### if specified, the default object factory can be overridden here
@@ -464,6 +467,13 @@ struts.ognl.expressionCacheType=wtlfu
 ### chosen and application-specific needs.
 struts.ognl.expressionCacheMaxSize=10000
 
+### Specifies the type of cache to use for the localized-text provider caches. 
See StrutsConstants for details.
+struts.i18n.cacheType=wtlfu
+
+### Specifies the maximum size of each localized-text provider cache. This 
should be configured based on the
+### cache type chosen and application-specific needs.
+struts.i18n.cacheMaxSize=10000
+
 ### Specifies the type of cache to use for BeanInfo objects. See 
StrutsConstants class for further information.
 struts.ognl.beanInfoCacheType=wtlfu
 
@@ -519,6 +529,10 @@ struts.url.decoder=strutsUrlDecoder
 ### Defines source to read nonce value from, possible values are: request, 
session
 struts.csp.nonceSource=session
 
+### Maximum size, in characters, of a CSP violation report accepted by 
CspReportAction
+### Reports larger than this are discarded. Values outside 1..1048576 are 
ignored.
+struts.csp.report.maxSize=8192
+
 ### Checkbox hidden field prefix
 ### Default prefix for backward compatibility. Change to "struts_checkbox_" 
for HTML5 validation.
 struts.ui.checkbox.hiddenPrefix=__checkbox_
diff --git a/content/core-developers/logging.html 
b/content/core-developers/logging.html
index 2a548978d..29b63369d 100644
--- a/content/core-developers/logging.html
+++ b/content/core-developers/logging.html
@@ -156,44 +156,34 @@
 
 <h2 id="logging-support">Logging support</h2>
 
-<blockquote>
-  <p>As from Struts 2.5 version, the logging layer is deprecated and Struts 
uses Log4j2
-The logging layer will be dropped with the next major release.</p>
-</blockquote>
+<p>Struts logs through <a 
href="https://logging.apache.org/log4j/2.x/";>Log4j2</a>. The <code 
class="language-plaintext highlighter-rouge">struts2-core</code> artifact 
declares <code class="language-plaintext highlighter-rouge">log4j-api</code>
+and <code class="language-plaintext highlighter-rouge">log4j-core</code>, and 
configuration is plain Log4j2 configuration — a <code class="language-plaintext 
highlighter-rouge">log4j2.xml</code> on the classpath, typically under
+<code class="language-plaintext highlighter-rouge">src/main/resources</code>. 
See <a href="../getting-started/debugging-struts">Debugging Struts</a> for an 
example configuration and the
+framework packages worth raising to <code class="language-plaintext 
highlighter-rouge">DEBUG</code>.</p>
 
-<blockquote>
-  <p>Note: support for a custom logging layer has been removed in Struts 
6.x</p>
-</blockquote>
+<p class="alert alert-warning">The pluggable logging layer that XWork used to 
provide — <code class="language-plaintext 
highlighter-rouge">com.opensymphony.xwork2.util.logging.LoggerFactory</code>, 
the
+<code class="language-plaintext highlighter-rouge">xwork.loggerFactory</code> 
system property and the Commons Logging / SLF4J / JDK Logger delegates — was 
deprecated in
+Struts 2.5 and <strong>removed in Struts 6.0.0</strong>. There is no 
framework-level logging abstraction to configure any more, and
+setting <code class="language-plaintext 
highlighter-rouge">-Dxwork.loggerFactory</code> has no effect.</p>
 
-<p>XWork provides its own layer to support logging - it allows to use many 
different implementations.</p>
-
-<p>Currently XWork provides support for the following libraries (in that order 
base on classpath discovery):</p>
-
-<ul>
-  <li>Commons Logging</li>
-  <li><a href="http://www.slf4j.org/";>SLF4J</a></li>
-  <li><a href="http://logging.apache.org/log4j/2.x/";>Log4j2</a></li>
-  <li>JDK Logger</li>
-</ul>
+<p>The Log4j2 bridges for third-party libraries (<code 
class="language-plaintext highlighter-rouge">log4j-jcl</code> for Commons 
Logging, <code class="language-plaintext 
highlighter-rouge">log4j-slf4j-impl</code> for SLF4J) are a
+separate concern and remain available. They route logging emitted by 
transitive dependencies into Log4j2.</p>
 
 <h2 id="usage">Usage</h2>
 
-<p>To use given type of library add it as a Maven dependency or drop into 
WEB-INF/lib folder. XWork LoggerFactory class will 
-use given logging provider if available.</p>
-
-<p>To add logging to your application simply declare a Logger as follow:</p>
+<p>Declare a Log4j2 logger in your own classes as usual:</p>
 
-<div class="language-java highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="kn">import</span> <span 
class="nn">com.opensymphony.xwork2.util.logging.Logger</span><span 
class="o">;</span>
-<span class="kn">import</span> <span 
class="nn">com.opensymphony.xwork2.util.logging.LoggerFactory</span><span 
class="o">;</span>
+<div class="language-java highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="kn">import</span> <span 
class="nn">org.apache.logging.log4j.LogManager</span><span class="o">;</span>
+<span class="kn">import</span> <span 
class="nn">org.apache.logging.log4j.Logger</span><span class="o">;</span>
 
 <span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">MyAction</span> <span class="o">{</span>
 
-    <span class="kd">private</span> <span class="kd">static</span> <span 
class="kd">final</span> <span class="nc">Logger</span> <span 
class="no">LOG</span> <span class="o">=</span> <span 
class="nc">LoggerFactory</span><span class="o">.</span><span 
class="na">getLogger</span><span class="o">(</span><span 
class="nc">MyAction</span><span class="o">.</span><span 
class="na">class</span><span class="o">);</span>
+    <span class="kd">private</span> <span class="kd">static</span> <span 
class="kd">final</span> <span class="nc">Logger</span> <span 
class="no">LOG</span> <span class="o">=</span> <span 
class="nc">LogManager</span><span class="o">.</span><span 
class="na">getLogger</span><span class="o">(</span><span 
class="nc">MyAction</span><span class="o">.</span><span 
class="na">class</span><span class="o">);</span>
 
     <span class="kd">private</span> <span class="nc">String</span> <span 
class="n">userName</span><span class="o">;</span>
 
     <span class="kd">public</span> <span class="nc">String</span> <span 
class="nf">execute</span><span class="o">()</span> <span class="o">{</span>
-        <span class="no">LOG</span><span class="o">.</span><span 
class="na">debug</span><span class="o">(</span><span class="s">"MyAction 
executed with UserName [#0]"</span><span class="o">,</span> <span 
class="n">userName</span><span class="o">);</span>
+        <span class="no">LOG</span><span class="o">.</span><span 
class="na">debug</span><span class="o">(</span><span class="s">"MyAction 
executed with UserName [{}]"</span><span class="o">,</span> <span 
class="n">userName</span><span class="o">);</span>
         <span class="k">return</span> <span class="s">"success"</span><span 
class="o">;</span>
     <span class="o">}</span>
 
@@ -202,85 +192,13 @@ use given logging provider if available.</p>
 <span class="o">}</span>
 </code></pre></div></div>
 
-<h2 id="implementing-my-own-factory">Implementing my own factory</h2>
-
-<p>You plug in your own logging solution, simple extend LoggerFactory class 
and provide a delegate which implements Logger 
-interface, like below:</p>
-
-<p><strong>JdkLoggerFactory which adds support for JDK logging</strong></p>
+<p>Note the <code class="language-plaintext highlighter-rouge">{}</code> 
placeholder — Log4j2 parameterised messages, not the <code 
class="language-plaintext highlighter-rouge">#0</code> syntax used by the 
removed XWork logger.</p>
 
-<div class="language-java highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="kn">import</span> <span 
class="nn">com.opensymphony.xwork2.util.logging.Logger</span><span 
class="o">;</span>
-<span class="kn">import</span> <span 
class="nn">com.opensymphony.xwork2.util.logging.LoggerFactory</span><span 
class="o">;</span>
-
-<span class="cm">/**
- * Creates jdk loggers
- */</span>
-<span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">JdkLoggerFactory</span> <span class="kd">extends</span> <span 
class="nc">LoggerFactory</span> <span class="o">{</span>
-
-    <span class="nd">@Override</span>
-    <span class="kd">protected</span> <span class="nc">Logger</span> <span 
class="nf">getLoggerImpl</span><span class="o">(</span><span 
class="nc">Class</span><span class="o">&lt;?&gt;</span> <span 
class="n">cls</span><span class="o">)</span> <span class="o">{</span>
-        <span class="k">return</span> <span class="k">new</span> <span 
class="nf">JdkLogger</span><span class="o">(</span><span 
class="n">java</span><span class="o">.</span><span class="na">util</span><span 
class="o">.</span><span class="na">logging</span><span class="o">.</span><span 
class="na">Logger</span><span class="o">.</span><span 
class="na">getLogger</span><span class="o">(</span><span 
class="n">cls</span><span class="o">.</span><span 
class="na">getName</span><span class="o">())) [...]
-    <span class="o">}</span>
-    
-    <span class="nd">@Override</span>
-    <span class="kd">protected</span> <span class="nc">Logger</span> <span 
class="nf">getLoggerImpl</span><span class="o">(</span><span 
class="nc">String</span> <span class="n">name</span><span class="o">)</span> 
<span class="o">{</span>
-        <span class="k">return</span> <span class="k">new</span> <span 
class="nf">JdkLogger</span><span class="o">(</span><span 
class="n">java</span><span class="o">.</span><span class="na">util</span><span 
class="o">.</span><span class="na">logging</span><span class="o">.</span><span 
class="na">Logger</span><span class="o">.</span><span 
class="na">getLogger</span><span class="o">(</span><span 
class="n">name</span><span class="o">));</span>
-    <span class="o">}</span>
-<span class="o">}</span>
-</code></pre></div></div>
-
-<p><strong>JdkLogger is a wrapper around java.util.logging.Logger and 
implements Logger interface</strong></p>
-
-<div class="language-java highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="kn">import</span> <span 
class="nn">com.opensymphony.xwork2.util.logging.Logger</span><span 
class="o">;</span>
-<span class="kn">import</span> <span 
class="nn">com.opensymphony.xwork2.util.logging.LoggerUtils</span><span 
class="o">;</span>
-
-<span class="kn">import</span> <span 
class="nn">java.util.logging.Level</span><span class="o">;</span>
-
-<span class="cm">/**
- * Delegates to jdk logger.  Maps fatal to Level.SEVERE along with error.
- */</span>
-<span class="kd">public</span> <span class="kd">class</span> <span 
class="nc">JdkLogger</span> <span class="kd">implements</span> <span 
class="nc">Logger</span> <span class="o">{</span>
-    
-    <span class="kd">private</span> <span class="n">java</span><span 
class="o">.</span><span class="na">util</span><span class="o">.</span><span 
class="na">logging</span><span class="o">.</span><span class="na">Logger</span> 
<span class="n">log</span><span class="o">;</span>
-    
-    <span class="kd">public</span> <span class="nf">JdkLogger</span><span 
class="o">(</span><span class="n">java</span><span class="o">.</span><span 
class="na">util</span><span class="o">.</span><span 
class="na">logging</span><span class="o">.</span><span class="na">Logger</span> 
<span class="n">log</span><span class="o">)</span> <span class="o">{</span>
-        <span class="k">this</span><span class="o">.</span><span 
class="na">log</span> <span class="o">=</span> <span class="n">log</span><span 
class="o">;</span>
-    <span class="o">}</span>
-
-    <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">error</span><span class="o">(</span><span class="nc">String</span> 
<span class="n">msg</span><span class="o">,</span> <span 
class="nc">String</span><span class="o">...</span> <span 
class="n">args</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">log</span><span class="o">.</span><span 
class="na">log</span><span class="o">(</span><span class="nc">Level</span><span 
class="o">.</span><span class="na">SEVERE</span><span class="o">,</span> <span 
class="nc">LoggerUtils</span><span class="o">.</span><span 
class="na">format</span><span class="o">(</span><span class="n">msg</span><span 
class="o">,</span> <span class="n">args</span><span class="o">));</span>
-    <span class="o">}</span>
-
-    <span class="kd">public</span> <span class="kt">void</span> <span 
class="nf">error</span><span class="o">(</span><span class="nc">String</span> 
<span class="n">msg</span><span class="o">,</span> <span 
class="nc">Throwable</span> <span class="n">ex</span><span class="o">,</span> 
<span class="nc">String</span><span class="o">...</span> <span 
class="n">args</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">log</span><span class="o">.</span><span 
class="na">log</span><span class="o">(</span><span class="nc">Level</span><span 
class="o">.</span><span class="na">SEVERE</span><span class="o">,</span> <span 
class="nc">LoggerUtils</span><span class="o">.</span><span 
class="na">format</span><span class="o">(</span><span class="n">msg</span><span 
class="o">,</span> <span class="n">args</span><span class="o">),</span> <span 
class="n">ex</span><span class="o">);</span>
-    <span class="o">}</span>
-    
-    <span class="o">...</span>
-<span class="o">}</span>
-</code></pre></div></div>
-
-<p>Check <a 
href="http://struts.apache.org/struts-core/apidocs/org/apache/struts2/util/logging/package-summary";>the
 source code</a>
-to see more details.</p>
-
-<h2 id="defining-which-factory-to-use">Defining which factory to use</h2>
-
-<p>Now you must tell XWork/Struts2 to use your implementation, just define 
system property like below:</p>
-
-<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code>-Dxwork.loggerFactory=com.demo.MyLoggerFactory
-</code></pre></div></div>
-
-<p>you can use the same to explicit tell the framework which implementation to 
use and don’t depend on class discovery, eg.:</p>
-
-<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code>-Dxwork.loggerFactory=com.opensymphony.xwork2.util.logging.slf4j.Slf4jLoggerFactory
-</code></pre></div></div>
-
-<p>or</p>
-
-<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code>-Dxwork.loggerFactory=com.opensymphony.xwork2.util.logging.log4j2.Log4j2LoggerFactory
-</code></pre></div></div>
+<h2 id="routing-struts-logging-elsewhere">Routing Struts logging elsewhere</h2>
 
-<p>will enable Slf4j or Log4j2 even if there is commons-logging on classpath 
available (commons-logging is the first 
-LoggerFactory to look for).</p>
+<p>Because Struts logs against the Log4j2 API rather than its own abstraction, 
redirecting its output is a Log4j2
+concern: either configure Log4j2 appenders as you need them, or put a bridge 
to your logging backend of choice on the
+classpath in place of <code class="language-plaintext 
highlighter-rouge">log4j-core</code>. Nothing needs to be declared in <code 
class="language-plaintext highlighter-rouge">struts.xml</code>.</p>
 
   </section>
 </article>

Reply via email to