Skip to content
This repository was archived by the owner on Dec 13, 2018. It is now read-only.

Commit db43593

Browse files
committed
Reduce logging allocs
Allow begin scope with pre-formatted message. Only create logger array when loggers Normal for loop condition in constructor Log nop when no loggers BeginScope to return null when no loggers Logging is disabled when no loggers Add provider to only create one resized array
1 parent 7b71eca commit db43593

File tree

2 files changed

+47
-9
lines changed

2 files changed

+47
-9
lines changed

src/Microsoft.Framework.Logging.Abstractions/LoggerExtensions.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,19 @@ public static IDisposable BeginScope(
559559
return logger.BeginScopeImpl(new FormattedLogValues(messageFormat, args));
560560
}
561561

562+
/// <summary>
563+
/// Creates a scope with a pre-formatted message.
564+
/// </summary>
565+
/// <param name="logger">The <see cref="ILogger"/> to create the scope in.</param>
566+
/// <param name="message">Pre-formatted string of the scope message.</param>
567+
/// <returns>A disposable scope object. Can be null.</returns>
568+
public static IDisposable BeginScope(
569+
[NotNull] this ILogger logger,
570+
[NotNull] string message)
571+
{
572+
return logger.BeginScopeImpl(message);
573+
}
574+
562575
//------------------------------------------HELPERS------------------------------------------//
563576

564577
private static void Log(

src/Microsoft.Framework.Logging/Logger.cs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,38 @@
33

44
using System;
55
using System.Collections.Generic;
6-
using System.Linq;
76

87
namespace Microsoft.Framework.Logging
98
{
109
internal class Logger : ILogger
1110
{
1211
private readonly LoggerFactory _loggerFactory;
1312
private readonly string _name;
14-
private ILogger[] _loggers = new ILogger[0];
13+
private ILogger[] _loggers;
1514

1615
public Logger(LoggerFactory loggerFactory, string name)
1716
{
1817
_loggerFactory = loggerFactory;
1918
_name = name;
2019

2120
var providers = loggerFactory.GetProviders();
22-
_loggers = new ILogger[providers.Length];
23-
for (var index = 0; index != providers.Length; index++)
21+
if (providers.Length > 0)
2422
{
25-
_loggers[index] = providers[index].CreateLogger(name);
23+
_loggers = new ILogger[providers.Length];
24+
for (var index = 0; index < providers.Length; index++)
25+
{
26+
_loggers[index] = providers[index].CreateLogger(name);
27+
}
2628
}
2729
}
2830

2931
public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
3032
{
33+
if (_loggers == null)
34+
{
35+
return;
36+
}
37+
3138
if (logLevel >= _loggerFactory.MinimumLevel)
3239
{
3340
List<Exception> exceptions = null;
@@ -58,6 +65,11 @@ public void Log(LogLevel logLevel, int eventId, object state, Exception exceptio
5865

5966
public bool IsEnabled(LogLevel logLevel)
6067
{
68+
if (_loggers == null)
69+
{
70+
return false;
71+
}
72+
6173
if (logLevel < _loggerFactory.MinimumLevel)
6274
{
6375
return false;
@@ -96,11 +108,13 @@ public bool IsEnabled(LogLevel logLevel)
96108

97109
public IDisposable BeginScopeImpl(object state)
98110
{
99-
var loggers = _loggers;
100-
if (loggers.Length == 0)
111+
if (_loggers == null)
101112
{
102113
return null;
103114
}
115+
116+
var loggers = _loggers;
117+
104118
var scope = new Scope(loggers.Length);
105119
List<Exception> exceptions = null;
106120
for (var index = 0; index != loggers.Length; index++)
@@ -133,7 +147,18 @@ public IDisposable BeginScopeImpl(object state)
133147
internal void AddProvider(ILoggerProvider provider)
134148
{
135149
var logger = provider.CreateLogger(_name);
136-
_loggers = _loggers.Concat(new[] { logger }).ToArray();
150+
int logIndex;
151+
if (_loggers == null)
152+
{
153+
logIndex = 1;
154+
_loggers = new ILogger[1];
155+
}
156+
else
157+
{
158+
logIndex = _loggers.Length;
159+
Array.Resize(ref _loggers, logIndex + 1);
160+
}
161+
_loggers[logIndex] = logger;
137162
}
138163

139164
private class Scope : IDisposable
@@ -202,4 +227,4 @@ internal void Add(IDisposable disposable)
202227
}
203228
}
204229
}
205-
}
230+
}

0 commit comments

Comments
 (0)