You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2021/03/01 15:22:04 UTC
[logging-log4j2] branch master updated: LOG4J2-3028: Always clear
the OutputStreamManager buffer on flush
This is an automated email from the ASF dual-hosted git repository.
ckozak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new 74a8389 LOG4J2-3028: Always clear the OutputStreamManager buffer on flush
74a8389 is described below
commit 74a83898652e9f822936b0f0649fbae3437b49ce
Author: jakubk <ja...@palantir.com>
AuthorDate: Thu Feb 25 15:59:28 2021 +0000
LOG4J2-3028: Always clear the OutputStreamManager buffer on flush
---
.../log4j/core/appender/OutputStreamManager.java | 9 +++++---
.../core/appender/OutputStreamManagerTest.java | 26 ++++++++++++++++++++++
src/changes/changes.xml | 3 +++
3 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
index 6686d99..ffac65a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
@@ -279,10 +279,13 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
*/
protected synchronized void flushBuffer(final ByteBuffer buf) {
((Buffer) buf).flip();
- if (buf.remaining() > 0) {
- writeToDestination(buf.array(), buf.arrayOffset() + buf.position(), buf.remaining());
+ try {
+ if (buf.remaining() > 0) {
+ writeToDestination(buf.array(), buf.arrayOffset() + buf.position(), buf.remaining());
+ }
+ } finally {
+ buf.clear();
}
- buf.clear();
}
/**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
index ef45d92..609a8ff 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
@@ -17,6 +17,8 @@
package org.apache.logging.log4j.core.appender;
+import java.io.IOException;
+import java.io.OutputStream;
import java.util.List;
import org.apache.logging.log4j.Level;
@@ -51,4 +53,28 @@ public class OutputStreamManagerTest {
data.getThrowable().toString());
}
+ @Test
+ public void testOutputStreamAppenderFlushClearsBufferOnException() {
+ IOException exception = new IOException();
+ final OutputStream throwingOutputStream = new OutputStream() {
+ @Override
+ public void write(int b) throws IOException {
+ throw exception;
+ }
+ };
+
+ final int bufferSize = 3;
+ OutputStreamManager outputStreamManager = new OutputStreamManager(throwingOutputStream, "test", null, false, bufferSize);
+
+ for (int i = 0; i < bufferSize - 1; i++) {
+ outputStreamManager.getByteBuffer().put((byte) 0);
+ }
+
+ assertEquals(outputStreamManager.getByteBuffer().remaining(), 1);
+
+ AppenderLoggingException appenderLoggingException = assertThrows(AppenderLoggingException.class, () -> outputStreamManager.flushBuffer(outputStreamManager.getByteBuffer()));
+ assertEquals(appenderLoggingException.getCause(), exception);
+
+ assertEquals(outputStreamManager.getByteBuffer().limit(), outputStreamManager.getByteBuffer().capacity());
+ }
}
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e99ffea..0f19b32 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -227,6 +227,9 @@
</action>
</release>
<release version="2.14.1" date="2020-MM-DD" description="GA Release 2.14.1">
+ <action issue="LOG4J2-3028" dev="ckozak" type="fix" due-to="Jakub Kozlowski">
+ OutputStreamManager.flushBuffer always resets the buffer, previously the buffer was not reset after an exception.
+ </action>
<action issue="LOG4J2-2981" dev="rgoers" type="fix">
OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy
unless minSize was set to 0.