This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch 2.x in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 16cfa4120518029377424810496cababc2e4b574 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 | 10 +++++++++- 2 files changed, 22 insertions(+), 5 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 886a0a3b72..a4378900d3 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 @@ -25,7 +25,7 @@ import java.util.Date; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.message.Message; -import static org.apache.logging.log4j.util.Chars.*; +import static org.apache.logging.log4j.util.Chars.SPACE; /** * The Status data. @@ -142,4 +142,12 @@ public class StatusData implements Serializable { } return sb.toString(); } + + /** + * Used in tests + */ + @Override + public String toString() { + return getMessage().getFormattedMessage(); + } }
