Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public Task<TResponse> SendRequestAsync<TParams, TResponse>(string method, TPara
}
}

internal class NoopLoggerFactory() : AbstractLoggerFactory([new NoopLoggerProvider()]);
internal class NoopLoggerFactory() : AbstractLoggerFactory([new(() => new NoopLoggerProvider())]);

internal class NoopLoggerProvider : ILoggerProvider
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ internal partial class RazorLanguageServer
/// </summary>
private sealed class LoggerFactoryWrapper(ILoggerFactory loggerFactory) : ILoggerFactory
{
private ILoggerFactory _loggerFactory = loggerFactory;
private readonly ILoggerFactory _loggerFactory = loggerFactory;

public void AddLoggerProvider(ILoggerProvider provider)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ namespace Microsoft.CodeAnalysis.Razor.Logging;

internal abstract partial class AbstractLoggerFactory
{
private class AggregateLogger(ImmutableArray<ILogger> loggers) : ILogger
private class AggregateLogger(ImmutableArray<Lazy<ILogger>> lazyLoggers) : ILogger
{
private ImmutableArray<ILogger> _loggers = loggers;
private ImmutableArray<Lazy<ILogger>> _lazyLoggers = lazyLoggers;

public bool IsEnabled(LogLevel logLevel)
{
foreach (var logger in _loggers)
foreach (var lazyLogger in _lazyLoggers)
{
if (logger.IsEnabled(logLevel))
if (lazyLogger.Value.IsEnabled(logLevel))
{
return true;
}
Expand All @@ -27,18 +27,20 @@ public bool IsEnabled(LogLevel logLevel)

public void Log(LogLevel logLevel, string message, Exception? exception)
{
foreach (var logger in _loggers)
foreach (var lazyLogger in _lazyLoggers)
{
var logger = lazyLogger.Value;

if (logger.IsEnabled(logLevel))
{
logger.Log(logLevel, message, exception);
}
}
}

internal void AddLogger(ILogger logger)
internal void AddLogger(Lazy<ILogger> lazyLogger)
{
ImmutableInterlocked.Update(ref _loggers, (set, l) => set.Add(l), logger);
ImmutableInterlocked.Update(ref _lazyLoggers, (set, l) => set.Add(l), lazyLogger);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ namespace Microsoft.CodeAnalysis.Razor.Logging;

internal abstract partial class AbstractLoggerFactory : ILoggerFactory
{
private ImmutableArray<Lazy<ILoggerProvider>> _providers;
private ImmutableDictionary<string, AggregateLogger> _loggers;
private ImmutableArray<ILoggerProvider> _providers;

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

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

foreach (var provider in _providers)
{
loggers.Add(provider.CreateLogger(categoryName));
lazyLoggers.Add(new(() => provider.Value.CreateLogger(categoryName)));
}

var result = new AggregateLogger(loggers.DrainToImmutable());
var result = new AggregateLogger(lazyLoggers.DrainToImmutable());
return ImmutableInterlocked.AddOrUpdate(ref _loggers, categoryName, result, (k, v) => v);
}

public void AddLoggerProvider(ILoggerProvider provider)
{
if (ImmutableInterlocked.Update(ref _providers, (set, p) => set.Add(p), provider))
var lazyProvider = new Lazy<ILoggerProvider>(() => provider);

if (ImmutableInterlocked.Update(ref _providers, (set, p) => set.Add(p), lazyProvider))
{
foreach (var (category, logger) in _loggers)
{
logger.AddLogger(provider.CreateLogger(category));
logger.AddLogger(new(() => provider.CreateLogger(category)));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT license. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel.Composition;
Expand All @@ -10,7 +11,7 @@ namespace Microsoft.VisualStudio.Razor.Logging;

[Export(typeof(ILoggerFactory))]
[method: ImportingConstructor]
internal sealed class VisualStudioLoggerFactory([ImportMany] IEnumerable<ILoggerProvider> providers)
internal sealed class VisualStudioLoggerFactory([ImportMany] IEnumerable<Lazy<ILoggerProvider>> providers)
: AbstractLoggerFactory(providers.ToImmutableArray())
{
}
3 changes: 2 additions & 1 deletion src/Razor/src/rzls/LoggerFactory.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT license. See License.txt in the project root for license information.

using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Razor.Logging;

namespace Microsoft.AspNetCore.Razor.LanguageServer;

internal sealed class LoggerFactory(ImmutableArray<ILoggerProvider> providers)
internal sealed class LoggerFactory(ImmutableArray<Lazy<ILoggerProvider>> providers)
: AbstractLoggerFactory(providers)
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
namespace Microsoft.AspNetCore.Razor.Test.Common.Logging;

internal sealed class TestOutputLoggerFactory(ITestOutputHelper output)
: AbstractLoggerFactory([new TestOutputLoggerProvider(output)])
: AbstractLoggerFactory([new(() => new TestOutputLoggerProvider(output))])
{
}