diff --git a/src/Logging/SimpleConsoleLogger.cs b/src/Logging/SimpleConsoleLogger.cs index e091fd5dc5..9e73c4caf9 100644 --- a/src/Logging/SimpleConsoleLogger.cs +++ b/src/Logging/SimpleConsoleLogger.cs @@ -15,7 +15,8 @@ internal class SimpleConsoleLogger : ILogger private readonly IConsole _console; private readonly ITerminal _terminal; - private readonly LogLevel _logLevel; + private readonly LogLevel _minimalLogLevel; + private readonly LogLevel _minimalErrorLevel; private static ImmutableDictionary LogLevelColorMap => new Dictionary { @@ -28,11 +29,12 @@ internal class SimpleConsoleLogger : ILogger [LogLevel.None] = ConsoleColor.White, }.ToImmutableDictionary(); - public SimpleConsoleLogger(IConsole console, LogLevel logLevel) + public SimpleConsoleLogger(IConsole console, LogLevel minimalLogLevel, LogLevel minimalErrorLevel) { _terminal = console.GetTerminal(); _console = console; - _logLevel = logLevel; + _minimalLogLevel = minimalLogLevel; + _minimalErrorLevel = minimalErrorLevel; } public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) @@ -45,20 +47,21 @@ public void Log(LogLevel logLevel, EventId eventId, TState state, Except lock (_gate) { var message = formatter(state, exception); + var logToErrorStream = logLevel >= _minimalErrorLevel; if (_terminal is null) { - LogToConsole(message); + LogToConsole(_console, message, logToErrorStream); } else { - LogToTerminal(message, logLevel); + LogToTerminal(message, logLevel, logToErrorStream); } } } public bool IsEnabled(LogLevel logLevel) { - return (int)logLevel >= (int)_logLevel; + return (int)logLevel >= (int)_minimalLogLevel; } public IDisposable BeginScope(TState state) @@ -66,17 +69,26 @@ public IDisposable BeginScope(TState state) return NullScope.Instance; } - private void LogToTerminal(string message, LogLevel logLevel) + private void LogToTerminal(string message, LogLevel logLevel, bool logToErrorStream) { var messageColor = LogLevelColorMap[logLevel]; _terminal.ForegroundColor = messageColor; - _terminal.Out.Write($" {message}{Environment.NewLine}"); + + LogToConsole(_terminal, message, logToErrorStream); + _terminal.ResetColor(); } - private void LogToConsole(string message) + private void LogToConsole(IConsole console, string message, bool logToErrorStream) { - _console.Out.Write($" {message}{Environment.NewLine}"); + if (logToErrorStream) + { + console.Error.Write($" {message}{Environment.NewLine}"); + } + else + { + console.Out.Write($" {message}{Environment.NewLine}"); + } } } } diff --git a/src/Logging/SimpleConsoleLoggerFactoryExtensions.cs b/src/Logging/SimpleConsoleLoggerFactoryExtensions.cs index 0f75b1557c..5795b9e3bd 100644 --- a/src/Logging/SimpleConsoleLoggerFactoryExtensions.cs +++ b/src/Logging/SimpleConsoleLoggerFactoryExtensions.cs @@ -7,9 +7,9 @@ namespace Microsoft.CodeAnalysis.Tools.Logging { internal static class SimpleConsoleLoggerFactoryExtensions { - public static ILoggerFactory AddSimpleConsole(this ILoggerFactory factory, IConsole console, LogLevel logLevel) + public static ILoggerFactory AddSimpleConsole(this ILoggerFactory factory, IConsole console, LogLevel minimalLogLevel, LogLevel minimalErrorLevel) { - factory.AddProvider(new SimpleConsoleLoggerProvider(console, logLevel)); + factory.AddProvider(new SimpleConsoleLoggerProvider(console, minimalLogLevel, minimalErrorLevel)); return factory; } } diff --git a/src/Logging/SimpleConsoleLoggerProvider.cs b/src/Logging/SimpleConsoleLoggerProvider.cs index 81516f0fe7..1b98c212df 100644 --- a/src/Logging/SimpleConsoleLoggerProvider.cs +++ b/src/Logging/SimpleConsoleLoggerProvider.cs @@ -8,17 +8,19 @@ namespace Microsoft.CodeAnalysis.Tools.Logging internal class SimpleConsoleLoggerProvider : ILoggerProvider { private readonly IConsole _console; - private readonly LogLevel _logLevel; + private readonly LogLevel _minimalLogLevel; + private readonly LogLevel _minimalErrorLevel; - public SimpleConsoleLoggerProvider(IConsole console, LogLevel logLevel) + public SimpleConsoleLoggerProvider(IConsole console, LogLevel minimalLogLevel, LogLevel minimalErrorLevel) { _console = console; - _logLevel = logLevel; + _minimalLogLevel = minimalLogLevel; + _minimalErrorLevel = minimalErrorLevel; } public ILogger CreateLogger(string name) { - return new SimpleConsoleLogger(_console, _logLevel); + return new SimpleConsoleLogger(_console, _minimalLogLevel, _minimalErrorLevel); } public void Dispose() diff --git a/src/Program.cs b/src/Program.cs index b02dc3f20f..83ca628e2a 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -62,7 +62,7 @@ private static async Task Main(string[] args) // Setup logging. var logLevel = GetLogLevel(verbosity); - var logger = SetupLogging(console, logLevel); + var logger = SetupLogging(console, minimalLogLevel: logLevel, minimalErrorLevel: LogLevel.Warning); // Hook so we can cancel and exit when ctrl+c is pressed. var cancellationTokenSource = new CancellationTokenSource(); @@ -288,10 +288,10 @@ internal static DiagnosticSeverity GetSeverity(string? severity) }; } - private static ILogger SetupLogging(IConsole console, LogLevel logLevel) + private static ILogger SetupLogging(IConsole console, LogLevel minimalLogLevel, LogLevel minimalErrorLevel) { var serviceCollection = new ServiceCollection(); - serviceCollection.AddSingleton(new LoggerFactory().AddSimpleConsole(console, logLevel)); + serviceCollection.AddSingleton(new LoggerFactory().AddSimpleConsole(console, minimalLogLevel, minimalErrorLevel)); serviceCollection.AddLogging(); var serviceProvider = serviceCollection.BuildServiceProvider();