You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2021/08/30 17:32:04 UTC

[logging-log4j2] branch master updated: LOG4J2-3153: PreciseClock doesn't impact DatePatternConverter performance

This is an automated email from the ASF dual-hosted git repository.

ckozak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new 5078db0  LOG4J2-3153: PreciseClock doesn't impact DatePatternConverter performance
5078db0 is described below

commit 5078db0e90e2862d2027457f0e95ccb8dbd221fb
Author: Carter Kozak <ck...@apache.org>
AuthorDate: Fri Aug 27 22:58:29 2021 -0400

    LOG4J2-3153: PreciseClock doesn't impact DatePatternConverter performance
    
    Cached values are not invalidated for microsecond changes when
    only milliseconds are needed. This is a relatively naive approach
    which specifically targets microsecond vs millisecond precision
    and has no additional impact on less precise date formats, however
    FixedDateFormat has a fixed set of supported formats, all of which
    use either 3, 6, or 9 second decimal points.
---
 .../logging/log4j/core/pattern/DatePatternConverter.java  |  2 +-
 .../log4j/core/time/internal/format/FixedDateFormat.java  | 15 +++++++++++++++
 src/changes/changes.xml                                   |  4 ++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
index 3946bf8..5492fc0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
@@ -104,7 +104,7 @@ public final class DatePatternConverter extends LogEventPatternConverter impleme
         void formatToBuffer(final Instant instant, final StringBuilder destination) {
             final long epochSecond = instant.getEpochSecond();
             final int nanoOfSecond = instant.getNanoOfSecond();
-            if (previousTime != epochSecond || nanos != nanoOfSecond) {
+            if (!fixedDateFormat.isEquivalent(previousTime, nanos, epochSecond, nanoOfSecond)) {
                 length = fixedDateFormat.formatInstant(instant, cachedBuffer, 0);
                 previousTime = epochSecond;
                 nanos = nanoOfSecond;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java
index cd224fb..3198c90 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java
@@ -719,4 +719,19 @@ public class FixedDateFormat {
     private int daylightSavingTime(final int hourOfDay) {
         return hourOfDay > 23 ? dstOffsets[23] : dstOffsets[hourOfDay];
     }
+
+    /**
+     * Returns {@code true} if the old and new date values will result in the same formatted output, {@code false}
+     * if results <i>may</i> differ.
+     */
+    public final boolean isEquivalent(long oldEpochSecond, int oldNanoOfSecond, long epochSecond, int nanoOfSecond) {
+        if (oldEpochSecond == epochSecond) {
+            if (secondFractionDigits <= 3) {
+                // Convert nanos to milliseconds for comparison if the format only requires milliseconds.
+                return (oldNanoOfSecond / 1000_000L) == (nanoOfSecond / 1000_000L);
+            }
+            return oldNanoOfSecond == nanoOfSecond;
+        }
+        return false;
+    }
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2fa4c68..8e48c4a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -234,6 +234,10 @@
 	based on performance improvements in modern Java releases.
       </action>
       <!-- FIXES -->
+      <action issue="LOG4J2-3153" dev="ckozak" type="fix">
+        DatePatternConverter performance is not impacted by microsecond-precision clocks when such precision isn't
+        required.
+      </action>
       <action issue="LOG4J2-2808" dev="ckozak" type="fix" due-to="Asapha Halifa">
         LoggerContext skips resolving localhost when hostName is configured.
       </action>