LOG4J2-1343 do not synchronize on the appender Manager while converting the LogEvent to text: this may result in deadlocks
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/794af49a Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/794af49a Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/794af49a Branch: refs/heads/LOG4J2-1356 Commit: 794af49a6f1ec1970c605bca04a38251684ab262 Parents: acf8e34 Author: rpopma <[email protected]> Authored: Fri Apr 8 19:50:31 2016 +0900 Committer: rpopma <[email protected]> Committed: Fri Apr 8 19:50:31 2016 +0900 ---------------------------------------------------------------------- .../core/appender/AbstractOutputStreamAppender.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/794af49a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java index dcd0556..85faf43 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java @@ -122,14 +122,12 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager } protected void directEncodeEvent(final LogEvent event) { - synchronized (manager) { - getLayout().encode(event, manager.getByteBufferDestination()); - if (!manager.isBufferedIO()) { // buffering was not requested by the user - manager.flushBuffer(); // we're not allowed to leave anything in the buffer: drain buffer into manager - } - if (this.immediateFlush || event.isEndOfBatch()) { - manager.flush(); - } + getLayout().encode(event, manager.getByteBufferDestination()); + if (!manager.isBufferedIO()) { // buffering was not requested by the user + manager.flushBuffer(); // we're not allowed to leave anything in the buffer: drain buffer into manager + } + if (this.immediateFlush || event.isEndOfBatch()) { + manager.flush(); } }
