in log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/FileRenameAction.java [110:205]
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 {
return source.delete();
} catch (final Exception exDelete) {
LOGGER.error(
"Unable to delete empty file {}: {} {}",
source.getAbsolutePath(),
exDelete.getClass().getName(),
exDelete.getMessage());
}
}
return false;
}