--- 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