From f572a26237af521a62ec1c36579ce168e25ae865 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 19 Feb 2016 11:03:18 +0000 Subject: [PATCH] Use HostingNullLogScope when no logging --- .../Internal/HostingLoggerExtensions.cs | 75 ++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs index e296d331..a0dbae3f 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs @@ -14,10 +14,11 @@ namespace Microsoft.AspNetCore.Hosting.Internal internal static class HostingLoggerExtensions { private static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency; + private static readonly object _nullScope = new HostingNullLogScope(); public static IDisposable RequestScope(this ILogger logger, HttpContext httpContext) { - return logger.BeginScopeImpl(new HostingLogScope(httpContext)); + return logger.BeginScopeImpl(!logger.IsEnabled(LogLevel.Critical) ? _nullScope : new HostingLogScope(httpContext)); } public static void RequestStarting(this ILogger logger, HttpContext httpContext) @@ -306,6 +307,78 @@ IEnumerator IEnumerable.GetEnumerator() return GetEnumerator(); } } + + private class HostingNullLogScope : IReadOnlyList> + { + private readonly static IEnumerator> _nullEnumerator = new NullEnumerator(); + + public int Count + { + get + { + return 0; + } + } + + public KeyValuePair this[int index] + { + get + { + throw new IndexOutOfRangeException(nameof(index)); + } + } + + public HostingNullLogScope() + { + } + + public override string ToString() + { + return string.Empty; + } + + public IEnumerator> GetEnumerator() + { + return _nullEnumerator; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _nullEnumerator; + } + + private class NullEnumerator : IEnumerator> + { + public KeyValuePair Current + { + get + { + return new KeyValuePair(null, null); + } + } + + object IEnumerator.Current + { + get + { + return null; + } + } + + public void Dispose() + { + } + + public bool MoveNext() + { + return false; + } + + public void Reset() + { + } + } + } } }