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 f08d3bd5210f16b2a429709e2e5acf36070eb6de Author: Piotr P. Karwasz <[email protected]> AuthorDate: Wed Sep 6 13:14:51 2023 +0200 Improve concurrency of ListStatusListener ListStatusListener#getStatusData returns a stream that uses a copy of the data to prevent a ConcurrentModificationException. --- .../logging/log4j/test/junit/StatusLoggerExtension.java | 17 +++++++++++++---- .../org/apache/logging/log4j/status/StatusData.java | 8 ++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java index b301783e4f..0452d63bd8 100644 --- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java +++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java @@ -18,7 +18,6 @@ package org.apache.logging.log4j.test.junit; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -89,7 +88,7 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene private static class JUnitListStatusListener implements ListStatusListener { private final ExtensionContext context; - private final List<StatusData> statusData = Collections.synchronizedList(new ArrayList<StatusData>()); + private final ArrayList<StatusData> statusData = new ArrayList<>(); public JUnitListStatusListener(final ExtensionContext context) { this.context = context; @@ -98,7 +97,9 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene @Override public void log(final StatusData data) { if (context.equals(ExtensionContextAnchor.getContext())) { - statusData.add(data); + synchronized (statusData) { + statusData.add(data); + } } } @@ -114,8 +115,16 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene @Override public Stream<StatusData> getStatusData() { - return statusData.stream(); + synchronized (statusData) { + return ((List<StatusData>) statusData.clone()).stream(); + } } + @Override + public void clear() { + synchronized (statusData) { + statusData.clear(); + } + } } } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java index dc5abaf02a..e8c708e72b 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java @@ -139,4 +139,12 @@ public class StatusData { } return sb.toString(); } + + /** + * Used in tests + */ + @Override + public String toString() { + return getMessage().getFormattedMessage(); + } }
