diff --git a/src/Aspire.Hosting/Dcp/DcpHost.cs b/src/Aspire.Hosting/Dcp/DcpHost.cs index cf3660086cd..5b9a6cb4db1 100644 --- a/src/Aspire.Hosting/Dcp/DcpHost.cs +++ b/src/Aspire.Hosting/Dcp/DcpHost.cs @@ -276,7 +276,7 @@ private async Task LogSocketOutputAsync(Socket socket, CancellationToken cancell if (!DcpLogParser.TryParseDcpLog(line, out var parsedMessage, out var logLevel, out var category)) { // If parsing fails, return a default logger and the line as-is - return (_logger, LogLevel.Information, Encoding.UTF8.GetString(line)); + return (_logger, LogLevel.Debug, Encoding.UTF8.GetString(line)); } var hash = new HashCode(); @@ -290,7 +290,12 @@ private async Task LogSocketOutputAsync(Socket socket, CancellationToken cancell loggerCache[hashValue] = logger = _loggerFactory.CreateLogger($"Aspire.Hosting.Dcp.{category}"); } - return (logger, logLevel, parsedMessage); + // Map DCP log levels to Debug/Trace to reduce noise in AppHost output. + // DCP errors are now flowing to resources and can be hidden from output, + // so we log them at Debug or Trace level instead of using the original DCP log level. + var appHostLogLevel = logLevel == LogLevel.Trace ? LogLevel.Trace : LogLevel.Debug; + + return (logger, appHostLogLevel, parsedMessage); } try diff --git a/tests/Aspire.Hosting.Tests/Dcp/DcpLogParserTests.cs b/tests/Aspire.Hosting.Tests/Dcp/DcpLogParserTests.cs index 686ba2fa6ef..849fa025b95 100644 --- a/tests/Aspire.Hosting.Tests/Dcp/DcpLogParserTests.cs +++ b/tests/Aspire.Hosting.Tests/Dcp/DcpLogParserTests.cs @@ -215,4 +215,26 @@ public void TryParseDcpLog_RealWorldExampleFromIssue_ParsesSuccessfully() Assert.Equal(LogLevel.Information, logLevel); Assert.Equal("dcpctrl.ExecutableReconciler", category); } + + [Theory] + [InlineData("error", LogLevel.Error)] + [InlineData("warning", LogLevel.Warning)] + [InlineData("info", LogLevel.Information)] + [InlineData("debug", LogLevel.Debug)] + [InlineData("trace", LogLevel.Trace)] + public void TryParseDcpLog_ParsesAllLogLevels(string dcpLogLevel, LogLevel expectedLogLevel) + { + // Arrange + var logLine = $"2023-09-19T20:40:50.509-0700\t{dcpLogLevel}\tdcpctrl.TestReconciler\tTest message"; + var bytes = Encoding.UTF8.GetBytes(logLine); + + // Act + var result = DcpLogParser.TryParseDcpLog(bytes.AsSpan(), out var message, out var logLevel, out var category); + + // Assert + Assert.True(result); + Assert.Equal("Test message", message); + Assert.Equal(expectedLogLevel, logLevel); + Assert.Equal("dcpctrl.TestReconciler", category); + } }