File: MSBuildLoggerProvider.cs
Web Access
Project: src\sdk\src\Microsoft.Extensions.Logging.MSBuild\Microsoft.Extensions.Logging.MSBuild.csproj (Microsoft.Extensions.Logging.MSBuild)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.Build.Utilities;

namespace Microsoft.Extensions.Logging.MSBuild;

/// <summary>
/// An <see cref="ILoggerProvider"/> that creates <see cref="ILogger"/>s which passes
/// all the logs to MSBuild's <see cref="TaskLoggingHelper"/>.
/// </summary>
public class MSBuildLoggerProvider : ILoggerProvider, ISupportExternalScope
{
    private readonly TaskLoggingHelper _loggingHelper;
    private readonly Dictionary<string, MSBuildLogger> _loggers = [];
    private IExternalScopeProvider? _scopeProvider;

    public MSBuildLoggerProvider(TaskLoggingHelper loggingHelperToWrap)
    {
        _loggingHelper = loggingHelperToWrap;
    }

    public ILogger CreateLogger(string categoryName)
    {
        lock (_loggers)
        {
            if (!_loggers.TryGetValue(categoryName, out var logger))
            {
                logger = new MSBuildLogger(categoryName, _loggingHelper, _scopeProvider);
                _loggers[categoryName] = logger;
            }
            return logger;
        }
    }

    public void Dispose() { }

    public void SetScopeProvider(IExternalScopeProvider scopeProvider)
    {
        _scopeProvider = scopeProvider;
        lock (_loggers)
        {
            foreach (var logger in _loggers.Values)
            {
                logger.SetScopeProvider(scopeProvider);
            }
        }
    }
}