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>