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:19:51 UTC
[logging-log4j2] branch release-2.x 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 release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/release-2.x by this push:
new 9ed470f LOG4J2-3028: Always clear the OutputStreamManager buffer on flush
9ed470f is described below
commit 9ed470fcef1da227d8a24f7bd81de4dd487775ab
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 | 27 ++++++++++++++++++++++
src/changes/changes.xml | 3 +++
3 files changed, 36 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 f581ade..c9fb397 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
@@ -278,10 +278,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 86d1990..ffcebfc 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,29 @@ 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());
+ }
}
\ No newline at end of file
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6808cf0..0ad7b0f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,9 @@
-->
<release version="2.14.1" date="2021-MM-DD" description="GA Release 2.14.1">
<!-- FIXES -->
+ <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.