This is an automated email from the ASF dual-hosted git repository. mattsicker pushed a commit to branch fix/3.x/port-3226 in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 2e5a9612b3b4ab66d3229b9cc7f1d6c99b5fb606 Author: king-tyler <8304181+king-ty...@users.noreply.github.com> AuthorDate: Fri Nov 22 01:45:19 2024 -0600 Reopen log file when rollover is unsuccessful (#3226) Fixes `RollingFileManager` to reopen the log file when the rollover was unsuccessful --- .../appender/rolling/RollingFileManagerTest.java | 42 +++++++++++++++++++++- .../core/appender/rolling/RollingFileManager.java | 22 ++++++------ ...ix_RollingFileManager_unsuccessful_rollover.xml | 8 +++++ 3 files changed, 60 insertions(+), 12 deletions(-) diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerTest.java index 79d8d82e64..bbc2db09d5 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManagerTest.java @@ -17,13 +17,17 @@ package org.apache.logging.log4j.core.appender.rolling; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import org.apache.logging.log4j.core.LoggerContext; @@ -185,4 +189,40 @@ public class RollingFileManagerTest { manager.close(); } } + + @Test + @Issue("https://github.com/apache/logging-log4j2/issues/2592") + public void testRolloverOfDeletedFile() throws IOException { + final File file = File.createTempFile("testRolloverOfDeletedFile", "log"); + file.deleteOnExit(); + final String testContent = "Test"; + try (final OutputStream os = + new ByteArrayOutputStream(); // use a dummy OutputStream so that the real file can be deleted + final RollingFileManager manager = new RollingFileManager( + null, + null, + file.getAbsolutePath(), + "testRolloverOfDeletedFile.log.%d{yyyy-MM-dd}", + os, + true, + false, + 0, + System.currentTimeMillis(), + OnStartupTriggeringPolicy.createPolicy(1), + DefaultRolloverStrategy.newBuilder().build(), + file.getName(), + null, + null, + null, + null, + false, + ByteBuffer.allocate(256))) { + assertTrue(file.delete()); + manager.setRenameEmptyFiles(true); + manager.rollover(); + assertEquals(file.getAbsolutePath(), manager.getFileName()); + manager.writeBytes(testContent.getBytes(StandardCharsets.US_ASCII), 0, testContent.length()); + } + assertEquals(testContent, Files.readString(file.toPath(), StandardCharsets.US_ASCII)); + } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java index 28da0d0c92..b8ddb53da3 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java @@ -516,43 +516,43 @@ public class RollingFileManager extends FileManager { private boolean rollover(final RolloverStrategy strategy) { - boolean releaseRequired = false; + boolean outputStreamClosed = false; try { // Block until the asynchronous operation is completed. semaphore.acquire(); - releaseRequired = true; } catch (final InterruptedException e) { logError("Thread interrupted while attempting to check rollover", e); - return false; + return outputStreamClosed; } - boolean success = true; + boolean asyncActionStarted = true; try { final RolloverDescription descriptor = strategy.rollover(this); if (descriptor != null) { writeFooter(); closeOutputStream(); + outputStreamClosed = true; + boolean syncActionSuccess = true; if (descriptor.getSynchronous() != null) { LOGGER.debug("RollingFileManager executing synchronous {}", descriptor.getSynchronous()); try { - success = descriptor.getSynchronous().execute(); + syncActionSuccess = descriptor.getSynchronous().execute(); } catch (final Exception ex) { - success = false; + syncActionSuccess = false; logError("Caught error in synchronous task", ex); } } - if (success && descriptor.getAsynchronous() != null) { + if (syncActionSuccess && descriptor.getAsynchronous() != null) { LOGGER.debug("RollingFileManager executing async {}", descriptor.getAsynchronous()); asyncExecutor.execute(new AsyncAction(descriptor.getAsynchronous(), this)); - releaseRequired = false; + asyncActionStarted = false; } - return success; } - return false; + return outputStreamClosed; } finally { - if (releaseRequired) { + if (asyncActionStarted) { semaphore.release(); } } diff --git a/src/changelog/.3.x.x/2592_fix_RollingFileManager_unsuccessful_rollover.xml b/src/changelog/.3.x.x/2592_fix_RollingFileManager_unsuccessful_rollover.xml new file mode 100644 index 0000000000..fb04758c25 --- /dev/null +++ b/src/changelog/.3.x.x/2592_fix_RollingFileManager_unsuccessful_rollover.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="https://logging.apache.org/xml/ns" + xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-changelog-0.xsd" + type="fixed"> + <issue id="2592" link="https://github.com/apache/logging-log4j2/issues/2592"/> + <description format="asciidoc">Fix `RollingFileManager` to reopen the log file when the rollover was unsuccessful</description> +</entry> \ No newline at end of file