Skip to content

Commit 946a613

Browse files
[release/9.4] Add option to console logs to wrap log lines (#10314)
1 parent cfbc4e6 commit 946a613

20 files changed

+260
-147
lines changed

src/Aspire.Dashboard/Components/Controls/LogViewer.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@implements IAsyncDisposable
1111

1212
<div class="log-overflow console-overflow continuous-scroll-overflow">
13-
<div class="log-container console-container" id="logContainer">
13+
<div class="@GetLogContainerClass()" id="logContainer">
1414
@if (LogEntries is { } logEntries)
1515
{
1616
<Virtualize Items="@logEntries.GetEntries()" ItemSize="20" OverscanCount="200" TItem="LogEntry">

src/Aspire.Dashboard/Components/Controls/LogViewer.razor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public sealed partial class LogViewer
3939
[Parameter]
4040
public bool IsTimestampUtc { get; set; }
4141

42+
[Parameter]
43+
public bool NoWrapLogs { get; set; }
44+
4245
[Parameter]
4346
public string? ApplicationName { get; set; }
4447

@@ -87,6 +90,11 @@ private string GetDisplayTimestamp(DateTimeOffset timestamp)
8790
: TimeProvider.ToLocal(timestamp).ToString(KnownFormats.ConsoleLogsUITimestampLocalFormat, CultureInfo.InvariantCulture);
8891
}
8992

93+
private string GetLogContainerClass()
94+
{
95+
return $"log-container console-container {(NoWrapLogs ? "wrap-log-container" : null)}";
96+
}
97+
9098
public ValueTask DisposeAsync()
9199
{
92100
Logger.LogDebug("Disposing log viewer.");

src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
LogEntries="@_logEntries"
9797
ShowTimestamp="@_showTimestamp"
9898
IsTimestampUtc="@_isTimestampUtc"
99+
NoWrapLogs="@_noWrapLogs"
99100
ApplicationName="@PageViewModel.SelectedResource?.Name"/>
100101
</MainSection>
101102
</AspirePageContentLayout>

src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ private sealed class ConsoleLogsSubscription
118118
private bool _showHiddenResources;
119119
private bool _showTimestamp;
120120
private bool _isTimestampUtc;
121+
private bool _noWrapLogs;
121122
public ConsoleLogsViewModel PageViewModel { get; set; } = null!;
122123
private IDisposable? _consoleLogsFiltersChangedSubscription;
123124
private ConsoleLogsFilters _consoleLogFilters = new();
@@ -149,6 +150,7 @@ protected override async Task OnInitializedAsync()
149150
{
150151
_showTimestamp = consoleSettings.ShowTimestamp;
151152
_isTimestampUtc = consoleSettings.IsTimestampUtc;
153+
_noWrapLogs = consoleSettings.NoWrapLogs;
152154
}
153155

154156
var showHiddenResources = await SessionStorage.GetAsync<bool>(BrowserStorageKeys.ResourcesShowHiddenResources);
@@ -370,6 +372,13 @@ private void UpdateMenuButtons()
370372
IsDisabled = !_showTimestamp
371373
});
372374

375+
_logsMenuItems.Add(new()
376+
{
377+
OnClick = () => ToggleWrapLogsAsync(noWrapLogs: !_noWrapLogs),
378+
Text = _noWrapLogs ? Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsWrapLogs)] : Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsNoWrapLogs)],
379+
Icon = _noWrapLogs ? new Icons.Regular.Size16.TextWrap() : new Icons.Regular.Size16.TextWrapOff()
380+
});
381+
373382
if (PageViewModel.SelectedResource != null)
374383
{
375384
if (ViewportInformation.IsDesktop)
@@ -400,10 +409,20 @@ private void UpdateMenuButtons()
400409

401410
private async Task ToggleTimestampAsync(bool showTimestamp, bool isTimestampUtc)
402411
{
403-
await LocalStorage.SetUnprotectedAsync(BrowserStorageKeys.ConsoleLogConsoleSettings, new ConsoleLogConsoleSettings(showTimestamp, isTimestampUtc));
404412
_showTimestamp = showTimestamp;
405413
_isTimestampUtc = isTimestampUtc;
414+
await UpdateConsoleLogSettingsAsync();
415+
}
406416

417+
private async Task ToggleWrapLogsAsync(bool noWrapLogs)
418+
{
419+
_noWrapLogs = noWrapLogs;
420+
await UpdateConsoleLogSettingsAsync();
421+
}
422+
423+
private async Task UpdateConsoleLogSettingsAsync()
424+
{
425+
await LocalStorage.SetUnprotectedAsync(BrowserStorageKeys.ConsoleLogConsoleSettings, new ConsoleLogConsoleSettings(_showTimestamp, _isTimestampUtc, _noWrapLogs));
407426
UpdateMenuButtons();
408427
StateHasChanged();
409428
}
@@ -749,7 +768,7 @@ public class ConsoleLogsViewModel
749768

750769
public record ConsoleLogsPageState(string? SelectedResource);
751770

752-
public record ConsoleLogConsoleSettings(bool ShowTimestamp, bool IsTimestampUtc);
771+
public record ConsoleLogConsoleSettings(bool ShowTimestamp, bool IsTimestampUtc, bool NoWrapLogs);
753772

754773
public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel)
755774
{

src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs

Lines changed: 56 additions & 116 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)