You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/07/10 21:23:59 UTC

[logging-log4j2] 01/04: Avoid Locale-dependent lowercase/uppercase string conversion

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

pkarwasz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 0e5fe23848e22dfa2451d528d9f1bdac34aa8007
Author: Ammar Y. Awad <am...@ejad.com.eg>
AuthorDate: Fri May 19 19:52:49 2023 +0300

    Avoid Locale-dependent lowercase/uppercase string conversion
    
    String#toLowerCase and String#toUpperCase are locale-dependent. These calls are replaced with Strings#toRootLowerCase and Strings#toRootUpperCase.
---
 log4j-1.2-api/src/main/java/org/apache/log4j/Level.java          | 5 +++--
 .../src/main/java/org/apache/log4j/builders/BuilderManager.java  | 5 +++--
 .../src/main/java/org/apache/log4j/helpers/DateLayout.java       | 4 +++-
 .../src/main/java/org/apache/log4j/helpers/OptionConverter.java  | 8 +++++---
 .../src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java | 4 +++-
 .../main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java    | 4 +++-
 log4j-1.2-api/src/test/java/org/apache/log4j/xml/XLevel.java     | 4 +++-
 .../main/java/org/apache/logging/log4j/util/PropertySource.java  | 1 +
 .../log4j/core/appender/rolling/RollingAppenderSizeTest.java     | 3 ++-
 .../rolling/RollingAppenderTempCompressedFilePatternTest.java    | 3 ++-
 .../org/apache/logging/log4j/core/config/TestConfigurator.java   | 3 ++-
 .../org/apache/logging/log4j/core/appender/db/ColumnMapping.java | 5 +++--
 .../core/appender/rewrite/LoggerNameLevelRewritePolicy.java      | 5 +++--
 .../logging/log4j/core/appender/routing/IdlePurgePolicy.java     | 4 +++-
 .../log4j/core/config/composite/CompositeConfiguration.java      | 4 +++-
 .../log4j/core/config/composite/DefaultMergeStrategy.java        | 9 ++++++---
 .../log4j/core/config/plugins/convert/CoreTypeConverters.java    | 4 +++-
 .../java/org/apache/logging/log4j/core/lookup/Interpolator.java  | 5 +++--
 .../java/org/apache/logging/log4j/core/lookup/LowerLookup.java   | 4 +++-
 .../java/org/apache/logging/log4j/core/lookup/UpperLookup.java   | 4 +++-
 .../org/apache/logging/log4j/core/net/UrlConnectionFactory.java  | 7 ++++---
 .../logging/log4j/core/pattern/MessagePatternConverter.java      | 5 +++--
 .../java/org/apache/logging/log4j/core/script/ScriptManager.java | 1 +
 .../logging/log4j/core/time/internal/format/FastDateParser.java  | 4 +++-
 .../org/apache/logging/log4j/core/tools/picocli/CommandLine.java | 3 ++-
 .../java/org/apache/logging/log4j/couchdb/CouchDbProvider.java   | 4 +++-
 .../test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java  | 4 +++-
 .../apache/logging/log4j/web/Log4jServletContextListener.java    | 5 +++--
 .../log4j/web/Log4jShutdownOnContextDestroyedListener.java       | 5 +++--
 .../org/apache/logging/log4j/layout/template/json/util/Uris.java | 4 +++-
 .../java/org/apache/logging/log4j/spring/boot/SpringLookup.java  | 4 +++-
 .../java/org/apache/logging/log4j/taglib/TagUtilsLevelTest.java  | 3 ++-
 .../apache/logging/log4j/web/Log4jServletContextListener.java    | 5 +++--
 .../log4j/web/Log4jShutdownOnContextDestroyedListener.java       | 5 +++--
 34 files changed, 99 insertions(+), 48 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Level.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Level.java
index 19c5e2644f..0e0247e154 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Level.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Level.java
@@ -21,11 +21,12 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
-import java.util.Locale;
 
 import org.apache.log4j.helpers.OptionConverter;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * Defines the minimum set of levels recognized by the system, that is
  * <code>OFF</code>, <code>FATAL</code>, <code>ERROR</code>,
