Skip to content

Commit

Permalink
Finish implementing Serilog, LogManager, and full-screen loader.
Browse files Browse the repository at this point in the history
  • Loading branch information
bitbound committed May 22, 2023
1 parent d1c432e commit db19e92
Show file tree
Hide file tree
Showing 22 changed files with 463 additions and 208 deletions.
1 change: 0 additions & 1 deletion Server/API/ServerLogsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ namespace Remotely.Server.API
[ApiController]
public class ServerLogsController : ControllerBase
{
private readonly JsonSerializerOptions _jsonOptions = new() { WriteIndented = true };
private readonly ILogsManager _logsManager;
private readonly ILogger<ServerLogsController> _logger;

Expand Down
29 changes: 29 additions & 0 deletions Server/Components/LoaderHarness.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
@using Nihs.SimpleMessenger;
@using Remotely.Server.Models.Messages;
@inject IMessenger Messenger

@if (_loaderShown)
{
<LoadingSignal StatusMessage="@_statusMessage" />
}

@code {
private bool _loaderShown;
private string _statusMessage = string.Empty;

protected override Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Messenger.Register<ShowLoaderMessage>(this, HandleShowLoaderMessage);
}
return base.OnAfterRenderAsync(firstRender);
}

private async Task HandleShowLoaderMessage(ShowLoaderMessage message)
{
_loaderShown = message.IsShown;
_statusMessage = message.StatusMessage;
await InvokeAsync(StateHasChanged);
}
}
30 changes: 20 additions & 10 deletions Server/Components/LoadingSignal.razor
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
@inject IClientAppState AppState


@if (_theme == Theme.Dark)
{
<div class="signal" style="border-color: whitesmoke"></div>
}
else if (_theme == Theme.Light)
{
<div class="signal" style="border-color: #333"></div>
}
<div class="signal-background">
<div class="signal-wrapper text-center">
@if (!string.IsNullOrEmpty(StatusMessage))
{
<h4>
@StatusMessage
</h4>
}
<div class="signal @(GetSignalClass())"></div>
</div>
</div>

@code {
private Theme _theme;

[Parameter]
public string StatusMessage { get; set; } = string.Empty;

protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
_theme = await AppState.GetEffectiveTheme();
await base.OnInitializedAsync();
}

