--- log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java.orig 2015-01-14 16:15:26.986141921 +0000 +++ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java 2015-01-14 16:16:08.850994955 +0000 @@ -47,7 +47,7 @@ private final M manager; - private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); + protected final ReadWriteLock rwLock = new ReentrantReadWriteLock(); private final Lock readLock = rwLock.readLock(); /** @@ -92,6 +92,10 @@ manager.release(); } + protected Lock getLock() { + return rwLock.readLock(); + } + /** * Actual writing occurs here. *

@@ -103,7 +107,7 @@ */ @Override public void append(final LogEvent event) { - readLock.lock(); + getLock().lock(); try { final byte[] bytes = getLayout().toByteArray(event); if (bytes.length > 0) { @@ -116,7 +120,7 @@ error("Unable to write to stream " + manager.getName() + " for appender " + getName()); throw ex; } finally { - readLock.unlock(); + getLock().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