Repository: logging-log4j2 Updated Branches: refs/heads/master 730a1cc7c -> d5eaed8b4
LOG4J2-904 - If copy and delete fails in rename action then resort to truncating the source file after copying it. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d5eaed8b Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d5eaed8b Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d5eaed8b Branch: refs/heads/master Commit: d5eaed8b4b9ffc075e58e0ffcaad27212d34626e Parents: 730a1cc Author: Ralph Goers <rgo...@nextiva.com> Authored: Mon Jul 4 10:59:30 2016 -0700 Committer: Ralph Goers <rgo...@nextiva.com> Committed: Mon Jul 4 10:59:30 2016 -0700 ---------------------------------------------------------------------- .../rolling/action/FileRenameAction.java | 68 +++++++++++++++----- src/changes/changes.xml | 3 + 2 files changed, 54 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d5eaed8b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java index dc23555..023c869 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java @@ -17,8 +17,12 @@ package org.apache.logging.log4j.core.appender.rolling.action; import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; /** * File rename action. @@ -99,9 +103,9 @@ public class FileRenameAction extends AbstractAction { * @return true if successfully renamed. */ public static boolean execute(final File source, final File destination, final boolean renameEmptyFiles) { - if (renameEmptyFiles || source.length() > 0) { + if (renameEmptyFiles || (source.length() > 0)) { final File parent = destination.getParentFile(); - if (parent != null && !parent.exists()) { + if ((parent != null) && !parent.exists()) { // LOG4J2-679: ignore mkdirs() result: in multithreaded scenarios, // if one thread succeeds the other thread returns false // even though directories have been created. Check if dir exists instead. @@ -111,28 +115,58 @@ public class FileRenameAction extends AbstractAction { return false; } } - final Path sourcePath = source.toPath(); try { - Files.move(sourcePath, destination.toPath()); - return true; - } catch (final Exception ex) { - LOGGER.error("Unable to rename {} to {} due to {} - {}", source.toString(), destination.toString(), - ex.getClass().getSimpleName(), ex.getMessage()); try { - - Files.copy(sourcePath, destination.toPath()); - Files.delete(sourcePath); + Files.move(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()), + StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); + LOGGER.trace("Renamed file {} to {} with Files.move", source.getAbsolutePath(), + destination.getAbsolutePath()); return true; - } catch (final Exception iex) { - LOGGER.error("Unable to rename file {} to {} due to {} - {}", source.getAbsolutePath(), - destination.getAbsolutePath(), iex.getClass().getSimpleName(), iex.getMessage()); + } catch (final IOException exMove) { + LOGGER.error("Unable to move file {} to {}: {} {}", source.getAbsolutePath(), + destination.getAbsolutePath(), exMove.getClass().getName(), exMove.getMessage()); + final boolean result = source.renameTo(destination); + if (!result) { + try { + Files.copy(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()), + StandardCopyOption.REPLACE_EXISTING); + try { + Files.delete(Paths.get(source.getAbsolutePath())); + LOGGER.trace("Renamed file {} to {} using copy and delete", + source.getAbsolutePath(), destination.getAbsolutePath()); + } catch (final IOException exDelete) { + LOGGER.error("Unable to delete file {}: {} {}", source.getAbsolutePath(), + exDelete.getClass().getName(), exDelete.getMessage()); + try { + new PrintWriter(source.getAbsolutePath()).close(); + LOGGER.trace("Renamed file {} to {} with copy and truncation", + source.getAbsolutePath(), destination.getAbsolutePath()); + } catch (final IOException exOwerwrite) { + LOGGER.error("Unable to overwrite file {}: {} {}", + source.getAbsolutePath(), exOwerwrite.getClass().getName(), + exOwerwrite.getMessage()); + } + } + } catch (final IOException exCopy) { + LOGGER.error("Unable to copy file {} to {}: {} {}", source.getAbsolutePath(), + destination.getAbsolutePath(), exCopy.getClass().getName(), exCopy.getMessage()); + } + } else { + LOGGER.trace("Renamed file {} to {} with source.renameTo", + source.getAbsolutePath(), destination.getAbsolutePath()); + } + return result; } + } catch (final RuntimeException ex) { + LOGGER.error("Unable to rename file {} to {}: {} {}", source.getAbsolutePath(), + destination.getAbsolutePath(), ex.getClass().getName(), ex.getMessage()); } } else { try { - Files.delete(source.toPath()); - } catch (final Exception ex) { - LOGGER.error("Unable to delete empty file " + source.getAbsolutePath()); + source.delete(); + } catch (final Exception exDelete) { + LOGGER.error("Unable to delete empty file {}: {} {}", source.getAbsolutePath(), + exDelete.getClass().getName(), exDelete.getMessage()); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d5eaed8b/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 3641c0a..9970d34 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,9 @@ </properties> <body> <release version="2.6.2" date="2016-MM-DD" description="GA Release 2.6.2"> + <action issue="LOG4J2-904" dev="rgoers" due-to="Bernhard Mähr"> + If copy and delete fails in rename action then resort to truncating the source file after copying it. + </action> <action issue="LOG4J2-1250" dev="rgoers"> CronTriggeringPolicy was not properly setting the prevFileTime value for the PatternProcessor so file dates and times on rolled files were incorrect.