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 {