From bd63fca9445a0fce9d83fb31de9979961255291f Mon Sep 17 00:00:00 2001 From: jschick04 Date: Mon, 4 May 2026 14:59:18 -0500 Subject: [PATCH] Flip LoggingMiddleware default to type-name-only and tighten selected-events signatures --- .../Store/EventLog/EventLogStoreTests.cs | 2 +- .../TestUtils/LoggerUtils.cs | 39 +++++++++++ .../Store/EventLog/EventLogAction.cs | 4 +- .../Store/LoggingMiddleware.cs | 68 ++++++------------- 4 files changed, 62 insertions(+), 51 deletions(-) create mode 100644 src/EventLogExpert.UI.Tests/TestUtils/LoggerUtils.cs diff --git a/src/EventLogExpert.UI.Tests/Store/EventLog/EventLogStoreTests.cs b/src/EventLogExpert.UI.Tests/Store/EventLog/EventLogStoreTests.cs index 492d0ed6..555cd077 100644 --- a/src/EventLogExpert.UI.Tests/Store/EventLog/EventLogStoreTests.cs +++ b/src/EventLogExpert.UI.Tests/Store/EventLog/EventLogStoreTests.cs @@ -187,7 +187,7 @@ public void EventLogAction_SelectEvents_ShouldStoreMultipleEvents() var action = new EventLogAction.SelectEvents(events); // Assert - Assert.Equal(2, action.SelectedEvents.Count()); + Assert.Equal(2, action.SelectedEvents.Count); } [Fact] diff --git a/src/EventLogExpert.UI.Tests/TestUtils/LoggerUtils.cs b/src/EventLogExpert.UI.Tests/TestUtils/LoggerUtils.cs new file mode 100644 index 00000000..3492a388 --- /dev/null +++ b/src/EventLogExpert.UI.Tests/TestUtils/LoggerUtils.cs @@ -0,0 +1,39 @@ +// // Copyright (c) Microsoft Corporation. +// // Licensed under the MIT License. + +using EventLogExpert.Eventing.Helpers; +using Microsoft.Extensions.Logging; + +namespace EventLogExpert.UI.Tests.TestUtils; + +internal static class LoggerUtils +{ + internal sealed class RecordingTraceLogger : ITraceLogger + { + public List CriticalMessages { get; } = []; + + public List DebugMessages { get; } = []; + + public List ErrorMessages { get; } = []; + + public List InfoMessages { get; } = []; + + public LogLevel MinimumLevel => LogLevel.Trace; + + public List TraceMessages { get; } = []; + + public List WarnMessages { get; } = []; + + public void Critical(CriticalLogHandler handler) => CriticalMessages.Add(handler.ToStringAndClear()); + + public void Debug(DebugLogHandler handler) => DebugMessages.Add(handler.ToStringAndClear()); + + public void Error(ErrorLogHandler handler) => ErrorMessages.Add(handler.ToStringAndClear()); + + public void Info(InfoLogHandler handler) => InfoMessages.Add(handler.ToStringAndClear()); + + public void Trace(TraceLogHandler handler) => TraceMessages.Add(handler.ToStringAndClear()); + + public void Warn(WarnLogHandler handler) => WarnMessages.Add(handler.ToStringAndClear()); + } +} diff --git a/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs b/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs index 9526e546..6662cb53 100644 --- a/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs +++ b/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs @@ -33,7 +33,7 @@ public sealed record SelectEvent( bool IsMultiSelect = false, bool ShouldStaySelected = false); - public sealed record SelectEvents(IEnumerable SelectedEvents); + public sealed record SelectEvents(IReadOnlyCollection SelectedEvents); /// /// Replaces the entire selection with the supplied events, preserving input order @@ -47,7 +47,7 @@ public sealed record SelectEvents(IEnumerable SelectedEvents) /// The new focused event, or null to clear focus. Does not /// need to be a member of . public sealed record SetSelectedEvents( - IEnumerable SelectedEvents, + IReadOnlyCollection SelectedEvents, DisplayEventModel? SelectedEvent); public sealed record SetContinuouslyUpdate(bool ContinuouslyUpdate); diff --git a/src/EventLogExpert.UI/Store/LoggingMiddleware.cs b/src/EventLogExpert.UI/Store/LoggingMiddleware.cs index da837531..e202a177 100644 --- a/src/EventLogExpert.UI/Store/LoggingMiddleware.cs +++ b/src/EventLogExpert.UI/Store/LoggingMiddleware.cs @@ -4,9 +4,6 @@ using EventLogExpert.Eventing.Helpers; using EventLogExpert.UI.Store.EventLog; using EventLogExpert.UI.Store.EventTable; -using EventLogExpert.UI.Store.FilterCache; -using EventLogExpert.UI.Store.FilterGroup; -using EventLogExpert.UI.Store.FilterPane; using EventLogExpert.UI.Store.StatusBar; using Fluxor; using System.Text.Json; @@ -16,69 +13,44 @@ namespace EventLogExpert.UI.Store; public sealed class LoggingMiddleware(ITraceLogger debugLogger) : Middleware { private readonly ITraceLogger _debugLogger = debugLogger; - private readonly JsonSerializerOptions _serializerOptions = new(); public override void BeforeDispatch(object action) { switch (action) { case EventLogAction.LoadEvents loadEventsAction: - _debugLogger.Debug($"Action: {action.GetType()} with {loadEventsAction.Events.Count()} events."); + _debugLogger.Debug($"Action: {action.GetType()} with {loadEventsAction.Events.Count} events."); break; - case EventLogAction.AddEvent addEventsAction: - _debugLogger.Debug($"Action: {action.GetType()} with {addEventsAction.NewEvent.Source} event ID {addEventsAction.NewEvent.Id}."); + case EventLogAction.LoadEventsPartial loadEventsPartialAction: + _debugLogger.Debug($"Action: {action.GetType()} with {loadEventsPartialAction.Events.Count} events."); + break; + case EventLogAction.AddEvent addEventAction: + _debugLogger.Debug($"Action: {action.GetType()} with {addEventAction.NewEvent.Source} event ID {addEventAction.NewEvent.Id}."); break; case EventLogAction.OpenLog openLogAction: _debugLogger.Info($"Action: {action.GetType()} with {openLogAction.LogName} log type {openLogAction.PathType}."); break; - case EventLogAction.CloseLog: - case EventLogAction.CloseAll: - _debugLogger.Info($"Action: {action.GetType()}."); - break; - case EventLogAction.AddEventBuffered: - case EventLogAction.AddEventSuccess: - case EventLogAction.SetFilters: - case EventTableAction.AddTable: - case EventTableAction.LoadColumnsCompleted: - case EventTableAction.UpdateDisplayedEvents: - case EventTableAction.UpdateTable: - case FilterCacheAction.AddFavoriteFilterCompleted: - case FilterCacheAction.AddRecentFilterCompleted: - case FilterCacheAction.ImportFavorites: - case FilterCacheAction.LoadFiltersCompleted: - case FilterCacheAction.RemoveFavoriteFilterCompleted: - case FilterGroupAction.AddGroup: - case FilterGroupAction.ImportGroups: - case FilterGroupAction.LoadGroupsSuccess: - case FilterGroupAction.SetFilter: - case FilterGroupAction.SetGroup: - case FilterPaneAction.AddFilter: - case FilterPaneAction.ApplyFilterGroup: - case FilterPaneAction.SetFilter: - case FilterPaneAction.SetFilterDateRange: - _debugLogger.Debug($"Action: {action.GetType()}."); - break; case EventLogAction.SelectEvent selectEventAction: - _debugLogger.Debug($"Action: {nameof(EventLogAction.SelectEvent)} selected {selectEventAction.SelectedEvent?.Source} event ID {selectEventAction.SelectedEvent?.Id}."); - + _debugLogger.Debug($"Action: {nameof(EventLogAction.SelectEvent)} selected {selectEventAction.SelectedEvent.Source} event ID {selectEventAction.SelectedEvent.Id}."); break; case EventLogAction.SelectEvents selectEventsAction: - _debugLogger.Debug($"Action: {nameof(EventLogAction.SelectEvents)} selected {selectEventsAction.SelectedEvents.Count()} events"); - + _debugLogger.Debug($"Action: {nameof(EventLogAction.SelectEvents)} selected {selectEventsAction.SelectedEvents.Count} events."); + break; + case EventLogAction.SetSelectedEvents setSelectedEventsAction: + _debugLogger.Debug($"Action: {nameof(EventLogAction.SetSelectedEvents)} set {setSelectedEventsAction.SelectedEvents.Count} events."); + break; + case EventTableAction.AppendTableEvents appendTableEventsAction: + _debugLogger.Debug($"Action: {action.GetType()} with {appendTableEventsAction.Events.Count} events for log {appendTableEventsAction.LogId}."); + break; + case EventTableAction.AppendTableEventsBatch appendTableEventsBatchAction: + var totalAppendEvents = appendTableEventsBatchAction.EventsByLog.Values.Sum(eventsForLog => eventsForLog.Count); + _debugLogger.Debug($"Action: {action.GetType()} with {totalAppendEvents} events across {appendTableEventsBatchAction.EventsByLog.Count} logs."); break; case StatusBarAction.SetEventsLoading: - _debugLogger.Debug($"Action: {action.GetType()} {JsonSerializer.Serialize(action, _serializerOptions)}"); + _debugLogger.Debug($"Action: {action.GetType()} {JsonSerializer.Serialize(action)}"); break; default: - try - { - _debugLogger.Debug($"Action: {action.GetType()} {JsonSerializer.Serialize(action, _serializerOptions)}"); - } - catch - { - _debugLogger.Debug($"Action: {action.GetType()}. Could not serialize payload."); - } - + _debugLogger.Debug($"Action: {action.GetType()}."); break; } }