in log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java [106:174]
public static boolean execute(final File source, final File destination, final boolean renameEmptyFiles) {
if (renameEmptyFiles || (source.length() > 0)) {
final File parent = destination.getParentFile();
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.
parent.mkdirs();
if (!parent.exists()) {
LOGGER.error("Unable to create directory {}", parent.getAbsolutePath());
return false;
}
}
try {
try {
return moveFile(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()));
} catch (final IOException exMove) {
LOGGER.debug("Unable to move file {} to {}: {} {} - will try to copy and delete",
source.getAbsolutePath(), destination.getAbsolutePath(), exMove.getClass().getName(),
exMove.getMessage());
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()));
result = true;
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 {
result = true;
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 {
source.delete();
} catch (final Exception exDelete) {
LOGGER.error("Unable to delete empty file {}: {} {}", source.getAbsolutePath(),
exDelete.getClass().getName(), exDelete.getMessage());
}
}
return false;
}