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 78784cfa755..d0eb7cbb62e 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
@@ -224,4 +224,20 @@ void testRolloverOfDeletedFile() throws IOException {
}
assertEquals(testContent, new String(Files.readAllBytes(file.toPath()), StandardCharsets.US_ASCII));
}
+
+ @Test
+ @Issue("https://github.com/apache/logging-log4j2/issues/3068")
+ void testInitialTimeRounded() throws IOException {
+ assertEquals(1755031147000L, RollingFileManager.roundMillis(1755031147000L));
+ assertEquals(1755031147000L, RollingFileManager.roundMillis(1755031147123L));
+ assertEquals(1755031147000L, RollingFileManager.roundMillis(1755031147499L));
+ assertEquals(1755031148000L, RollingFileManager.roundMillis(1755031147500L));
+ assertEquals(1755031148000L, RollingFileManager.roundMillis(1755031147999L));
+ assertEquals(1755031148000L, RollingFileManager.roundMillis(1755031148000L));
+
+ final File file = File.createTempFile("testFile", "log");
+ file.deleteOnExit();
+
+ assertEquals(0, RollingFileManager.initialFileTime(file) % 1000);
+ }
}
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 b033f5785e0..97db00f785e 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
@@ -910,7 +910,7 @@ public RollingFileManager createManager(final String name, final FactoryData dat
}
}
- private static long initialFileTime(final File file) {
+ static long initialFileTime(final File file) {
final Path path = file.toPath();
if (Files.exists(path)) {
try {
@@ -918,15 +918,24 @@ private static long initialFileTime(final File file) {
final FileTime fileTime = attrs.creationTime();
if (fileTime.compareTo(EPOCH) > 0) {
LOGGER.debug("Returning file creation time for {}", file.getAbsolutePath());
- return fileTime.toMillis();
+
+ return roundMillis(fileTime.toMillis());
}
- LOGGER.info("Unable to obtain file creation time for " + file.getAbsolutePath());
+ LOGGER.info("Unable to obtain file creation time for {}", file.getAbsolutePath());
} catch (final Exception ex) {
- LOGGER.info("Unable to calculate file creation time for " + file.getAbsolutePath() + ": "
- + ex.getMessage());
+ LOGGER.info(
+ "Unable to calculate file creation time for {}: {}", file.getAbsolutePath(), ex.getMessage());
}
}
- return file.lastModified();
+
+ return roundMillis(file.lastModified());
+ }
+
+ /**
+ * @see Issue #3068
+ */
+ static long roundMillis(long millis) {
+ return Math.round(millis / 1000d) * 1000;
}
private static class EmptyQueue extends ArrayBlockingQueue {