1 // Copyright (c) Microsoft. All rights reserved. 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 4 using Microsoft.Build.Framework; 5 using Microsoft.Build.Shared; 6 using NuGet.Common; 7 using System.Collections.Generic; 8 using System.Threading.Tasks; 9 10 using INuGetLogger = NuGet.Common.ILogger; 11 using SdkLoggerBase = Microsoft.Build.Framework.SdkLogger; 12 13 namespace NuGet.MSBuildSdkResolver 14 { 15 /// <summary> 16 /// An implementation of <see cref="T:NuGet.Common.ILogger" /> that logs messages to an <see cref="T:Microsoft.Build.Framework.SdkLogger" />. 17 /// </summary> 18 /// <inheritdoc /> 19 internal class NuGetSdkLogger : INuGetLogger 20 { 21 /// <summary> 22 /// A collection of errors that have been logged. 23 /// </summary> 24 private readonly ICollection<string> _errors; 25 26 /// <summary> 27 /// A <see cref="SdkLogger"/> to forward events to. 28 /// </summary> 29 private readonly SdkLoggerBase _sdkLogger; 30 31 /// <summary> 32 /// A collection of warnings that have been logged. 33 /// </summary> 34 private readonly ICollection<string> _warnings; 35 36 /// <summary> 37 /// Initializes a new instance of the NuGetLogger class. 38 /// </summary> 39 /// <param name="sdkLogger">A <see cref="SdkLogger"/> to forward events to.</param> 40 /// <param name="warnings">A <see cref="ICollection{String}"/> to add logged warnings to.</param> 41 /// <param name="errors">An <see cref="ICollection{String}"/> to add logged errors to.</param> NuGetSdkLogger(SdkLoggerBase sdkLogger, ICollection<string> warnings, ICollection<string> errors)42 public NuGetSdkLogger(SdkLoggerBase sdkLogger, ICollection<string> warnings, ICollection<string> errors) 43 { 44 ErrorUtilities.VerifyThrowArgumentNull(sdkLogger, nameof(sdkLogger)); 45 ErrorUtilities.VerifyThrowArgumentNull(warnings, nameof(warnings)); 46 ErrorUtilities.VerifyThrowArgumentNull(errors, nameof(errors)); 47 48 _sdkLogger = sdkLogger; 49 _warnings = warnings; 50 _errors = errors; 51 } 52 Log(LogLevel level, string data)53 public void Log(LogLevel level, string data) 54 { 55 switch (level) 56 { 57 case LogLevel.Debug: 58 case LogLevel.Minimal: 59 case LogLevel.Verbose: 60 case LogLevel.Information: 61 // ReSharper disable once RedundantArgumentDefaultValue 62 _sdkLogger.LogMessage(data, MessageImportance.Low); 63 break; 64 65 case LogLevel.Warning: 66 _warnings.Add(data); 67 break; 68 69 case LogLevel.Error: 70 _errors.Add(data); 71 break; 72 } 73 } 74 75 public void Log(ILogMessage message) => Log(message.Level, message.Message); 76 LogAsync(LogLevel level, string data)77 public Task LogAsync(LogLevel level, string data) 78 { 79 Log(level, data); 80 81 return Task.CompletedTask; 82 } 83 LogAsync(ILogMessage message)84 public Task LogAsync(ILogMessage message) 85 { 86 Log(message); 87 88 return Task.CompletedTask; 89 } 90 LogDebug(string data)91 public void LogDebug(string data) => Log(LogLevel.Debug, data); 92 LogError(string data)93 public void LogError(string data) => Log(LogLevel.Error, data); 94 LogInformation(string data)95 public void LogInformation(string data) => Log(LogLevel.Information, data); 96 LogInformationSummary(string data)97 public void LogInformationSummary(string data) => Log(LogLevel.Information, data); 98 LogMinimal(string data)99 public void LogMinimal(string data) => Log(LogLevel.Minimal, data); 100 LogVerbose(string data)101 public void LogVerbose(string data) => Log(LogLevel.Verbose, data); 102 LogWarning(string data)103 public void LogWarning(string data) => Log(LogLevel.Warning, data); 104 } 105 } 106