You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/02/21 13:11:13 UTC

[logging-log4j2] branch release-2.x updated: Trim whitespace before parsing a String into an Integer.

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

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new c33646f  Trim whitespace before parsing a String into an Integer.
c33646f is described below

commit c33646f61850619c756797122f4fc4c53f7013f1
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Mon Feb 21 08:11:09 2022 -0500

    Trim whitespace before parsing a String into an Integer.
---
 .../org/apache/logging/log4j/message/StructuredDataId.java |  2 +-
 .../java/org/apache/logging/log4j/util/PropertiesUtil.java |  2 +-
 .../src/main/java/org/apache/logging/log4j/util/Unbox.java |  2 +-
 .../apache/logging/log4j/core/appender/SmtpAppender.java   |  7 ++++---
 .../log4j/core/appender/mom/kafka/KafkaManager.java        |  3 ++-
 .../core/appender/rolling/AbstractRolloverStrategy.java    |  3 ++-
 .../core/appender/rolling/DefaultRolloverStrategy.java     |  2 +-
 .../core/appender/rolling/DirectWriteRolloverStrategy.java |  2 +-
 .../org/apache/logging/log4j/core/async/DisruptorUtil.java |  2 +-
 .../log4j/core/async/ThreadNameCachingStrategy.java        |  3 ++-
 .../config/builder/impl/DefaultConfigurationBuilder.java   |  3 ++-
 .../log4j/core/config/composite/DefaultMergeStrategy.java  |  5 +++--
 .../logging/log4j/core/config/json/JsonConfiguration.java  | 10 ++++++----
 .../config/properties/PropertiesConfigurationBuilder.java  |  4 ++--
 .../logging/log4j/core/config/xml/XmlConfiguration.java    |  4 +++-
 .../logging/log4j/core/impl/ThrowableFormatOptions.java    |  3 ++-
 .../core/jackson/Log4jStackTraceElementDeserializer.java   |  4 +++-
 .../org/apache/logging/log4j/core/layout/LoggerFields.java |  3 ++-
 .../logging/log4j/core/pattern/LevelPatternConverter.java  |  3 ++-
 .../apache/logging/log4j/core/pattern/NameAbbreviator.java |  3 ++-
 .../logging/log4j/core/pattern/RepeatPatternConverter.java |  3 ++-
 .../java/org/apache/logging/log4j/core/tools/Generate.java |  4 +++-
 .../logging/log4j/core/tools/picocli/CommandLine.java      | 14 ++++++++------
 .../org/apache/logging/log4j/core/util/CronExpression.java |  8 ++++----
 .../java/org/apache/logging/log4j/core/util/Integers.java  |  5 ++++-
 .../apache/logging/log4j/core/util/OptionConverter.java    |  4 ++--
 .../logging/log4j/core/util/datetime/FastDateParser.java   |  4 +++-
 .../logging/log4j/core/appender/FileAppenderTest.java      |  3 ++-
 .../appender/rolling/RollingAppenderDeleteScriptTest.java  |  3 ++-
 .../logging/log4j/core/async/perftest/PerfTestDriver.java  |  7 ++++---
 .../log4j/core/async/perftest/ResponseTimeTest.java        |  3 ++-
 .../logging/log4j/core/layout/Rfc5424LayoutTest.java       | 12 ++++++++----
 .../log4j/core/net/ssl/TlsSyslogInputStreamReader.java     |  4 +++-
 .../log4j/core/pattern/ThrowablePatternConverterTest.java  |  9 ++++++---
 .../logging/log4j/flume/appender/FlumeAppenderTest.java    |  5 +++--
 .../log4j/flume/appender/FlumePersistentAppenderTest.java  |  7 ++++---
 .../db/jpa/converter/InstantAttributeConverter.java        |  9 +++++----
 .../jpa/converter/StackTraceElementAttributeConverter.java |  3 ++-
 .../log4j/layout/template/json/util/RecyclerFactories.java | 11 ++++++-----
 .../log4j/layout/template/json/util/JsonReaderTest.java    |  9 +++++----
 .../apache/logging/log4j/mongodb3/MongoDb3TestRule.java    |  3 ++-
 .../apache/logging/log4j/mongodb4/MongoDb4TestRule.java    |  3 ++-
 .../logging/log4j/samples/app/LoggingController.java       |  3 ++-
 .../org/apache/logging/log4j/spring/boot/SpringLookup.java |  9 +++++----
 src/changes/changes.xml                                    |  3 +++
 45 files changed, 135 insertions(+), 83 deletions(-)

diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java
index 674bd35..902645d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataId.java
@@ -110,7 +110,7 @@ public class StructuredDataId implements Serializable, StringBuilderFormattable
 
         if (index > 0) {
             this.name = name.substring(0, index);
-            this.enterpriseNumber = Integer.parseInt(name.substring(index + 1));
+            this.enterpriseNumber = Integer.parseInt(name.substring(index + 1).trim());
         } else {
             this.name = name;
             this.enterpriseNumber = RESERVED;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
index 4275a3c..2a69548 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
@@ -242,7 +242,7 @@ public final class PropertiesUtil {
         final String prop = getStringProperty(name);
         if (prop != null) {
             try {
-                return Integer.parseInt(prop);
+                return Integer.parseInt(prop.trim());
             } catch (final Exception ignored) {
                 // ignore
             }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java
index bb59d46..b93b0f0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java
@@ -131,7 +131,7 @@ public class Unbox {
         final String userPreferredRBSize = PropertiesUtil.getProperties().getStringProperty(propertyName,
                 String.valueOf(RINGBUFFER_MIN_SIZE));
         try {
-            int size = Integer.parseInt(userPreferredRBSize);
+            int size = Integer.parseInt(userPreferredRBSize.trim());
             if (size < RINGBUFFER_MIN_SIZE) {
                 size = RINGBUFFER_MIN_SIZE;
                 LOGGER.warn("Invalid {} {}, using minimum size {}.", propertyName, userPreferredRBSize,
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
index 8fca6ff..7b0ed6c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
@@ -17,6 +17,8 @@
 
 package org.apache.logging.log4j.core.appender;
 
+import java.io.Serializable;
+
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
@@ -38,8 +40,7 @@ import org.apache.logging.log4j.core.layout.HtmlLayout;
 import org.apache.logging.log4j.core.net.SmtpManager;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
 import org.apache.logging.log4j.core.util.Booleans;
-
-import java.io.Serializable;
+import org.apache.logging.log4j.core.util.Integers;
 
 /**
  * Send an e-mail when a specific logging event occurs, typically on errors or
@@ -308,7 +309,7 @@ public final class SmtpAppender extends AbstractAppender {
         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
         final int smtpPort = AbstractAppender.parseInt(smtpPortStr, 0);
         final boolean isSmtpDebug = Boolean.parseBoolean(smtpDebug);
-        final int bufferSize = bufferSizeStr == null ? DEFAULT_BUFFER_SIZE : Integer.parseInt(bufferSizeStr);
+        final int bufferSize = bufferSizeStr == null ? DEFAULT_BUFFER_SIZE : Integers.parseInt(bufferSizeStr);
 
         if (layout == null) {
             layout = HtmlLayout.createDefaultLayout();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java
index cd37d75..14a1dff 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaManager.java
@@ -32,6 +32,7 @@ import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.AbstractManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.config.Property;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Log4jThread;
 
 public class KafkaManager extends AbstractManager {
@@ -72,7 +73,7 @@ public class KafkaManager extends AbstractManager {
 
 		this.key = key;
 
-		this.timeoutMillis = Integer.parseInt(config.getProperty("timeout.ms", DEFAULT_TIMEOUT_MILLIS));
+		this.timeoutMillis = Integers.parseInt(config.getProperty("timeout.ms", DEFAULT_TIMEOUT_MILLIS));
 	}
 
 	@Override
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/AbstractRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/AbstractRolloverStrategy.java
index e623b93..d16f778 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/AbstractRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/AbstractRolloverStrategy.java
@@ -34,6 +34,7 @@ import org.apache.logging.log4j.core.appender.rolling.action.Action;
 import org.apache.logging.log4j.core.appender.rolling.action.CompositeAction;
 import org.apache.logging.log4j.core.lookup.StrSubstitutor;
 import org.apache.logging.log4j.core.pattern.NotANumber;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.status.StatusLogger;
 
 /**
@@ -140,7 +141,7 @@ public abstract class AbstractRolloverStrategy implements RolloverStrategy {
                 final Matcher matcher = pattern.matcher(entry.toFile().getName());
                 if (matcher.matches() && !entry.equals(current)) {
                     try {
-                        final Integer index = Integer.parseInt(matcher.group(1));
+                        final Integer index = Integers.parseInt(matcher.group(1));
                         eligibleFiles.put(index, entry);
                     } catch (NumberFormatException ex) {
                         LOGGER.debug("Ignoring file {} which matches pattern but the index is invalid.",
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
index ee61cf2..d12af4a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
@@ -126,7 +126,7 @@ public class DefaultRolloverStrategy extends AbstractRolloverStrategy {
                 useMax = fileIndex == null ? true : fileIndex.equalsIgnoreCase("max");
                 minIndex = MIN_WINDOW_SIZE;
                 if (min != null) {
-                    minIndex = Integer.parseInt(min.trim());
+                    minIndex = Integers.parseInt(min);
                     if (minIndex < 1) {
                         LOGGER.error("Minimum window size too small. Limited to " + MIN_WINDOW_SIZE);
                         minIndex = MIN_WINDOW_SIZE;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
index 8e8dca8..ab13a33 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DirectWriteRolloverStrategy.java
@@ -87,7 +87,7 @@ public class DirectWriteRolloverStrategy extends AbstractRolloverStrategy implem
         public DirectWriteRolloverStrategy build() {
             int maxIndex = Integer.MAX_VALUE;
             if (maxFiles != null) {
-                maxIndex = Integer.parseInt(maxFiles);
+                maxIndex = Integers.parseInt(maxFiles);
                 if (maxIndex < 0) {
                     maxIndex = Integer.MAX_VALUE;
                 } else if (maxIndex < 2) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
index e344005..16a2354 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
@@ -106,7 +106,7 @@ final class DisruptorUtil {
         final String userPreferredRBSize = PropertiesUtil.getProperties().getStringProperty(propertyName,
                 String.valueOf(ringBufferSize));
         try {
-            int size = Integer.parseInt(userPreferredRBSize);
+            int size = Integers.parseInt(userPreferredRBSize);
             if (size < RINGBUFFER_MIN_SIZE) {
                 size = RINGBUFFER_MIN_SIZE;
                 LOGGER.warn("Invalid RingBufferSize {}, using minimum size {}.", userPreferredRBSize,
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
index 32e15e8..685f54d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
@@ -20,6 +20,7 @@ package org.apache.logging.log4j.core.async;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.PropertiesUtil;
@@ -73,7 +74,7 @@ public enum ThreadNameCachingStrategy { // LOG4J2-467
                 Pattern javaVersionPattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)_(\\d+)");
                 Matcher m = javaVersionPattern.matcher(System.getProperty("java.version"));
                 if (m.matches()) {
-                    return Integer.parseInt(m.group(3)) == 0 && Integer.parseInt(m.group(4)) < 102;
+                    return Integers.parseInt(m.group(3)) == 0 && Integers.parseInt(m.group(4)) < 102;
                 }
                 return true;
             } catch (Exception e) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
index 766d2ab..6b8c7a3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
@@ -60,6 +60,7 @@ import org.apache.logging.log4j.core.config.builder.api.PropertyComponentBuilder
 import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ScriptComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Throwables;
 
 /**
@@ -561,7 +562,7 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement
 
     @Override
     public ConfigurationBuilder<T> setMonitorInterval(final String intervalSeconds) {
-        monitorInterval = Integer.parseInt(intervalSeconds);
+        monitorInterval = Integers.parseInt(intervalSeconds);
         return this;
     }
 
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 50e2a54..6f39e44 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
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.config.Node;
 import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
 import org.apache.logging.log4j.core.config.plugins.util.PluginType;
 import org.apache.logging.log4j.core.filter.CompositeFilter;
+import org.apache.logging.log4j.core.util.Integers;
 
 /**
  * The default merge strategy for composite configurations.
@@ -86,8 +87,8 @@ public class DefaultMergeStrategy implements MergeStrategy {
                                 targetAttribute.setValue(attribute.getValue());
                             }
                     } else if (attribute.getKey().equalsIgnoreCase("monitorInterval")) {
-                        final int sourceInterval = Integer.parseInt(attribute.getValue());
-                        final int targetInterval = Integer.parseInt(targetAttribute.getValue());
+                        final int sourceInterval = Integers.parseInt(attribute.getValue());
+                        final int targetInterval = Integers.parseInt(targetAttribute.getValue());
                         if (targetInterval == 0 || sourceInterval < targetInterval) {
                             targetAttribute.setValue(attribute.getValue());
                         }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
index 3e9dd9c..defa730 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
@@ -26,9 +26,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.AbstractConfiguration;
 import org.apache.logging.log4j.core.config.Configuration;
@@ -39,8 +36,13 @@ import org.apache.logging.log4j.core.config.Reconfigurable;
 import org.apache.logging.log4j.core.config.plugins.util.PluginType;
 import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
 import org.apache.logging.log4j.core.config.status.StatusConfiguration;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Patterns;
 
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 /**
  * Creates a Node hierarchy from a JSON file.
  */
@@ -88,7 +90,7 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
                 } else if ("name".equalsIgnoreCase(key)) {
                     setName(value);
                 } else if ("monitorInterval".equalsIgnoreCase(key)) {
-                    monitorIntervalSeconds = Integer.parseInt(value);
+                    monitorIntervalSeconds = Integers.parseInt(value);
                 } else if ("advertiser".equalsIgnoreCase(key)) {
                     createAdvertiser(value, configSource, buffer, "application/json");
                 }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
index 6564a29..436eefa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -17,7 +17,6 @@
 
 package org.apache.logging.log4j.core.config.properties;
 
-import java.util.Arrays;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
@@ -43,6 +42,7 @@ import org.apache.logging.log4j.core.config.builder.api.ScriptComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder;
 import org.apache.logging.log4j.core.filter.AbstractFilter.AbstractFilterBuilder;
 import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
 
@@ -124,7 +124,7 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
         final Properties levelProps = PropertiesUtil.extractSubset(rootProperties, "customLevel");
         if (levelProps.size() > 0) {
             for (final String key : levelProps.stringPropertyNames()) {
-                builder.add(builder.newCustomLevel(key, Integer.parseInt(levelProps.getProperty(key))));
+                builder.add(builder.newCustomLevel(key, Integers.parseInt(levelProps.getProperty(key))));
             }
         }
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
index 939c36c..649f013 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -43,6 +44,7 @@ import org.apache.logging.log4j.core.config.plugins.util.PluginType;
 import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil;
 import org.apache.logging.log4j.core.config.status.StatusConfiguration;
 import org.apache.logging.log4j.core.util.Closer;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.core.util.Throwables;
@@ -130,7 +132,7 @@ public class XmlConfiguration extends AbstractConfiguration implements Reconfigu
                 } else if ("schema".equalsIgnoreCase(key)) {
                     schemaResource = value;
                 } else if ("monitorInterval".equalsIgnoreCase(key)) {
-                    monitorIntervalSeconds = Integer.parseInt(value);
+                    monitorIntervalSeconds = Integers.parseInt(value);
                 } else if ("advertiser".equalsIgnoreCase(key)) {
                     createAdvertiser(value, configSource, buffer, "text/xml");
                 }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java
index aeb4535..32f7cee 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableFormatOptions.java
@@ -23,6 +23,7 @@ import java.util.Scanner;
 import org.apache.logging.log4j.core.pattern.JAnsiTextRenderer;
 import org.apache.logging.log4j.core.pattern.PlainTextRenderer;
 import org.apache.logging.log4j.core.pattern.TextRenderer;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.status.StatusLogger;
@@ -294,7 +295,7 @@ public final class ThrowableFormatOptions {
                 } else if (option.startsWith("suffix(") && option.endsWith(")")){
                     suffix = option.substring("suffix(".length(), option.length() - 1);
                 } else if (!option.equalsIgnoreCase(FULL)) {
-                    lines = Integer.parseInt(option);
+                    lines = Integers.parseInt(option);
                 }
             }
         }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java
index 936ace1..aa0890c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Log4jStackTraceElementDeserializer.java
@@ -18,6 +18,8 @@ package org.apache.logging.log4j.core.jackson;
 
 import java.io.IOException;
 
+import org.apache.logging.log4j.core.util.Integers;
+
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonToken;
@@ -62,7 +64,7 @@ public final class Log4jStackTraceElementDeserializer extends StdScalarDeseriali
                     } else {
                         // An XML number always comes in a string since there is no syntax help as with JSON.
                         try {
-                            lineNumber = Integer.parseInt(jp.getText().trim());
+                            lineNumber = Integers.parseInt(jp.getText());
                         } catch (final NumberFormatException e) {
                             throw JsonMappingException.from(jp, "Non-numeric token (" + t + ") for property 'line'", e);
                         }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
index b01dc5e..323e3bb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LoggerFields.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.message.StructuredDataId;
 
@@ -88,7 +89,7 @@ public final class LoggerFields {
         if (enterpriseId == null || sdId == null) {
             return null;
         }
-        final int eId = Integer.parseInt(enterpriseId);
+        final int eId = Integers.parseInt(enterpriseId);
         return new StructuredDataId(sdId, eId, null, null);
     }
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
index 88dca4f..9a7da16 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 
@@ -73,7 +74,7 @@ public class LevelPatternConverter extends LogEventPatternConverter {
             final String key = pair[0].trim();
             final String value = pair[1].trim();
             if (OPTION_LENGTH.equalsIgnoreCase(key)) {
-                length = Integer.parseInt(value);
+                length = Integers.parseInt(value);
             } else if (OPTION_LOWER.equalsIgnoreCase(key)) {
                 lowerCase = Boolean.parseBoolean(value);
             } else {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
index 318e3ff..d6f4e4d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 
 
@@ -78,7 +79,7 @@ public abstract class NameAbbreviator {
             //  if all blanks and digits
             //
             if (i == number.length()) {
-                return new MaxElementAbbreviator(Integer.parseInt(number),
+                return new MaxElementAbbreviator(Integers.parseInt(number),
                         isNegativeNumber? MaxElementAbbreviator.Strategy.DROP : MaxElementAbbreviator.Strategy.RETAIN);
             }
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java
index df3179b..f4298d3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.Strings;
 
@@ -55,7 +56,7 @@ public final class RepeatPatternConverter extends LogEventPatternConverter {
         int count = 0;
         String result = options[0];
         try {
-            count = Integer.parseInt(options[1].trim());
+            count = Integers.parseInt(options[1]);
             result = Strings.repeat(options[0], count);
         } catch (Exception ex) {
             LOGGER.error("The repeat count is not an integer: {}", options[1].trim());
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/Generate.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/Generate.java
index 2bf35b4..d76dfd8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/Generate.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/Generate.java
@@ -22,6 +22,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.logging.log4j.core.util.Integers;
+
 /**
  * Generates source code for custom or extended logger wrappers.
  * <p>
@@ -1039,7 +1041,7 @@ public final class Generate {
         LevelInfo(final String description) {
             final String[] parts = description.split("=");
             name = parts[0];
-            intLevel = Integer.parseInt(parts[1]);
+            intLevel = Integers.parseInt(parts[1]);
         }
 
         public static List<LevelInfo> parse(final List<String> values, final Class<?> generator) {
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 724ce47..d6ced4f 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
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.core.tools.picocli;
 
+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 java.io.File;
 import java.io.PrintStream;
 import java.lang.annotation.ElementType;
@@ -64,14 +69,11 @@ import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.regex.Pattern;
 
+import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help;
 import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.IStyle;
 import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.Style;
 import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.Text;
-
-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 org.apache.logging.log4j.core.util.Integers;
 
 /**
  * <p>
@@ -1752,7 +1754,7 @@ public class CommandLine {
         }
         private static int parseInt(final String str, final int defaultValue) {
             try {
-                return Integer.parseInt(str);
+                return Integers.parseInt(str);
             } catch (final Exception ex) {
                 return defaultValue;
             }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
index 1032f98..f8d0804 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
@@ -549,7 +549,7 @@ public final class CronExpression {
                     case '#':
                         try {
                             i += 4;
-                            nthdayOfWeek = Integer.parseInt(s.substring(i));
+                            nthdayOfWeek = Integers.parseInt(s.substring(i));
                             if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
                                 throw new Exception();
                             }
@@ -746,7 +746,7 @@ public final class CronExpression {
             }
             i++;
             try {
-                nthdayOfWeek = Integer.parseInt(s.substring(i));
+                nthdayOfWeek = Integers.parseInt(s.substring(i));
                 if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {
                     throw new Exception();
                 }
@@ -1139,14 +1139,14 @@ public final class CronExpression {
         final ValueSet val = new ValueSet();
 
         val.pos = (i < s.length()) ? i : i + 1;
-        val.value = Integer.parseInt(s1.toString());
+        val.value = Integers.parseInt(s1.toString());
         return val;
     }
 
     protected int getNumericValue(final String s, final int i) {
         final int endOfVal = findNextWhiteSpace(i, s);
         final String val = s.substring(i, endOfVal);
-        return Integer.parseInt(val);
+        return Integers.parseInt(val);
     }
 
     protected int getMonthNumber(final String s) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Integers.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Integers.java
index 65f3750..1d4703b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Integers.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Integers.java
@@ -30,6 +30,9 @@ public final class Integers {
 
     /**
      * Parses the string argument as a signed decimal integer.
+     * <p>
+     * The input may be surrounded by whitespace.
+     * </p>
      *
      * @param s a {@code String} containing the {@code int} representation to parse, may be {@code null} or {@code ""}
      * @param defaultValue the return value, use {@code defaultValue} if {@code s} is {@code null} or {@code ""}
@@ -37,7 +40,7 @@ public final class Integers {
      * @throws NumberFormatException if the string does not contain a parsable integer.
      */
     public static int parseInt(final String s, final int defaultValue) {
-        return Strings.isEmpty(s) ? defaultValue : Integer.parseInt(s);
+        return Strings.isEmpty(s) ? defaultValue : Integer.parseInt(s.trim());
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java
index bd31fd3..a181ccb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java
@@ -148,9 +148,9 @@ public final class OptionConverter {
      */
     public static int toInt(final String value, final int defaultValue) {
         if (value != null) {
-            final String s = value.trim();
+            final String s = value;
             try {
-                return Integer.parseInt(s);
+                return Integers.parseInt(s);
             } catch (final NumberFormatException e) {
                 LOGGER.error("[{}] is not in proper int form.", s, e);
             }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/datetime/FastDateParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/datetime/FastDateParser.java
index 6dcd9a7..7646af2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/datetime/FastDateParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/datetime/FastDateParser.java
@@ -39,6 +39,8 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.logging.log4j.core.util.Integers;
+
 /**
  * <p>FastDateParser is a fast and thread-safe version of
  * {@link java.text.SimpleDateFormat}.</p>
@@ -775,7 +777,7 @@ public class FastDateParser implements DateParser, Serializable {
                 return false;
             }
 
-            final int value = Integer.parseInt(source.substring(pos.getIndex(), idx));
+            final int value = Integers.parseInt(source.substring(pos.getIndex(), idx));
             pos.setIndex(idx);
 
             calendar.set(field, modify(parser, value));
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index 4ff6754..f207f6b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -40,6 +40,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Throwables;
 import org.apache.logging.log4j.junit.CleanUpFiles;
 import org.apache.logging.log4j.message.SimpleMessage;
@@ -323,7 +324,7 @@ public class FileAppenderTest {
             }
             final String id = args[0];
 
-            final int count = Integer.parseInt(args[1]);
+            final int count = Integers.parseInt(args[1]);
 
             if (count <= 0) {
                 System.out.println("Invalid count value: " + args[1]);
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDeleteScriptTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDeleteScriptTest.java
index b3f14ba..3547483 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDeleteScriptTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDeleteScriptTest.java
@@ -22,6 +22,7 @@ import java.io.File;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.junit.LoggerContextRule;
 import org.junit.BeforeClass;
 import org.junit.Rule;
@@ -68,7 +69,7 @@ public class RollingAppenderDeleteScriptTest {
             assertTrue(file.getName() + " starts with 'test-'", file.getName().startsWith("test-"));
             assertTrue(file.getName() + " ends with '.log'", file.getName().endsWith(".log"));
             final String strIndex = file.getName().substring(5, file.getName().indexOf('.'));
-            final int index = Integer.parseInt(strIndex);
+            final int index = Integers.parseInt(strIndex);
             assertTrue(file + " should have odd index", index % 2 == 1);
         }
     }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTestDriver.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTestDriver.java
index e9934fc..10ed108 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTestDriver.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/PerfTestDriver.java
@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
+import org.apache.logging.log4j.core.util.Integers;
 
 /**
  * Runs a sequence of performance tests.
@@ -112,7 +113,7 @@ public class PerfTestDriver {
 
         private int getUserSpecifiedRingBufferSize() {
             try {
-                return Integer.parseInt(System.getProperty("RingBufferSize", "-1"));
+                return Integers.parseInt(System.getProperty("RingBufferSize", "-1"));
             } catch (final Exception ignored) {
                 return -1;
             }
@@ -170,7 +171,7 @@ public class PerfTestDriver {
                     average += Long.parseLong(parts[i++].split("=")[1]);
                     pct99 += Long.parseLong(parts[i++].split("=")[1]);
                     pct99_99 += Long.parseLong(parts[i++].split("=")[1]);
-                    count += Integer.parseInt(parts[i].split("=")[1]);
+                    count += Integers.parseInt(parts[i].split("=")[1]);
                 } else {
                     throughputRowCount++;
                     final String number = line.substring(0, line.indexOf(' '));
@@ -288,7 +289,7 @@ public class PerfTestDriver {
     private static void runPerfTests(final String[] args, final List<Setup> tests) throws IOException,
             InterruptedException, FileNotFoundException {
         final String java = args.length > 0 ? args[0] : "java";
-        final int repeat = args.length > 1 ? Integer.parseInt(args[1]) : 5;
+        final int repeat = args.length > 1 ? Integers.parseInt(args[1]) : 5;
         int x = 0;
         for (final Setup setup : tests) {
             System.out.print(setup.description());
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java
index 93f0f2e..5cc4b17 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java
@@ -30,6 +30,7 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.async.DefaultAsyncQueueFullPolicy;
 import org.apache.logging.log4j.core.async.EventRoute;
 import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Loader;
 
 /**
@@ -100,7 +101,7 @@ public class ResponseTimeTest {
                     "and logger library (Log4j1, Log4j2, Logback, JUL)");
             return;
         }
-        final int threadCount = Integer.parseInt(args[0]);
+        final int threadCount = Integers.parseInt(args[0]);
         final double loadMessagesPerSec = Double.parseDouble(args[1]);
         final String loggerLib = args.length > 2 ? args[2] : "Log4j2";
 
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Rfc5424LayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Rfc5424LayoutTest.java
index 9dece77..115c152 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Rfc5424LayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/Rfc5424LayoutTest.java
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.core.layout;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -30,6 +35,7 @@ import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.net.Facility;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.junit.UsingAnyThreadContext;
 import org.apache.logging.log4j.message.StructuredDataCollectionMessage;
@@ -42,8 +48,6 @@ import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.*;
-
 @UsingAnyThreadContext
 public class Rfc5424LayoutTest {
     LoggerContext ctx = LoggerContext.getContext();
@@ -137,7 +141,7 @@ public class Rfc5424LayoutTest {
                 final int firstSpacePosition = frame.indexOf(' ');
                 final String messageLength = frame.substring(0, firstSpacePosition);
                 try {
-                    length = Integer.parseInt(messageLength);
+                    length = Integers.parseInt(messageLength);
                     // the ListAppender removes the ending newline, so we expect one less size
                     assertEquals(frameLength, messageLength.length() + length);
                 }
@@ -215,7 +219,7 @@ public class Rfc5424LayoutTest {
                 final int firstSpacePosition = frame.indexOf(' ');
                 final String messageLength = frame.substring(0, firstSpacePosition);
                 try {
-                    length = Integer.parseInt(messageLength);
+                    length = Integers.parseInt(messageLength);
                     // the ListAppender removes the ending newline, so we expect one less size
                     assertEquals(frameLength, messageLength.length() + length);
                 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReader.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReader.java
index 8ea3142..eeacdae 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReader.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/ssl/TlsSyslogInputStreamReader.java
@@ -22,6 +22,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
 
+import org.apache.logging.log4j.core.util.Integers;
+
 public class TlsSyslogInputStreamReader extends TlsSyslogInputStreamReaderBase {
     private static final char SPACE = ' ';
 
@@ -86,6 +88,6 @@ public class TlsSyslogInputStreamReader extends TlsSyslogInputStreamReaderBase {
 
     private void calculateNextMessageLength() {
         final byte[] length = Arrays.copyOfRange(lengthBuffer, 0, position);
-        nextMessageLength = Integer.parseInt(new String(length));
+        nextMessageLength = Integers.parseInt(new String(length));
     }
 }
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java
index cc52994..1755898 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ThrowablePatternConverterTest.java
@@ -16,15 +16,18 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.*;
-
 public class ThrowablePatternConverterTest {
 
     private final static class LocalizedException extends Exception {
@@ -139,7 +142,7 @@ public class ThrowablePatternConverterTest {
         final StringBuilder sb = new StringBuilder();
         converter.format(event, sb);
         final String result = sb.toString();
-        assertEquals(Integer.parseInt(result), expectedLineNumber, "The line numbers should be same");
+        assertEquals(Integers.parseInt(result), expectedLineNumber, "The line numbers should be same");
     }
 
     @Test
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
index 2e1cda1..e9f7d75 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
@@ -45,6 +45,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.test.AvailablePortFinder;
@@ -383,7 +384,7 @@ public class FlumeAppenderTest {
     @Test
     public void testNotConnected() throws Exception {
         eventSource.stop();
-        final String altPort = Integer.toString(Integer.parseInt(testPort) + 1);
+        final String altPort = Integer.toString(Integers.parseInt(testPort) + 1);
         final Agent[] agents = new Agent[] {
                 Agent.createAgent("localhost", testPort),
                 Agent.createAgent("localhost", altPort) };
@@ -431,7 +432,7 @@ public class FlumeAppenderTest {
 
     @Test
     public void testReconnect() throws Exception {
-        final String altPort = Integer.toString(Integer.parseInt(testPort) + 1);
+        final String altPort = Integer.toString(Integers.parseInt(testPort) + 1);
         final Agent[] agents = new Agent[] {
                 Agent.createAgent("localhost", testPort),
                 Agent.createAgent("localhost", altPort) };
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
index 80582da..cf23413 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
@@ -52,6 +52,7 @@ import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.test.AvailablePortFinder;
@@ -156,7 +157,7 @@ public class FlumePersistentAppenderTest {
             Assert.assertNotNull("Received " + i + " events. Event " + (i + 1) + " is null", event);
             final String value = event.getHeaders().get("counter");
             Assert.assertNotNull("Missing 'counter' in map " + event.getHeaders() + ", i = " + i, value);
-            final int counter = Integer.parseInt(value);
+            final int counter = Integers.parseInt(value);
             if (fields[counter]) {
                 Assert.fail("Duplicate event");
             } else {
@@ -184,7 +185,7 @@ public class FlumePersistentAppenderTest {
             Assert.assertNotNull("Received " + i + " events. Event " + (i + 1) + " is null", event);
             final String value = event.getHeaders().get("counter");
             Assert.assertNotNull("Missing counter", value);
-            final int counter = Integer.parseInt(value);
+            final int counter = Integers.parseInt(value);
             if (fields[counter]) {
                 Assert.fail("Duplicate event");
             } else {
@@ -336,7 +337,7 @@ public class FlumePersistentAppenderTest {
                     + (i + 1) + " is null", event);
                 final String value = event.getHeaders().get("counter");
                 Assert.assertNotNull("Missing counter", value);
-                final int counter = Integer.parseInt(value);
+                final int counter = Integers.parseInt(value);
                 if (fields[counter]) {
                     Assert.fail("Duplicate event");
                 } else {
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java
index fde75af..795ded0 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/InstantAttributeConverter.java
@@ -16,14 +16,15 @@
  */
 package org.apache.logging.log4j.core.appender.db.jpa.converter;
 
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+
 import org.apache.logging.log4j.core.time.Instant;
 import org.apache.logging.log4j.core.time.MutableInstant;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
-import javax.persistence.AttributeConverter;
-import javax.persistence.Converter;
-
 /**
  * A JPA 2.1 attribute converter for {@link Instant}s in {@link org.apache.logging.log4j.core.LogEvent}s. This
  * converter is capable of converting both to and from {@link String}s.
@@ -48,7 +49,7 @@ public class InstantAttributeConverter implements AttributeConverter<Instant, St
 
         final int pos = s.indexOf(",");
         final long epochSecond = Long.parseLong(s.substring(0, pos));
-        final int nanos = Integer.parseInt(s.substring(pos + 1, s.length()));
+        final int nanos = Integers.parseInt(s.substring(pos + 1, s.length()));
 
         final MutableInstant result = new MutableInstant();
         result.initFromEpochSecond(epochSecond, nanos);
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java
index b34822d..ed16100 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/converter/StackTraceElementAttributeConverter.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.appender.db.jpa.converter;
 import javax.persistence.AttributeConverter;
 import javax.persistence.Converter;
 
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -67,7 +68,7 @@ public class StackTraceElementAttributeConverter implements AttributeConverter<S
             if (colon > UNKNOWN_SOURCE) {
                 fileName = parenthesisContents.substring(0, colon);
                 try {
-                    lineNumber = Integer.parseInt(parenthesisContents.substring(colon + 1));
+                    lineNumber = Integers.parseInt(parenthesisContents.substring(colon + 1));
                 } catch (final NumberFormatException ignore) {
                     // we don't care
                 }
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java
index 22244fb..26921c2 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java
@@ -16,10 +16,6 @@
  */
 package org.apache.logging.log4j.layout.template.json.util;
 
-import org.apache.logging.log4j.core.util.Constants;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.jctools.queues.MpmcArrayQueue;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.util.Arrays;
@@ -29,6 +25,11 @@ import java.util.Queue;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.function.Supplier;
 
+import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.Integers;
+import org.apache.logging.log4j.util.LoaderUtil;
+import org.jctools.queues.MpmcArrayQueue;
+
 public final class RecyclerFactories {
 
     private RecyclerFactories() {}
@@ -126,7 +127,7 @@ public final class RecyclerFactories {
             capacity = defaultCapacity;
         } else {
             try {
-                capacity = Integer.parseInt(capacityValue.toString());
+                capacity = Integers.parseInt(capacityValue.toString());
             } catch (final NumberFormatException error) {
                 throw new IllegalArgumentException(
                         "failed reading capacity in queueing recycler " +
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/util/JsonReaderTest.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/util/JsonReaderTest.java
index 2c35e5a..b8126fc 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/util/JsonReaderTest.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/util/JsonReaderTest.java
@@ -16,15 +16,16 @@
  */
 package org.apache.logging.log4j.layout.template.json.util;
 
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
-
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 
+import org.apache.logging.log4j.core.util.Integers;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+
 class JsonReaderTest {
 
     @Test
@@ -152,7 +153,7 @@ class JsonReaderTest {
             for (final String signedInteger : new String[]{integer, '-' + integer}) {
                 final Object expectedToken =
                         signedInteger.length() < 3
-                                ? Integer.parseInt(signedInteger)
+                                ? Integers.parseInt(signedInteger)
                                 : new BigInteger(signedInteger);
                 test(signedInteger, expectedToken);
             }
diff --git a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDb3TestRule.java b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDb3TestRule.java
index 8066d6a..30ae761 100644
--- a/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDb3TestRule.java
+++ b/log4j-mongodb3/src/test/java/org/apache/logging/log4j/mongodb3/MongoDb3TestRule.java
@@ -20,6 +20,7 @@ package org.apache.logging.log4j.mongodb3;
 import java.util.Objects;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.logging.log4j.core.util.Integers;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
@@ -123,7 +124,7 @@ public class MongoDb3TestRule implements TestRule {
             public void evaluate() throws Throwable {
                 final String value = Objects.requireNonNull(System.getProperty(portSystemPropertyName),
                         "System property '" + portSystemPropertyName + "' is null");
-                final int port = Integer.parseInt(value);
+                final int port = Integers.parseInt(value);
                 mongodExecutable = starter.prepare(
                 // @formatter:off
                         MongodConfig.builder()
diff --git a/log4j-mongodb4/src/test/java/org/apache/logging/log4j/mongodb4/MongoDb4TestRule.java b/log4j-mongodb4/src/test/java/org/apache/logging/log4j/mongodb4/MongoDb4TestRule.java
index 28dbd7d..04db122 100644
--- a/log4j-mongodb4/src/test/java/org/apache/logging/log4j/mongodb4/MongoDb4TestRule.java
+++ b/log4j-mongodb4/src/test/java/org/apache/logging/log4j/mongodb4/MongoDb4TestRule.java
@@ -20,6 +20,7 @@ package org.apache.logging.log4j.mongodb4;
 import java.util.Objects;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.logging.log4j.core.util.Integers;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
@@ -121,7 +122,7 @@ public class MongoDb4TestRule implements TestRule {
             public void evaluate() throws Throwable {
                 final String value = Objects.requireNonNull(System.getProperty(portSystemPropertyName),
                         "System property '" + portSystemPropertyName + "' is null");
-                final int port = Integer.parseInt(value);
+                final int port = Integers.parseInt(value);
                 mongodExecutable = starter.prepare(
                 // @formatter:off
                         MongodConfig.builder()
diff --git a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/app/LoggingController.java b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/app/LoggingController.java
index 02d47b3..3bb015c 100755
--- a/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/app/LoggingController.java
+++ b/log4j-samples/log4j-samples-flume-common/src/main/java/org/apache/logging/log4j/samples/app/LoggingController.java
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.ThreadContext;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.samples.dto.AuditEvent;
 import org.apache.logging.log4j.samples.dto.RequestContext;
 import org.apache.logging.log4j.util.Strings;
@@ -60,7 +61,7 @@ public class LoggingController {
         int numThreads = 1;
         if (Strings.isNotEmpty(threadCount)) {
             try {
-                numThreads = Integer.parseInt(threadCount);
+                numThreads = Integers.parseInt(threadCount);
             } catch (final Exception ex) {
                 System.out.println("Invalid threadCount specified: " + threadCount);
             }
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 c71941a..401cbde 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
@@ -16,16 +16,17 @@
  */
 package org.apache.logging.log4j.spring.boot;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.lookup.StrLookup;
+import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.springframework.core.env.Environment;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /**
  * Lookup for Spring properties.
  */
@@ -60,7 +61,7 @@ public class SpringLookup extends SpringEnvironmentHolder implements StrLookup {
                         Matcher matcher = ACTIVE_PATTERN.matcher(key);
                         if (matcher.matches()) {
                             try {
-                                int index = Integer.parseInt(matcher.group(1));
+                                int index = Integers.parseInt(matcher.group(1));
                                 if (index < env.getActiveProfiles().length) {
                                     return env.getActiveProfiles()[index];
                                 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 14418d8..7e0aa0f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -229,6 +229,9 @@
       <action issue="LOG4J2-3392" dev="ggregory" type="fix" due-to="Gary Gregory">
         Possible NullPointerException in MongoDb4DocumentObject, MongoDbDocumentObject, DefaultNoSqlObject.
       </action>
+      <action dev="ggregory" type="fix" due-to="Gary Gregory">
+        Trim whitespace before parsing a String into an Integer.
+      </action>
       <!-- ADD -->
       <action issue="LOG4J2-3297" dev="rgoers" type="add">
         Limit loading of configuration via a url to https by default.