CachedUntil - Reuse _cachedValueExpires for the period end

This commit is contained in:
dualfroz committed 2026-10-03 19:05:20 +02:00
1 parent ce13d92371
commit 97f1f71bbe
1 file changed
+15 -12
@@ -89,7 +89,6 @@ namespace NLog.LayoutRenderers.Wrappers
private DateTime _cachedValueExpires; private DateTime _cachedValueExpires;
private TimeSpan? _cachedValueTimeout; private TimeSpan? _cachedValueTimeout;
private DateTime _cachedValuePeriodStart; private DateTime _cachedValuePeriodStart;
private DateTime _cachedValuePeriodEnd;
private CachedUntilOption _cachedUntil; private CachedUntilOption _cachedUntil;
/// <summary> /// <summary>
@@ -184,10 +183,7 @@ namespace NLog.LayoutRenderers.Wrappers
{ {
_cachedValue = cachedValue = base.RenderInner(logEvent); _cachedValue = cachedValue = base.RenderInner(logEvent);
_renderedCacheKey = newCacheKey; _renderedCacheKey = newCacheKey;
if (_cachedValueTimeout.HasValue) _cachedValueExpires = ResolveCachedValueExpires(logEvent.TimeStamp);
_cachedValueExpires = logEvent.TimeStamp + _cachedValueTimeout.Value;
if (_cachedUntil != CachedUntilOption.None)
UpdateCachedValuePeriod(logEvent.TimeStamp);
} }
} }
} }
@@ -205,21 +201,28 @@ namespace NLog.LayoutRenderers.Wrappers
if (_renderedCacheKey != newCacheKey) if (_renderedCacheKey != newCacheKey)
return null; return null;
if (_cachedValueTimeout.HasValue && logEvent.TimeStamp > _cachedValueExpires) if ((_cachedValueTimeout.HasValue || _cachedUntil != CachedUntilOption.None) && logEvent.TimeStamp > _cachedValueExpires)
return null; return null;
if (_cachedUntil != CachedUntilOption.None && (logEvent.TimeStamp < _cachedValuePeriodStart || logEvent.TimeStamp > _cachedValuePeriodEnd)) if (_cachedUntil != CachedUntilOption.None && logEvent.TimeStamp < _cachedValuePeriodStart)
return null; return null;
return _cachedValue; return _cachedValue;
} }
private void UpdateCachedValuePeriod(DateTime timeStamp) private DateTime ResolveCachedValueExpires(DateTime timeStamp)
{ {
var periodTicks = _cachedUntil == CachedUntilOption.DayChange ? TimeSpan.TicksPerDay : TimeSpan.TicksPerHour; var expires = _cachedValueTimeout.HasValue ? timeStamp + _cachedValueTimeout.Value : DateTime.MaxValue;
_cachedValuePeriodStart = new DateTime(timeStamp.Ticks - timeStamp.Ticks % periodTicks, timeStamp.Kind); if (_cachedUntil != CachedUntilOption.None)
// Inclusive end, so the last period ends at DateTime.MaxValue without overflow {
_cachedValuePeriodEnd = _cachedValuePeriodStart.AddTicks(periodTicks - 1); var periodTicks = _cachedUntil == CachedUntilOption.DayChange ? TimeSpan.TicksPerDay : TimeSpan.TicksPerHour;
_cachedValuePeriodStart = new DateTime(timeStamp.Ticks - timeStamp.Ticks % periodTicks, timeStamp.Kind);
// Inclusive end, so the last period ends at DateTime.MaxValue without overflow
var periodEnd = _cachedValuePeriodStart.AddTicks(periodTicks - 1);
if (periodEnd < expires)
expires = periodEnd;
}
return expires;
} }
string? IStringValueRenderer.GetFormattedString(LogEventInfo logEvent) => Cached ? RenderInner(logEvent) : null; string? IStringValueRenderer.GetFormattedString(LogEventInfo logEvent) => Cached ? RenderInner(logEvent) : null;