--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java.orig 2015-01-13 21:38:15.521106298 +0000
+++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java 2015-01-13 21:39:29.798590605 +0000
@@ -48,8 +48,8 @@
private final M manager;
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
- private final Lock readLock = rwLock.readLock();
-
+ private final Lock writeLock = rwLock.writeLock();
+
/**
* Instantiate a WriterAppender and set the output destination to a
* new {@link java.io.OutputStreamWriter} initialized with os
@@ -103,7 +103,7 @@
*/
@Override
public void append(final LogEvent event) {
- readLock.lock();
+ writeLock.lock();
try {
final byte[] bytes = getLayout().toByteArray(event);
if (bytes.length > 0) {
@@ -116,7 +116,7 @@
error("Unable to write to stream " + manager.getName() + " for appender " + getName());
throw ex;
} finally {
- readLock.unlock();
+ writeLock.unlock();
}
}
}
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java.orig 2015-01-13 21:39:08.686168687 +0000
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java 2015-01-13 21:39:29.798590605 +0000
@@ -18,6 +18,7 @@
import java.io.IOException;
import java.net.SocketException;
+import java.util.ArrayList;
import org.apache.logging.log4j.core.net.Facility;
import org.apache.logging.log4j.core.net.mock.MockSyslogServerFactory;
@@ -78,6 +79,31 @@
root.removeAppender(appender);
appender.stop();
}
+
+ @Test
+ public void testUDPAppenderInParallel() throws Exception {
+ initUDPTestEnvironment("bsd");
+
+ ArrayList threads = new ArrayList();
+ for (int i = 0; i < 1000; i++) {
+ Thread thread = new Thread(new Runnable() {
+ public void run() {
+ sendLegacyBSDMessage("This is a test message");
+ }
+ });
+ threads.add(thread);
+ }
+ for (Thread thread : threads) {
+ thread.start();
+ }
+ for (Thread thread : threads) {
+ thread.join();
+ }
+ checkTheNumberOfSentAndReceivedMessages();
+
+ root.removeAppender(appender);
+ appender.stop();
+ }
@Test
public void testUDPStructuredAppender() throws Exception {
--- log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java.orig 2015-01-13 21:39:21.022415215 +0000
+++ log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTestBase.java 2015-01-13 21:39:29.802590684 +0000
@@ -17,6 +17,7 @@
package org.apache.logging.log4j.core.appender;
import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -45,7 +46,7 @@
protected MockSyslogServer syslogServer;
protected SyslogAppender appender;
protected Logger root = ctx.getLogger("SyslogAppenderTest");
- protected List sentMessages = new ArrayList();
+ protected List sentMessages = new CopyOnWriteArrayList();
protected boolean includeNewLine = true;
@BeforeClass