@page "/logs" @rendermode InteractiveWebAssemblyNoPrerender @attribute [Authorize] @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using RobotApp.Client.Models @inject IJSRuntime JSRuntime @inject HttpClient Http @inject IConfiguration Configuration @inject ISnackbar Snackbar Logs
@if (ShowRawLog) {
Normal
@foreach (var log in ShowLogs) { @log
}
} else { @if (SearchLogs.Count < ShowLogs.Count) {
Raw log
} @foreach (var log in SearchLogs) {
@log.Time @log.Level @log.Message @if (log.HasException) {
                                    @log.Exception
                                                                    
}
} }
@code { private DateTime DateLog = DateTime.Today; private bool IsLoading; private readonly List ShowLogs = new(); private readonly List SearchLogs = new(); private ElementReference LogContainerRef { get; set; } private bool ShowRawLog { get; set; } private string? FilterLog { get; set; } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; await LoadLogs(); } private async Task LoadLogs() { try { IsLoading = true; ShowLogs.Clear(); StateHasChanged(); var logs = await Http.GetFromJsonAsync>($"api/LogsManager?date={DateLog}"); ShowLogs.AddRange(logs ?? []); IsLoading = false; StateHasChanged(); await ReloadLogs(); } catch (AccessTokenNotAvailableException ex) { ex.Redirect(); return; } } private async Task ReloadLogs() { IsLoading = true; SearchLogs.Clear(); StateHasChanged(); foreach (var line in ShowLogs.Where(log => string.IsNullOrEmpty(FilterLog) || log.Contains(FilterLog)).TakeLast(2000)) { try { var log = System.Text.Json.JsonSerializer.Deserialize(line); if (log is not null) SearchLogs.Add(log); } catch (System.Text.Json.JsonException) { continue; } } IsLoading = false; StateHasChanged(); await JSRuntime.InvokeVoidAsync("ScrollToBottom", LogContainerRef); } private async Task OnSearch(string text) { FilterLog = text; await ReloadLogs(); } private async Task OnDateChanged(DateTime? date) { if (date is not null && date.HasValue) { DateLog = date.Value; await LoadLogs(); } } private async Task ExportLogs() { try { var fileContent = await Http.GetFromJsonAsync>($"api/LogsManager?date={DateLog}"); var formattedContent = string.Join("\n", fileContent ?? []); var fileName = $"LogsManager_{DateLog.ToShortDateString()}.txt"; await JSRuntime.InvokeVoidAsync("downloadFile", fileName, formattedContent, "text/plain"); } catch (Exception ex) { Snackbar.Add($"Lỗi khi tải file: {ex.Message}", Severity.Warning); } } }