From 2676a4e8893fb0222885212a363c9648145048a2 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 26 Sep 2015 11:42:21 +0100 Subject: [PATCH 1/2] Reduce logging allocs if no loggers --- src/Microsoft.Extensions.Logging/Logger.cs | 43 ++++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.Extensions.Logging/Logger.cs b/src/Microsoft.Extensions.Logging/Logger.cs index 5207571e..327cbfd0 100644 --- a/src/Microsoft.Extensions.Logging/Logger.cs +++ b/src/Microsoft.Extensions.Logging/Logger.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; namespace Microsoft.Extensions.Logging { @@ -11,7 +10,7 @@ internal class Logger : ILogger { private readonly LoggerFactory _loggerFactory; private readonly string _name; - private ILogger[] _loggers = new ILogger[0]; + private ILogger[] _loggers; public Logger(LoggerFactory loggerFactory, string name) { @@ -19,15 +18,23 @@ public Logger(LoggerFactory loggerFactory, string name) _name = name; var providers = loggerFactory.GetProviders(); - _loggers = new ILogger[providers.Length]; - for (var index = 0; index != providers.Length; index++) + if (providers.Length > 0) { - _loggers[index] = providers[index].CreateLogger(name); + _loggers = new ILogger[providers.Length]; + for (var index = 0; index < providers.Length; index++) + { + _loggers[index] = providers[index].CreateLogger(name); + } } } public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func formatter) { + if (_loggers == null) + { + return; + } + if (logLevel >= _loggerFactory.MinimumLevel) { List exceptions = null; @@ -58,6 +65,11 @@ public void Log(LogLevel logLevel, int eventId, object state, Exception exceptio public bool IsEnabled(LogLevel logLevel) { + if (_loggers == null) + { + return false; + } + if (logLevel < _loggerFactory.MinimumLevel) { return false; @@ -96,10 +108,16 @@ public bool IsEnabled(LogLevel logLevel) public IDisposable BeginScopeImpl(object state) { + if (_loggers == null) + { + return null; + } + var loggers = _loggers; + var scope = new Scope(loggers.Length); List exceptions = null; - for (var index = 0; index != loggers.Length; index++) + for (var index = 0; index < loggers.Length; index++) { try { @@ -129,7 +147,18 @@ public IDisposable BeginScopeImpl(object state) internal void AddProvider(ILoggerProvider provider) { var logger = provider.CreateLogger(_name); - _loggers = _loggers.Concat(new[] { logger }).ToArray(); + int logIndex; + if (_loggers == null) + { + logIndex = 0; + _loggers = new ILogger[1]; + } + else + { + logIndex = _loggers.Length; + Array.Resize(ref _loggers, logIndex + 1); + } + _loggers[logIndex] = logger; } private class Scope : IDisposable From 64d8e58bceda4180f87bf12763ff0ee78d838a23 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 4 Nov 2015 13:40:09 +0000 Subject: [PATCH 2/2] Null logger --- src/Microsoft.Extensions.Logging/Logger.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Extensions.Logging/Logger.cs b/src/Microsoft.Extensions.Logging/Logger.cs index 327cbfd0..d7795fee 100644 --- a/src/Microsoft.Extensions.Logging/Logger.cs +++ b/src/Microsoft.Extensions.Logging/Logger.cs @@ -8,6 +8,8 @@ namespace Microsoft.Extensions.Logging { internal class Logger : ILogger { + private static readonly NullScope _nullScope = new NullScope(); + private readonly LoggerFactory _loggerFactory; private readonly string _name; private ILogger[] _loggers; @@ -110,7 +112,12 @@ public IDisposable BeginScopeImpl(object state) { if (_loggers == null) { - return null; + return _nullScope; + } + + if (_loggers.Length == 1) + { + return _loggers[0].BeginScopeImpl(state); } var loggers = _loggers; @@ -226,5 +233,12 @@ internal void Add(IDisposable disposable) throw new NotImplementedException(); } } + + private class NullScope : IDisposable + { + public void Dispose() + { + } + } } } \ No newline at end of file