private string GetSignalClass()
{
return _theme == Theme.Dark ? "signal-dark" : "signal-light";
}
}
32 changes: 28 additions & 4 deletions Server/Components/LoadingSignal.razor.css
Original file line number Diff line number Diff line change
@@ -1,18 +1,42 @@
.signal {
.signal-background {
position: fixed;
top: 45vh;
left: calc(50% - 25px);
top: 0;
left: 0;
height: 100vh;
width: 100vw;
background-color: rgba(0,0,0,0.5);
z-index: 1000;
}

.signal-wrapper {
position: absolute;
display: inline-block;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

.signal {
display: inline-block;
border-width: 8px;
border-style: solid;
margin-top: 10px;
border-radius: 100%;
height: 50px;
width: 50px;
opacity: 0;
position: absolute;
transform-origin: center;
animation: pulsate .85s ease-out;
animation-iteration-count: infinite;
}

.signal.signal-dark {
border-color: whitesmoke;
}
.signal.signal-light {
border-color: #333;
}

@keyframes pulsate {
0% {
transform: scale(.1);
Expand Down
4 changes: 2 additions & 2 deletions Server/Components/ModalHarness.razor
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
{
_displayStyle = "block";
await InvokeAsync(StateHasChanged);
// The fade animation won't work without a delay here.
await Task.Delay(100);
// The fade animation won't work without a delay here.
await Task.Delay(100);
_showClass = "show";
await InvokeAsync(StateHasChanged);
};
Expand Down
3 changes: 0 additions & 3 deletions Server/Data/AppDb.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ protected override void OnModelCreating(ModelBuilder builder)
builder.Entity<Organization>()
.HasMany(x => x.RemotelyUsers)
.WithOne(x => x.Organization);
builder.Entity<Organization>()
.HasMany(x => x.EventLogs)
.WithOne(x => x.Organization);
builder.Entity<Organization>()
.HasMany(x => x.DeviceGroups)
.WithOne(x => x.Organization);
Expand Down
13 changes: 13 additions & 0 deletions Server/Models/Messages/ShowLoaderMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Remotely.Server.Models.Messages;

public class ShowLoaderMessage
{
public ShowLoaderMessage(bool isShown, string statusMessage)
{
IsShown = isShown;
StatusMessage = statusMessage;
}

public bool IsShown { get; }
public string StatusMessage { get; }
}
139 changes: 91 additions & 48 deletions Server/Pages/ServerLogs.razor
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
@page "/server-logs"
@using System.Collections.ObjectModel;
@attribute [Authorize]
@inherits AuthComponentBase

@inject IDataService DataService
@inject IToastService ToastService
@inject IJsInterop JsInterop
@inject ILogsManager LogsManager
@inject ILoaderService LoaderService

<h3 class="mb-3">Server Logs</h3>

Expand Down Expand Up @@ -35,9 +37,9 @@
<div style="display:inline-block">
<strong>Type:</strong>
<br />
<select class="form-control-sm" @bind="_eventType">
<select class="form-control-sm" @bind="LogLevel">
<option value="">All</option>
@foreach (var eventType in Enum.GetValues(typeof(EventType)))
@foreach (var eventType in Enum.GetValues(typeof(LogLevel)))
{
<option @key="eventType" value="@eventType">@eventType</option>
}
Expand All @@ -46,87 +48,128 @@
<div style="display:inline-block">
<strong>Filter:</strong>
<br />
<input type="text" @bind="_messageFilter" />
<input type="text" @bind="MessageFilter" @bind:event="oninput" />
</div>
<div style="display:inline-block">
<strong>From:</strong>
<br />
<input type="date" @bind="_fromDate" />
<input type="date" @bind="FromDate" />
</div>
<div style="display:inline-block">
<strong>To:</strong>
<br />
<input type="date" @bind-value="_toDate" />
<input type="date" @bind="ToDate" />
</div>
</div>

<table class="table table-hover table-striped">
<thead>
<tr>
<th>Type</th>
<th>Timestamp</th>
<th>Message</th>
<th>Source</th>
<th>Stack Trace</th>
</tr>
</thead>
<tbody>
@foreach (var eventLog in FilteredLogs)
{
<tr @key="eventLog">
<td>@eventLog.EventType</td>
<td>@eventLog.TimeStamp</td>
<td>
@if (!string.IsNullOrWhiteSpace(eventLog.Message))
{
foreach (var line in eventLog.Message.Split("\n", StringSplitOptions.RemoveEmptyEntries))
{
<div>@line</div>
}
}
</td>
<td>@eventLog.Source</td>
<td>@eventLog.StackTrace</td>
</tr>
}
</tbody>
</table>
<textarea readonly class="logs-content bg-dark text-white">
@(string.Join(Environment.NewLine, _filteredLogs))
</textarea>
}
else
{
<h5 class="text-muted">Only organization administrators can view this page.</h5>
}

@code {
private readonly List<EventLog> _filteredLogs = new();
private EventType? _eventType;
private string _messageFilter;
private readonly string _messageDebounceKey = Guid.NewGuid().ToString();
private readonly List<string> _filteredLogs = new();
private LogLevel? _logLevel;
private string _messageFilter = string.Empty;

private DateTimeOffset _fromDate = DateTimeOffset.Now.AddDays(-7);
private DateTimeOffset _toDate = DateTimeOffset.Now;

private DateTimeOffset FromDate
{
get => _fromDate;
set
{
if (value > _toDate)
{
ToastService.ShowToast("Invalid date range.", classString: "bg-warning");
return;
}
_fromDate = value;
_ = RefreshLogs();
}
}

private LogLevel? LogLevel
{
get => _logLevel;
set
{
_logLevel = value;
_ = RefreshLogs();
}
}

private IEnumerable<EventLog> FilteredLogs
private string MessageFilter
{
get
get => _messageFilter;
set
{
return Enumerable.Empty<EventLog>();
//return DataService.GetEventLogs(User.UserName,
// _fromDate,
// _toDate,
// _eventType,
// _messageFilter);
_messageFilter = value;

Debouncer.Debounce(
TimeSpan.FromSeconds(1),
() => _ = RefreshLogs(),
_messageDebounceKey);
}
}

private DateTimeOffset ToDate
{
get => _toDate;
set
{
if (value < _fromDate)
{
ToastService.ShowToast("Invalid date range.", classString: "bg-warning");
return;
}
_toDate = value;
_ = RefreshLogs();
}
}

protected override async Task OnInitializedAsync()
{
await RefreshLogs();
await base.OnInitializedAsync();
}

private async Task ClearAllLogs()
{
var result = await JsInterop.Confirm("Are you sure you want to delete all logs?");
if (result)
{
await LogsManager.DeleteLogs();
using (var _ = LoaderService.ShowLoader("Deleting logs"))
{
await LogsManager.DeleteLogs();
}
await RefreshLogs();
ToastService.ShowToast("Logs deleted.");
}
}

private async Task RefreshLogs()
{
using var _ = await LoaderService.ShowLoader("Refreshing logs");
_filteredLogs.Clear();

var logsAsync = LogsManager.GetLogs(
_fromDate,
_toDate,
_messageFilter,
_logLevel);

await foreach (var line in logsAsync)
{
_filteredLogs.Add(line);
}

await InvokeAsync(StateHasChanged);
}
}
7 changes: 6 additions & 1 deletion Server/Pages/ServerLogs.razor.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,18 @@
grid-column-gap: 2em;
}


.filters-row {
display: grid;
grid-template-columns: auto auto auto 1fr;
grid-column-gap: 1em;
}

.logs-content {
width: 100%;
white-space: pre;
height: 500px;
}


@media (max-width: 641px) {
.buttons-row {
Expand Down

0 comments on commit db19e92

Please sign in to comment.