Skip to content

Commit db6c3d8

Browse files
Lazily import ILoggerProviders
This change makes our AbstractLoggerFactory take a set of Lazy<ILoggerProvider> instances and only realize them the first time a message is logged.
1 parent 15df83a commit db6c3d8

File tree

7 files changed

+25
-19
lines changed

7 files changed

+25
-19
lines changed

src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/LanguageServer/RazorLanguageServerBenchmarkBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public Task<TResponse> SendRequestAsync<TParams, TResponse>(string method, TPara
108108
}
109109
}
110110

111-
internal class NoopLoggerFactory() : AbstractLoggerFactory([new NoopLoggerProvider()]);
111+
internal class NoopLoggerFactory() : AbstractLoggerFactory([new(() => new NoopLoggerProvider())]);
112112

113113
internal class NoopLoggerProvider : ILoggerProvider
114114
{

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorLanguageServer.LoggerFactoryWrapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal partial class RazorLanguageServer
1414
/// </summary>
1515
private sealed class LoggerFactoryWrapper(ILoggerFactory loggerFactory) : ILoggerFactory
1616
{
17-
private ILoggerFactory _loggerFactory = loggerFactory;
17+
private readonly ILoggerFactory _loggerFactory = loggerFactory;
1818

1919
public void AddLoggerProvider(ILoggerProvider provider)
2020
{

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Logging/AbstractLoggerFactory.AggregateLogger.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ namespace Microsoft.CodeAnalysis.Razor.Logging;
88

99
internal abstract partial class AbstractLoggerFactory
1010
{
11-
private class AggregateLogger(ImmutableArray<ILogger> loggers) : ILogger
11+
private class AggregateLogger(ImmutableArray<Lazy<ILogger>> lazyLoggers) : ILogger
1212
{
13-
private ImmutableArray<ILogger> _loggers = loggers;
13+
private ImmutableArray<Lazy<ILogger>> _lazyLoggers = lazyLoggers;
1414

1515
public bool IsEnabled(LogLevel logLevel)
1616
{
17-
foreach (var logger in _loggers)
17+
foreach (var lazyLogger in _lazyLoggers)
1818
{
19-
if (logger.IsEnabled(logLevel))
19+
if (lazyLogger.Value.IsEnabled(logLevel))
2020
{
2121
return true;
2222
}
@@ -27,18 +27,20 @@ public bool IsEnabled(LogLevel logLevel)
2727

2828
public void Log(LogLevel logLevel, string message, Exception? exception)
2929
{
30-
foreach (var logger in _loggers)
30+
foreach (var lazyLogger in _lazyLoggers)
3131
{
32+
var logger = lazyLogger.Value;
33+
3234
if (logger.IsEnabled(logLevel))
3335
{
3436
logger.Log(logLevel, message, exception);
3537
}
3638
}
3739
}
3840

39-
internal void AddLogger(ILogger logger)
41+
internal void AddLogger(Lazy<ILogger> lazyLogger)
4042
{
41-
ImmutableInterlocked.Update(ref _loggers, (set, l) => set.Add(l), logger);
43+
ImmutableInterlocked.Update(ref _lazyLoggers, (set, l) => set.Add(l), lazyLogger);
4244
}
4345
}
4446
}

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Logging/AbstractLoggerFactory.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ namespace Microsoft.CodeAnalysis.Razor.Logging;
1313

1414
internal abstract partial class AbstractLoggerFactory : ILoggerFactory
1515
{
16+
private ImmutableArray<Lazy<ILoggerProvider>> _providers;
1617
private ImmutableDictionary<string, AggregateLogger> _loggers;
17-
private ImmutableArray<ILoggerProvider> _providers;
1818

19-
protected AbstractLoggerFactory(ImmutableArray<ILoggerProvider> providers)
19+
protected AbstractLoggerFactory(ImmutableArray<Lazy<ILoggerProvider>> providers)
2020
{
2121
_providers = providers;
2222
_loggers = ImmutableDictionary.Create<string, AggregateLogger>(StringComparer.OrdinalIgnoreCase);
@@ -29,24 +29,26 @@ public ILogger GetOrCreateLogger(string categoryName)
2929
return logger;
3030
}
3131

32-
using var loggers = new PooledArrayBuilder<ILogger>(_providers.Length);
32+
using var lazyLoggers = new PooledArrayBuilder<Lazy<ILogger>>(_providers.Length);
3333

3434
foreach (var provider in _providers)
3535
{
36-
loggers.Add(provider.CreateLogger(categoryName));
36+
lazyLoggers.Add(new(() => provider.Value.CreateLogger(categoryName)));
3737
}
3838

39-
var result = new AggregateLogger(loggers.DrainToImmutable());
39+
var result = new AggregateLogger(lazyLoggers.DrainToImmutable());
4040
return ImmutableInterlocked.AddOrUpdate(ref _loggers, categoryName, result, (k, v) => v);
4141
}
4242

4343
public void AddLoggerProvider(ILoggerProvider provider)
4444
{
45-
if (ImmutableInterlocked.Update(ref _providers, (set, p) => set.Add(p), provider))
45+
var lazyProvider = new Lazy<ILoggerProvider>(() => provider);
46+
47+
if (ImmutableInterlocked.Update(ref _providers, (set, p) => set.Add(p), lazyProvider))
4648
{
4749
foreach (var (category, logger) in _loggers)
4850
{
49-
logger.AddLogger(provider.CreateLogger(category));
51+
logger.AddLogger(new(() => provider.CreateLogger(category)));
5052
}
5153
}
5254
}

src/Razor/src/Microsoft.VisualStudio.LanguageServices.Razor/Logging/VisualStudioLoggerFactory.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the MIT license. See License.txt in the project root for license information.
33

4+
using System;
45
using System.Collections.Generic;
56
using System.Collections.Immutable;
67
using System.ComponentModel.Composition;
@@ -10,7 +11,7 @@ namespace Microsoft.VisualStudio.Razor.Logging;
1011

1112
[Export(typeof(ILoggerFactory))]
1213
[method: ImportingConstructor]
13-
internal sealed class VisualStudioLoggerFactory([ImportMany] IEnumerable<ILoggerProvider> providers)
14+
internal sealed class VisualStudioLoggerFactory([ImportMany] IEnumerable<Lazy<ILoggerProvider>> providers)
1415
: AbstractLoggerFactory(providers.ToImmutableArray())
1516
{
1617
}

src/Razor/src/rzls/LoggerFactory.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the MIT license. See License.txt in the project root for license information.
33

4+
using System;
45
using System.Collections.Immutable;
56
using Microsoft.CodeAnalysis.Razor.Logging;
67

78
namespace Microsoft.AspNetCore.Razor.LanguageServer;
89

9-
internal sealed class LoggerFactory(ImmutableArray<ILoggerProvider> providers)
10+
internal sealed class LoggerFactory(ImmutableArray<Lazy<ILoggerProvider>> providers)
1011
: AbstractLoggerFactory(providers)
1112
{
1213
}

src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common.Tooling/Logging/TestOutputLoggerFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
namespace Microsoft.AspNetCore.Razor.Test.Common.Logging;
88

99
internal sealed class TestOutputLoggerFactory(ITestOutputHelper output)
10-
: AbstractLoggerFactory([new TestOutputLoggerProvider(output)])
10+
: AbstractLoggerFactory([new(() => new TestOutputLoggerProvider(output))])
1111
{
1212
}

0 commit comments

Comments
 (0)