@@ -181,7 +182,7 @@ public class Level extends Priority implements Serializable {
         if (sArg == null) {
             return defaultLevel;
         }
-        final String s = sArg.toUpperCase(Locale.ROOT);
+        final String s = toRootUpperCase(sArg);
         switch (s) {
         case "ALL":
             return Level.ALL;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
index 864e5ff27e..9e08423bb8 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
@@ -16,7 +16,6 @@
  */
 package org.apache.log4j.builders;
 
-import java.util.Locale;
 import java.util.Objects;
 import java.util.Properties;
 import java.util.function.Function;
@@ -45,6 +44,8 @@ import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Cast;
 import org.w3c.dom.Element;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  *
  */
@@ -95,7 +96,7 @@ public class BuilderManager {
     private <T> PluginType<T> getPlugin(final String className) {
         Objects.requireNonNull(plugins, "plugins");
         Objects.requireNonNull(className, "className");
-        final String key = className.toLowerCase(Locale.ROOT).trim();
+        final String key = toRootLowerCase(className).trim();
         final PluginType<?> pluginType = plugins.get(key);
         if (pluginType == null) {
             LOGGER.warn("Unable to load plugin class name {} with key {}", className, key);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/DateLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/DateLayout.java
index 64110aaf5d..98a657a126 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/DateLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/DateLayout.java
@@ -25,6 +25,8 @@ import java.util.TimeZone;
 import org.apache.log4j.Layout;
 import org.apache.log4j.spi.LoggingEvent;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * This abstract layout takes care of all the date related options and formatting work.
  */
@@ -156,7 +158,7 @@ abstract public class DateLayout extends Layout {
     @Deprecated
     public void setOption(final String option, final String value) {
         if (option.equalsIgnoreCase(DATE_FORMAT_OPTION)) {
-            dateFormatOption = value.toUpperCase();
+            dateFormatOption = toRootUpperCase(value);
         } else if (option.equalsIgnoreCase(TIMEZONE_OPTION)) {
             timeZoneID = value;
         }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
index 1e9033d811..061a7770b0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
@@ -37,6 +37,8 @@ import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * A convenience class to convert property values to specific types.
  */
@@ -158,7 +160,7 @@ public final class OptionConverter {
     }
 
     public static org.apache.logging.log4j.Level createLevel(final Priority level) {
-        final String name = level.toString().toUpperCase() + "#" + level.getClass().getName();
+        final String name = toRootUpperCase(level.toString()) + "#" + level.getClass().getName();
         return org.apache.logging.log4j.Level.forName(name, toLog4j2Level(level.toInt()));
     }
 
@@ -493,7 +495,7 @@ public final class OptionConverter {
             return defaultValue;
         }
 
-        String s = value.trim().toUpperCase();
+        String s = toRootUpperCase(value.trim());
         long multiplier = 1;
         int index;
 
@@ -627,7 +629,7 @@ public final class OptionConverter {
 
         // Support for levels defined in Log4j2.
         if (LOG4J2_LEVEL_CLASS.equals(clazz)) {
-            final org.apache.logging.log4j.Level v2Level = org.apache.logging.log4j.Level.getLevel(levelName.toUpperCase());
+            final org.apache.logging.log4j.Level v2Level = org.apache.logging.log4j.Level.getLevel(toRootUpperCase(levelName));
             if (v2Level != null) {
                 return new LevelWrapper(v2Level);
             }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
index c17968bb4c..d78de72e0f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
@@ -21,6 +21,8 @@ import java.util.List;
 
 import org.apache.log4j.Level;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * An extension of the Level class that provides support for java.util.logging Levels.
  */
@@ -199,7 +201,7 @@ public class UtilLoggingLevel extends Level {
             return defaultLevel;
         }
 
-        final String s = sArg.toUpperCase();
+        final String s = toRootUpperCase(sArg);
 
         if (s.equals("SEVERE")) {
             return SEVERE;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java
index b9d1213cd2..c167442aee 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java
@@ -37,6 +37,8 @@ import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.util.Chars;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * Port of the layout used by SyslogAppender in Log4j 1.x. Provided for
  * compatibility with existing Log4j 1 configurations.
@@ -186,7 +188,7 @@ public final class Log4j1SyslogLayout  extends AbstractStringLayout {
         }
 
         if (facilityPrinting) {
-            buf.append(facility != null ? facility.name().toLowerCase() : "user").append(':');
+            buf.append(facility != null ? toRootLowerCase(facility.name()) : "user").append(':');
         }
 
         buf.append(message);
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/xml/XLevel.java b/log4j-1.2-api/src/test/java/org/apache/log4j/xml/XLevel.java
index bfc729e5c1..ff49380572 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/xml/XLevel.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/xml/XLevel.java
@@ -18,6 +18,8 @@ package org.apache.log4j.xml;
 
 import org.apache.log4j.Level;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * This class introduces a new level called TRACE. TRACE has lower level than DEBUG.
  */
@@ -55,7 +57,7 @@ public class XLevel extends Level {
         if (sArg == null) {
             return defaultValue;
         }
-        final String stringVal = sArg.toUpperCase();
+        final String stringVal = toRootUpperCase(sArg);
 
         if (stringVal.equals(TRACE_STR)) {
             return XLevel.TRACE;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertySource.java
index fb65942745..29160bafba 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertySource.java
@@ -30,6 +30,7 @@ import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 
 
+
 /**
  * A source for global configuration properties.
  *
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
index 595d6de32f..80f904664e 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderSizeTest.java
@@ -46,6 +46,7 @@ import org.junit.runners.Parameterized;
 
 import static org.apache.logging.log4j.core.test.hamcrest.Descriptors.that;
 import static org.apache.logging.log4j.core.test.hamcrest.FileMatchers.hasName;
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
 import static org.hamcrest.Matchers.endsWith;
 import static org.hamcrest.Matchers.hasItemInArray;
 import static org.junit.Assert.*;
@@ -147,7 +148,7 @@ public class RollingAppenderSizeTest {
                 CompressorInputStream in = null;
                 try (final FileInputStream fis = new FileInputStream(file)) {
                     try {
-                        in = new CompressorStreamFactory().createCompressorInputStream(ext.name().toLowerCase(), fis);
+                        in = new CompressorStreamFactory().createCompressorInputStream(toRootLowerCase(ext.name()), fis);
                     } catch (final CompressorException ce) {
                         ce.printStackTrace();
                         fail("Error creating input stream from " + file.toString() + ": " + ce.getMessage());
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTempCompressedFilePatternTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTempCompressedFilePatternTest.java
index 8fee8bac61..53a7f4043d 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTempCompressedFilePatternTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderTempCompressedFilePatternTest.java
@@ -44,6 +44,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledOnOs;
 import org.junit.jupiter.api.condition.OS;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
@@ -91,7 +92,7 @@ public class RollingAppenderTempCompressedFilePatternTest {
                         if (ext != null) {
                             gzippedFiles++;
                             try {
-                                in = new CompressorStreamFactory().createCompressorInputStream(ext.name().toLowerCase(),
+                                in = new CompressorStreamFactory().createCompressorInputStream(toRootLowerCase(ext.name()),
                                         fis);
                             } catch (final CompressorException ce) {
                                 ce.printStackTrace();
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
index 1fe1ebfaab..591097dae6 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/TestConfigurator.java
@@ -48,6 +48,7 @@ import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
 import static org.apache.logging.log4j.core.test.hamcrest.MapMatchers.hasSize;
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThan;
@@ -393,7 +394,7 @@ public class TestConfigurator {
 
         for (final String element : CHARS) {
             dir.append(element);
-            dir.append(element.toUpperCase());
+            dir.append(toRootUpperCase(element));
         }
         final String value = FILESEP.equals("/") ? dir.toString() + "/test.log" : "1:/target/bad:file.log";
         System.setProperty("testfile", value);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
index 69e845028f..24d201c052 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/ColumnMapping.java
@@ -17,7 +17,6 @@
 package org.apache.logging.log4j.core.appender.db;
 
 import java.util.Date;
-import java.util.Locale;
 import java.util.function.Supplier;
 
 import org.apache.logging.log4j.Logger;
@@ -39,6 +38,8 @@ import org.apache.logging.log4j.spi.ThreadContextStack;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * A configuration element for specifying a database column name mapping.
  *
@@ -209,7 +210,7 @@ public final class ColumnMapping {
     }
 
     public static String toKey(final String name) {
-        return name.toUpperCase(Locale.ROOT);
+        return toRootUpperCase(name);
     }
 
     private final StringLayout layout;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java
index f179322b53..773fe3a42e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/LoggerNameLevelRewritePolicy.java
@@ -17,7 +17,6 @@
 package org.apache.logging.log4j.core.appender.rewrite;
 
 import java.util.HashMap;
-import java.util.Locale;
 import java.util.Map;
 
 import org.apache.logging.log4j.Level;
@@ -30,6 +29,8 @@ import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * Rewrites log event levels for a given logger name.
  *
@@ -63,7 +64,7 @@ public final class LoggerNameLevelRewritePolicy implements RewritePolicy {
     }
 
     private static Level getLevel(final String name) {
-        return Level.getLevel(name.toUpperCase(Locale.ROOT));
+        return Level.getLevel(toRootUpperCase(name));
     }
 
     private final String loggerName;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java
index f4e568a2b6..113ea1d23f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/IdlePurgePolicy.java
@@ -33,6 +33,8 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * Policy is purging appenders that were not in use specified time in minutes
  */
@@ -145,7 +147,7 @@ public class IdlePurgePolicy extends AbstractLifeCycle implements PurgePolicy, R
             units = TimeUnit.MINUTES;
         } else {
             try {
-                units = TimeUnit.valueOf(timeUnit.toUpperCase());
+                units = TimeUnit.valueOf(toRootUpperCase(timeUnit));
             } catch (final Exception ex) {
                 LOGGER.error("Invalid timeUnit value {}. timeUnit set to MINUTES", timeUnit, ex);
                 units = TimeUnit.MINUTES;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
index 892247a052..d48be3d8db 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
@@ -34,6 +34,8 @@ import org.apache.logging.log4j.core.util.Watcher;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.ResolverUtil;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * A Composite Configuration.
  */
@@ -64,7 +66,7 @@ public class CompositeConfiguration extends AbstractConfiguration implements Rec
             final String key = entry.getKey();
             final String value = getConfigurationStrSubstitutor().replace(entry.getValue());
             if ("status".equalsIgnoreCase(key)) {
-                statusConfig.setStatus(value.toUpperCase());
+                statusConfig.setStatus(toRootUpperCase(value));
             } else if ("dest".equalsIgnoreCase(key)) {
                 statusConfig.setDestination(value);
             } else if ("shutdownHook".equalsIgnoreCase(key)) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java
index bcdff6d537..00281cdd96 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/DefaultMergeStrategy.java
@@ -29,6 +29,9 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.plugins.model.PluginType;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * The default merge strategy for composite configurations.
  * <p>
@@ -75,8 +78,8 @@ public class DefaultMergeStrategy implements MergeStrategy {
             for (final Map.Entry<String, String> targetAttribute : rootNode.getAttributes().entrySet()) {
                 if (targetAttribute.getKey().equalsIgnoreCase(attribute.getKey())) {
                     if (attribute.getKey().equalsIgnoreCase(STATUS)) {
-                        final Level targetLevel = Level.getLevel(targetAttribute.getValue().toUpperCase());
-                        final Level sourceLevel = Level.getLevel(attribute.getValue().toUpperCase());
+                        final Level targetLevel = Level.getLevel(toRootUpperCase(targetAttribute.getValue()));
+                        final Level sourceLevel = Level.getLevel(toRootUpperCase(attribute.getValue()));
                         if (targetLevel != null && sourceLevel != null) {
                             if (sourceLevel.isLessSpecificThan(targetLevel)) {
                                 targetAttribute.setValue(attribute.getValue());
@@ -131,7 +134,7 @@ public class DefaultMergeStrategy implements MergeStrategy {
                     continue;
                 }
 
-                switch (targetChildNode.getName().toLowerCase()) {
+                switch (toRootLowerCase(targetChildNode.getName())) {
                     case PROPERTIES:
                     case SCRIPTS:
                     case APPENDERS: {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
index 965b9284d0..fdace9dfb1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
@@ -42,6 +42,8 @@ import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.convert.TypeConverters;
 import org.apache.logging.log4j.util.LoaderUtil;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * General {@link TypeConverter} implementations.
  *
@@ -142,7 +144,7 @@ public final class CoreTypeConverters {
     public static class ClassConverter implements TypeConverter<Class<?>> {
         @Override
         public Class<?> convert(final String s) throws ClassNotFoundException {
-            switch (s.toLowerCase()) {
+            switch (toRootLowerCase(s)) {
                 case "boolean":
                     return boolean.class;
                 case "byte":
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
index 352a0624a9..41cf0f6d87 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java
@@ -17,7 +17,6 @@
 package org.apache.logging.log4j.core.lookup;
 
 import java.lang.ref.WeakReference;
-import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Supplier;
@@ -32,6 +31,8 @@ import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.status.StatusLogger;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * Proxies other {@link StrLookup}s using a keys within ${} markers.
  */
@@ -167,7 +168,7 @@ public class Interpolator extends AbstractConfigurationAwareLookup implements Lo
 
         final int prefixPos = var.indexOf(PREFIX_SEPARATOR);
         if (prefixPos >= 0) {
-            final String prefix = var.substring(0, prefixPos).toLowerCase(Locale.US);
+            final String prefix = toRootLowerCase(var.substring(0, prefixPos));
             final String name = var.substring(prefixPos + 1);
             final Supplier<? extends StrLookup> lookupSupplier = strLookups.get(prefix);
             String value = null;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/LowerLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/LowerLookup.java
index 554483bf9a..71a18b8a20 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/LowerLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/LowerLookup.java
@@ -19,6 +19,8 @@ package org.apache.logging.log4j.core.lookup;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Plugin;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * Converts values to lower case. The passed in "key" should be the value of another lookup.
  */
@@ -33,7 +35,7 @@ public class LowerLookup implements StrLookup {
      */
     @Override
     public String lookup(final String key) {
-        return key != null ? key.toLowerCase() : null;
+        return key != null ? toRootLowerCase(key) : null;
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/UpperLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/UpperLookup.java
index 44a541ddda..22952e0aa7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/UpperLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/UpperLookup.java
@@ -19,6 +19,8 @@ package org.apache.logging.log4j.core.lookup;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Plugin;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * Converts values to upper case. The passed in "key" should be the value of another lookup.
  */
@@ -33,7 +35,7 @@ public class UpperLookup implements StrLookup {
      */
     @Override
     public String lookup(final String key) {
-        return key != null ? key.toUpperCase() : null;
+        return key != null ? toRootUpperCase(key) : null;
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
index dadab1dc48..c37315e784 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
@@ -24,7 +24,6 @@ import java.net.URL;
 import java.net.URLConnection;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Locale;
 
 import javax.net.ssl.HttpsURLConnection;
 
@@ -37,6 +36,8 @@ import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * Constructs an HTTPURLConnection. This class should be considered to be internal
  */
@@ -61,8 +62,8 @@ public class UrlConnectionFactory {
             final SslConfiguration sslConfiguration, final AuthorizationProvider authorizationProvider)
         throws IOException {
         final PropertyEnvironment props = PropertiesUtil.getProperties();
-        final List<String> allowed = Arrays.asList(Strings.splitList(props
-                .getStringProperty(ALLOWED_PROTOCOLS, DEFAULT_ALLOWED_PROTOCOLS).toLowerCase(Locale.ROOT)));
+        final List<String> allowed = Arrays.asList(Strings.splitList(toRootLowerCase(props
+                .getStringProperty(ALLOWED_PROTOCOLS, DEFAULT_ALLOWED_PROTOCOLS))));
         if (allowed.size() == 1 && NO_PROTOCOLS.equals(allowed.get(0))) {
             throw new ProtocolException("No external protocols have been enabled");
         }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
index fe3da49d81..290f5ae3dd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core.pattern;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
@@ -33,6 +32,8 @@ import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * Returns the event's rendered message in a StringBuilder.
  */
@@ -52,7 +53,7 @@ public abstract class MessagePatternConverter extends LogEventPatternConverter {
     private static TextRenderer loadMessageRenderer(final String[] options) {
         if (options != null) {
             for (final String option : options) {
-                switch (option.toUpperCase(Locale.ROOT)) {
+                switch (toRootUpperCase(option)) {
                 case "ANSI":
                     if (Loader.isJansiAvailable()) {
                         return new JAnsiTextRenderer(options, JAnsiTextRenderer.DefaultMessageStyleMap);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
index 5f7b23ab83..11de16d9ce 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
@@ -21,6 +21,7 @@ import java.util.Set;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.di.Key;
 
+
 /**
  * Script Manager.
  */
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java
index ef7ed9b336..7d6661767e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java
@@ -36,6 +36,8 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * <p>FastDateParser is a fast and thread-safe version of
  * {@link java.text.SimpleDateFormat}.</p>
@@ -867,7 +869,7 @@ public class FastDateParser implements DateParser {
                 final TimeZone tz = TimeZone.getTimeZone("GMT" + value);
                 cal.setTimeZone(tz);
             } else if (value.regionMatches(true, 0, "GMT", 0, 3)) {
-                final TimeZone tz = TimeZone.getTimeZone(value.toUpperCase());
+                final TimeZone tz = TimeZone.getTimeZone(toRootUpperCase(value));
                 cal.setTimeZone(tz);
             } else {
                 final TzInfo tzInfo = tzNames.get(value.toLowerCase(locale));
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
index d1d667308c..241471c0f1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
@@ -73,6 +73,7 @@ import static java.util.Locale.ENGLISH;
 import static org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Column.Overflow.SPAN;
 import static org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Column.Overflow.TRUNCATE;
 import static org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Column.Overflow.WRAP;
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
 
 /**
  * <p>
@@ -3877,7 +3878,7 @@ public class CommandLine {
                 if (o1 == null) { return 1; } else if (o2 == null) { return -1; } // options before params
                 final String[] names1 = ShortestFirst.sort(o1.names());
                 final String[] names2 = ShortestFirst.sort(o2.names());
-                int result = names1[0].toUpperCase().compareTo(names2[0].toUpperCase()); // case insensitive sort
+                int result = toRootUpperCase(names1[0]).compareTo(toRootUpperCase(names2[0])); // case insensitive sort
                 result = result == 0 ? -names1[0].compareTo(names2[0]) : result; // lower case before upper case
                 return o1.help() == o2.help() ? result : o2.help() ? -1 : 1; // help options come last
             }
diff --git a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
index 7d1850b876..bde00d4435 100644
--- a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
+++ b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
@@ -35,6 +35,8 @@ import org.apache.logging.log4j.util.Strings;
 import org.lightcouch.CouchDbClient;
 import org.lightcouch.CouchDbProperties;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * The Apache CouchDB implementation of {@link NoSqlProvider}.
  */
@@ -134,7 +136,7 @@ public final class CouchDbProvider implements NoSqlProvider<CouchDbConnection> {
             }
         } else if (Strings.isNotEmpty(databaseName)) {
             if (protocol != null && protocol.length() > 0) {
-                protocol = protocol.toLowerCase();
+                protocol = toRootLowerCase(protocol);
                 if (!protocol.equals("http") && !protocol.equals("https")) {
                     LOGGER.error("Only protocols [http] and [https] are supported, [{}] specified.", protocol);
                     return null;
diff --git a/log4j-jakarta-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java b/log4j-jakarta-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
index fd65d971e3..b2042ea28c 100644
--- a/log4j-jakarta-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
+++ b/log4j-jakarta-smtp/src/test/java/org/apache/logging/dumbster/smtp/SmtpRequest.java
@@ -18,6 +18,8 @@ package org.apache.logging.dumbster.smtp;
 
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * Contains an SMTP client request. Handles state transitions using the following state transition table.
  * <PRE>
@@ -187,7 +189,7 @@ public class SmtpRequest {
                 }
             }
         } else {
-            final String su = s.toUpperCase();
+            final String su = toRootUpperCase(s);
             if (su.startsWith("EHLO ") || su.startsWith("HELO")) {
                 action = SmtpActionType.EHLO;
                 params = s.substring(5);
diff --git a/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java b/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java
index 2dd5e37bcd..a54c10aee3 100644
--- a/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java
+++ b/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.web;
 
-import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
 import jakarta.servlet.ServletContext;
@@ -27,6 +26,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * In environments older than Servlet 3.0, this initializer is responsible for starting up Log4j logging before anything
  * else happens in application initialization. In all environments, this shuts down Log4j after the application shuts
@@ -82,7 +83,7 @@ public class Log4jServletContextListener implements ServletContextListener {
                 : Long.parseLong(stopTimeoutStr);
         final String timeoutTimeUnitStr = servletContext.getInitParameter(KEY_STOP_TIMEOUT_TIMEUNIT);
         final TimeUnit timeoutTimeUnit = Strings.isEmpty(timeoutTimeUnitStr) ? DEFAULT_STOP_TIMEOUT_TIMEUNIT
-                : TimeUnit.valueOf(timeoutTimeUnitStr.toUpperCase(Locale.ROOT));
+                : TimeUnit.valueOf(toRootUpperCase(timeoutTimeUnitStr));
         this.initializer.stop(stopTimeout, timeoutTimeUnit);
     }
 }
diff --git a/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java b/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java
index 3f88c4ba78..9a2e6a8948 100644
--- a/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java
+++ b/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.web;
 
-import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
 import jakarta.servlet.ServletContext;
@@ -27,6 +26,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 public class Log4jShutdownOnContextDestroyedListener implements ServletContextListener {
 
     static final int DEFAULT_STOP_TIMEOUT = 30;
@@ -69,7 +70,7 @@ public class Log4jShutdownOnContextDestroyedListener implements ServletContextLi
                 : Long.parseLong(stopTimeoutStr);
         final String timeoutTimeUnitStr = servletContext.getInitParameter(KEY_STOP_TIMEOUT_TIMEUNIT);
         final TimeUnit timeoutTimeUnit = Strings.isEmpty(timeoutTimeUnitStr) ? DEFAULT_STOP_TIMEOUT_TIMEUNIT
-                : TimeUnit.valueOf(timeoutTimeUnitStr.toUpperCase(Locale.ROOT));
+                : TimeUnit.valueOf(toRootUpperCase(timeoutTimeUnitStr));
         this.initializer.stop(stopTimeout, timeoutTimeUnit);
     }
 }
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java
index 5b126b463e..694d0eaa96 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java
@@ -34,6 +34,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LoaderUtil;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 public final class Uris {
 
     private Uris() {}
@@ -79,7 +81,7 @@ public final class Uris {
             final URI uri,
             final Charset charset)
             throws Exception {
-        final String uriScheme = uri.getScheme().toLowerCase();
+        final String uriScheme = toRootLowerCase(uri.getScheme());
         switch (uriScheme) {
             case "classpath":
                 return readClassPathUri(uri, charset);
diff --git a/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/SpringLookup.java b/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/SpringLookup.java
index 2af573aa01..2a4cb5bd2a 100644
--- a/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/SpringLookup.java
+++ b/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/SpringLookup.java
@@ -29,6 +29,8 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.springframework.core.env.Environment;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
+
 /**
  * Lookup for Spring properties.
  */
@@ -48,7 +50,7 @@ public class SpringLookup implements LoggerContextAware, StrLookup {
     @Override
     public String lookup(final String key) {
         if (environment != null) {
-            final String lowerKey = key.toLowerCase();
+            final String lowerKey = toRootLowerCase(key);
             if (lowerKey.startsWith(ACTIVE)) {
                 switch (environment.getActiveProfiles().length) {
                     case 0: {
diff --git a/log4j-taglib/src/test/java/org/apache/logging/log4j/taglib/TagUtilsLevelTest.java b/log4j-taglib/src/test/java/org/apache/logging/log4j/taglib/TagUtilsLevelTest.java
index 9708741588..1731077716 100644
--- a/log4j-taglib/src/test/java/org/apache/logging/log4j/taglib/TagUtilsLevelTest.java
+++ b/log4j-taglib/src/test/java/org/apache/logging/log4j/taglib/TagUtilsLevelTest.java
@@ -24,6 +24,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import static org.apache.logging.log4j.util.Strings.toRootLowerCase;
 import static org.junit.Assert.*;
 
 @RunWith(Parameterized.class)
@@ -42,7 +43,7 @@ public class TagUtilsLevelTest {
         final Collection<Object[]> params = new ArrayList<>();
         // this is perhaps the laziest way to test all the known levels
         for (final Level level : Level.values()) {
-            params.add(new Object[]{level, level.name().toLowerCase()});
+            params.add(new Object[]{level, toRootLowerCase(level.name())});
         }
         return params;
     }
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java
index 39277946dd..56020841c2 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jServletContextListener.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.web;
 
-import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
 import javax.servlet.ServletContext;
@@ -27,6 +26,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 /**
  * In environments older than Servlet 3.0, this initializer is responsible for starting up Log4j logging before anything
  * else happens in application initialization. In all environments, this shuts down Log4j after the application shuts
@@ -82,7 +83,7 @@ public class Log4jServletContextListener implements ServletContextListener {
                 : Long.parseLong(stopTimeoutStr);
         final String timeoutTimeUnitStr = servletContext.getInitParameter(KEY_STOP_TIMEOUT_TIMEUNIT);
         final TimeUnit timeoutTimeUnit = Strings.isEmpty(timeoutTimeUnitStr) ? DEFAULT_STOP_TIMEOUT_TIMEUNIT
-                : TimeUnit.valueOf(timeoutTimeUnitStr.toUpperCase(Locale.ROOT));
+                : TimeUnit.valueOf(toRootUpperCase(timeoutTimeUnitStr));
         this.initializer.stop(stopTimeout, timeoutTimeUnit);
     }
 }
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java
index bfe845cb6b..bf97500486 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jShutdownOnContextDestroyedListener.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.web;
 
-import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
 import javax.servlet.ServletContext;
@@ -27,6 +26,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
+import static org.apache.logging.log4j.util.Strings.toRootUpperCase;
+
 public class Log4jShutdownOnContextDestroyedListener implements ServletContextListener {
 
     static final int DEFAULT_STOP_TIMEOUT = 30;
@@ -69,7 +70,7 @@ public class Log4jShutdownOnContextDestroyedListener implements ServletContextLi
                 : Long.parseLong(stopTimeoutStr);
         final String timeoutTimeUnitStr = servletContext.getInitParameter(KEY_STOP_TIMEOUT_TIMEUNIT);
         final TimeUnit timeoutTimeUnit = Strings.isEmpty(timeoutTimeUnitStr) ? DEFAULT_STOP_TIMEOUT_TIMEUNIT
-                : TimeUnit.valueOf(timeoutTimeUnitStr.toUpperCase(Locale.ROOT));
+                : TimeUnit.valueOf(toRootUpperCase(timeoutTimeUnitStr));
         this.initializer.stop(stopTimeout, timeoutTimeUnit);
     }
 }