@page "/logs" @using TradingBot.Services @using TradingBot.Models @inject LoggingService LoggingService @implements IDisposable @rendermode InteractiveServer Logs - TradingBot
@filteredLogs.Count / @allLogs.Count logs
@if (filteredLogs.Count == 0) {

Nessun log disponibile

} else {
@foreach (var log in filteredLogs.OrderByDescending(l => l.Timestamp)) {
@log.Timestamp.ToLocalTime().ToString("HH:mm:ss.fff") @log.Level @log.Category @if (!string.IsNullOrEmpty(log.Symbol)) { @log.Symbol }
@log.Message
@if (!string.IsNullOrEmpty(log.Details)) {
@log.Details
}
}
}
@code { private ElementReference logsContainer; private List allLogs = new(); private List filteredLogs = new(); private string selectedLevel = ""; private string selectedCategory = ""; private string selectedSymbol = ""; private bool autoScroll = true; private List categories = new(); private List symbols = new(); protected override void OnInitialized() { LoadLogs(); LoggingService.OnLogAdded += HandleLogAdded; } private void LoadLogs() { allLogs = LoggingService.GetLogs().ToList(); UpdateFilters(); FilterLogs(); } private void UpdateFilters() { categories = allLogs.Select(l => l.Category).Distinct().OrderBy(c => c).ToList(); symbols = allLogs.Where(l => !string.IsNullOrEmpty(l.Symbol)) .Select(l => l.Symbol!) .Distinct() .OrderBy(s => s) .ToList(); } private void FilterLogs() { var query = allLogs.AsEnumerable(); if (!string.IsNullOrEmpty(selectedLevel)) { if (Enum.TryParse(selectedLevel, out var level)) { query = query.Where(l => l.Level == level); } } if (!string.IsNullOrEmpty(selectedCategory)) { query = query.Where(l => l.Category == selectedCategory); } if (!string.IsNullOrEmpty(selectedSymbol)) { query = query.Where(l => l.Symbol == selectedSymbol); } filteredLogs = query.ToList(); StateHasChanged(); } private async void HandleLogAdded() { LoadLogs(); await InvokeAsync(StateHasChanged); if (autoScroll) { await Task.Delay(100); // Auto-scroll logic would go here if needed } } private void ClearLogs() { LoggingService.ClearLogs(); LoadLogs(); } private string GetLevelIcon(TradingBot.Models.LogLevel level) { return level switch { TradingBot.Models.LogLevel.Debug => "bug", TradingBot.Models.LogLevel.Info => "info-circle", TradingBot.Models.LogLevel.Warning => "exclamation-triangle", TradingBot.Models.LogLevel.Error => "x-circle", TradingBot.Models.LogLevel.Trade => "graph-up-arrow", _ => "circle" }; } public void Dispose() { LoggingService.OnLogAdded -= HandleLogAdded; } }