diff --git a/Shared.EventStore.Tests/TestDoubles.cs b/Shared.EventStore.Tests/TestDoubles.cs index bb87451..9714465 100644 --- a/Shared.EventStore.Tests/TestDoubles.cs +++ b/Shared.EventStore.Tests/TestDoubles.cs @@ -52,11 +52,12 @@ internal sealed class TestStateDispatcher : IStateDispatcher public Task Dispatch(TestState state, IDomainEvent @event, CancellationToken cancellationToken) => Task.CompletedTask; } -internal sealed class TestLogger : ILogger -{ +internal sealed class TestLogger : ILogger { public bool IsInitialised { get; set; } public List ErrorMessages { get; } = new(); public List ErrorExceptions { get; } = new(); + public void LogCritical(String message) {} + public void LogCritical(Exception exception) { } public void LogCritical(string message, Exception exception) { } public void LogDebug(string message) { } diff --git a/Shared.EventStore/Aggregate/AggregateService.cs b/Shared.EventStore/Aggregate/AggregateService.cs index ebd68ee..281c36a 100644 --- a/Shared.EventStore/Aggregate/AggregateService.cs +++ b/Shared.EventStore/Aggregate/AggregateService.cs @@ -59,7 +59,7 @@ internal static void EvictionCallback(Object key, EvictionReason reason, Object state) { - Logger.Logger.LogWarning($"Key [{key}] of type [{value.GetType()}] removed from the cache {reason.ToString()}"); + Logger.Logger.LogWarning("Key [{key}] of type [{value}] removed from the cache {reason}", key, value.GetType(), reason.ToString()); } internal (Type, MemoryCacheEntryOptions, Object) GetAggregateType() where TAggregate : Aggregate, new() @@ -145,7 +145,7 @@ public async Task> Get(Guid aggregateId, return Result.Success(aggregate); } - Logger.Logger.LogWarning($"aggregateResult failed {aggregateResult.Message}"); + Logger.Logger.LogWarning("aggregateResult failed {aggregateResult}", aggregateResult.Message); return aggregateResult; } finally diff --git a/Shared.EventStore/SubscriptionWorker/EventDispatchHelper.cs b/Shared.EventStore/SubscriptionWorker/EventDispatchHelper.cs index 3d23398..c314ddd 100644 --- a/Shared.EventStore/SubscriptionWorker/EventDispatchHelper.cs +++ b/Shared.EventStore/SubscriptionWorker/EventDispatchHelper.cs @@ -50,7 +50,7 @@ public static async Task DispatchToHandlers(this IDomainEvent @event, { if (all.Exception != null) { - Logger.Logger.LogError(all.Exception); + Logger.Logger.LogError(all.Exception,String.Empty); return Result.Failure(all.Exception.GetExceptionMessages()); } return Result.Failure(ex.GetExceptionMessages()); diff --git a/Shared.EventStore/SubscriptionWorker/PersistentSubscription.cs b/Shared.EventStore/SubscriptionWorker/PersistentSubscription.cs index 83ef6a3..a257926 100644 --- a/Shared.EventStore/SubscriptionWorker/PersistentSubscription.cs +++ b/Shared.EventStore/SubscriptionWorker/PersistentSubscription.cs @@ -36,7 +36,7 @@ private void SubscriptionDropped(KurrentDB.Client.PersistentSubscription arg1, public void SubscriptionDropped(String reason) { this.Connected = false; - Logger.Logger.LogWarning($"Subscription dropped - {reason}"); + Logger.Logger.LogWarning("Subscription dropped - {reason}", reason); if (this.SubscriptionHasDropped != null) { //Broadcast to owner @@ -47,7 +47,7 @@ public void SubscriptionDropped(String reason) public void EventHandlerMissing(String reason) { this.Connected = false; - Logger.Logger.LogWarning($"Event handler missing - {reason}"); + Logger.Logger.LogWarning("Event handler missing - {reason}", reason); if (this.EventHandlerIsMissing != null) { @@ -90,13 +90,11 @@ public async Task ConnectToSubscription(CancellationToken cancellationToken) this.ToString(), (level, message) => { - if (level == LogLevel.Warning) - { + if (level == LogLevel.Warning) { Logger.Logger.LogWarning(message); } - else - { - Logger.Logger.LogError(new Exception(message)); + else { + Logger.Logger.LogError(message); } }); @@ -112,7 +110,7 @@ public static PersistentSubscription Create(IPersistentSubscriptionsClient persi public override String ToString() => $"{this.PersistentSubscriptionDetails.StreamName}-{this.PersistentSubscriptionDetails.GroupName}"; - private static String BuildFailureMessage(ResolvedEvent resolvedEvent, + private static (String messageTemplate, Object[]? args) BuildFailureMessage(ResolvedEvent resolvedEvent, Result result) { String errors = result.Errors?.Any() == true @@ -123,7 +121,9 @@ private static String BuildFailureMessage(ResolvedEvent resolvedEvent, ? $"Result status [{result.Status}]. Errors [{errors}]" : $"Result was {result.Message}"; - return $"Failed to process the event type {resolvedEvent.Event.EventType} {resolvedEvent.GetResolvedEventDataAsString()} {resultDetails}"; + Object[] objectArray = new[] { resolvedEvent.Event.EventType, resolvedEvent.GetResolvedEventDataAsString(), resultDetails }; + + return ("Failed to process the event type {resolvedEventType} {resolvedEventString()} {resultDetails}", objectArray); } private static TenantIdentifiers GetTenantIdentifiersFromDomainEvent(IDomainEvent domainEvent) @@ -138,7 +138,7 @@ private static TenantIdentifiers GetTenantIdentifiersFromDomainEvent(IDomainEven } catch (Exception) { - Logger.Logger.LogWarning($"Unable to get estateId from request body [{domainEventAsString}]"); + Logger.Logger.LogWarning("Unable to get estateId from request body [{domainEventAsString}]", domainEventAsString); return TenantIdentifiers.Default(); } } @@ -191,7 +191,7 @@ internal async Task EventAppeared(KurrentDB.Client.PersistentSubscription persis } TenantContext.CurrentTenant = tenantContext; - Logger.Logger.LogInformation($"EventAppearedFromPersistentSubscription with Event Id {resolvedEvent.Event.EventId} event type {resolvedEvent.Event.EventType}"); + Logger.Logger.LogInformation("EventAppearedFromPersistentSubscription with Event Id {resolvedEventId} event type {resolvedEventType}", resolvedEvent.Event.EventId, resolvedEvent.Event.EventType); Result> domainEventHandlersResult = domainEventHandlerResolver.GetDomainEventHandlers(domainEvent); @@ -210,13 +210,12 @@ internal async Task EventAppeared(KurrentDB.Client.PersistentSubscription persis await PersistentSubscriptionsHelper.AckEvent(persistentSubscription, resolvedEvent); } else { - Logger.Logger.LogError(BuildFailureMessage(resolvedEvent, result)); + (String messageTemplate, Object[] args) failureDetails = BuildFailureMessage(resolvedEvent, result); + Logger.Logger.LogError(failureDetails.messageTemplate, failureDetails.args); } } catch (Exception e) { - Exception ex = new($"Failed to process the event type {resolvedEvent.Event.EventType} {resolvedEvent.GetResolvedEventDataAsString()}", e); - - Logger.Logger.LogError(ex); + Logger.Logger.LogError(e,"Failed to process the event type {eventType} {resolvedEvent}", resolvedEvent.Event.EventType, resolvedEvent.GetResolvedEventDataAsString()); } } } diff --git a/Shared.IntegrationTesting.Tests/DockerHelperStartupPlanTests.cs b/Shared.IntegrationTesting.Tests/DockerHelperStartupPlanTests.cs index 5b7da4a..c21f12c 100644 --- a/Shared.IntegrationTesting.Tests/DockerHelperStartupPlanTests.cs +++ b/Shared.IntegrationTesting.Tests/DockerHelperStartupPlanTests.cs @@ -279,7 +279,7 @@ public void EventStore_health_checks_reuse_their_http_client() [Test] public void Host_folder_mount_does_not_require_docker_platform() { - ContainerBuilder builder = new(); + ContainerBuilder builder = new("hello-world"); ContainerBuilder mountedBuilder = builder.MountHostFolder("trace"); diff --git a/Shared.IntegrationTesting.Tests/GenericSteps.cs b/Shared.IntegrationTesting.Tests/GenericSteps.cs index 905b985..8147693 100644 --- a/Shared.IntegrationTesting.Tests/GenericSteps.cs +++ b/Shared.IntegrationTesting.Tests/GenericSteps.cs @@ -36,7 +36,8 @@ public async Task StartSystem() { String scenarioName = this.ScenarioContext.ScenarioInfo.Title.Replace(" ", String.Empty); NlogLogger logger = new(); logger.Initialise(LogManager.GetLogger(scenarioName), scenarioName); - LogManager.AddHiddenAssembly(typeof(NlogLogger).Assembly); + LogManager.Setup().SetupLogFactory(setup => + setup.AddCallSiteHiddenAssembly(typeof(NlogLogger).Assembly)); this.TestingContext.DockerHelper = new TestDockerHelper(); this.TestingContext.DockerHelper.Logger = logger; diff --git a/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs b/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs index 69174b2..252c5e5 100644 --- a/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs +++ b/Shared.IntegrationTesting/TestContainers/BaseDockerHelper.cs @@ -283,9 +283,8 @@ public virtual ContainerBuilder SetupCallbackHandlerContainer(){ (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.CallbackHandler).Data; - ContainerBuilder callbackHandlerContainer = new ContainerBuilder() + ContainerBuilder callbackHandlerContainer = new ContainerBuilder(imageDetails.imageName) .WithName(this.CallbackHandlerContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.CallbackHandlerDockerPort, true); @@ -332,7 +331,10 @@ public virtual ContainerBuilder SetupKurrentDbContainer(){ {"EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP","true"}, {"EVENTSTORE_PROJECTION_EXECUTION_TIMEOUT","5000"} }; - ContainerBuilder kurrentDbContainer = new(); + + (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.KurrentDb).Data; + + ContainerBuilder kurrentDbContainer = new(imageDetails.imageName); if (!this.IsSecureKurrentDb){ environmentVariables.Add("EVENTSTORE_INSECURE","true"); @@ -355,11 +357,10 @@ public virtual ContainerBuilder SetupKurrentDbContainer(){ String logfilePath = "/var/log/kurrentdb"; kurrentDbContainer = kurrentDbContainer.MountHostFolder(this.HostTraceFolder, logfilePath); - (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.KurrentDb).Data; + this.Trace($"About to Start Kurrent Db Container using image [{imageDetails.imageName}]"); kurrentDbContainer = kurrentDbContainer.WithName(this.KurrentDbContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .WithPortBinding(DockerPorts.KurrentDbHttpDockerPort, true); @@ -393,9 +394,8 @@ public virtual ContainerBuilder SetupFileProcessorContainer(){ (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.FileProcessor).Data; - ContainerBuilder fileProcessorContainer = new ContainerBuilder() + ContainerBuilder fileProcessorContainer = new ContainerBuilder(imageDetails.imageName) .WithName(this.FileProcessorContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.FileProcessorDockerPort, true); @@ -441,9 +441,8 @@ protected virtual ContainerBuilder SetupEstateManagementUiContainer() (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.EstateManagementUI).Data; - ContainerBuilder containerBuilder = new ContainerBuilder() + ContainerBuilder containerBuilder = new ContainerBuilder(imageDetails.imageName) .WithName(this.EstateManagementUiContainerName) - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.EstateManagementUIDockerPort,true); @@ -460,11 +459,10 @@ public virtual ContainerBuilder SetupSubscriptionServiceContainer() { (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.SubscriptionService).Data; - ContainerBuilder subscriptionServiceContainer = new ContainerBuilder().WithName(this.SubscriptionServiceContainerName) - .WithImage(imageDetails.imageName) - .WithEnvironment(environmentVariables) - .MountHostFolder(this.HostTraceFolder) - .WithPortBinding(DockerPorts.SubscriptionServiceDockerPort, true); + ContainerBuilder subscriptionServiceContainer = new ContainerBuilder(imageDetails.imageName).WithName(this.SubscriptionServiceContainerName) + .WithEnvironment(environmentVariables) + .MountHostFolder(this.HostTraceFolder) + .WithPortBinding(DockerPorts.SubscriptionServiceDockerPort, true); return subscriptionServiceContainer; } @@ -480,11 +478,10 @@ public virtual ContainerBuilder SetupConfigHostContainer() (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.ConfigurationHost).Data; - ContainerBuilder configHostContainer = new ContainerBuilder().WithName(this.ConfigHostContainerName) - .WithImage(imageDetails.imageName) - .WithEnvironment(environmentVariables) - .MountHostFolder(this.HostTraceFolder) - .WithPortBinding(DockerPorts.ConfigHostDockerPort, true); + ContainerBuilder configHostContainer = new ContainerBuilder(imageDetails.imageName).WithName(this.ConfigHostContainerName) + .WithEnvironment(environmentVariables) + .MountHostFolder(this.HostTraceFolder) + .WithPortBinding(DockerPorts.ConfigHostDockerPort, true); return configHostContainer; } @@ -507,10 +504,9 @@ public virtual ContainerBuilder SetupMessagingServiceContainer(){ (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.MessagingService).Data; - ContainerBuilder messagingServiceContainer = new ContainerBuilder().WithName(this.MessagingServiceContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) - .WithEnvironment(environmentVariables) - .MountHostFolder(this.HostTraceFolder); + ContainerBuilder messagingServiceContainer = new ContainerBuilder(imageDetails.imageName).WithName(this.MessagingServiceContainerName) // similar to WithName() + .WithEnvironment(environmentVariables) + .MountHostFolder(this.HostTraceFolder); messagingServiceContainer = messagingServiceContainer .WithPortBinding(DockerPorts.MessagingServiceDockerPort, true); @@ -584,10 +580,10 @@ public virtual ContainerBuilder SetupSecurityServiceContainer() public virtual ContainerBuilder ConfigureSqlContainer() { this.Trace("About to start SQL Server Container"); - - ContainerBuilder containerService = new ContainerBuilder() + (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.SqlServer).Data; + + ContainerBuilder containerService = new ContainerBuilder(imageDetails.imageName) .WithName(this.SqlServerContainerName) // similar to WithName() - .WithImage(this.GetImageDetails(ContainerType.SqlServer).Data.imageName) .WithEnvironment("ACCEPT_EULA", "Y") .WithEnvironment("SA_PASSWORD", this.SqlCredentials.password) .WithPortBinding(1433, true); @@ -611,9 +607,8 @@ public virtual ContainerBuilder SetupTestHostContainer(){ (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.TestHost).Data; - ContainerBuilder testHostContainer = new ContainerBuilder() + ContainerBuilder testHostContainer = new ContainerBuilder(imageDetails.imageName) .WithName(this.TestHostContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.TestHostPort, true); @@ -636,9 +631,8 @@ public virtual ContainerBuilder SetupEstateReportingContainer() (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.EstateReporting).Data; - ContainerBuilder estateReportingContainer = new ContainerBuilder() + ContainerBuilder estateReportingContainer = new ContainerBuilder(imageDetails.imageName) .WithName(this.EstateReportingContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.EstateReportingDockerPort, true); @@ -668,9 +662,8 @@ public virtual ContainerBuilder SetupTransactionProcessorAclContainer(){ (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.TransactionProcessorAcl).Data; - ContainerBuilder transactionProcessorACLContainer = new ContainerBuilder() + ContainerBuilder transactionProcessorACLContainer = new ContainerBuilder(imageDetails.imageName) .WithName(this.TransactionProcessorAclContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.TransactionProcessorAclDockerPort, true); @@ -698,9 +691,8 @@ public virtual ContainerBuilder SetupTransactionProcessorContainer(){ (String imageName, Boolean useLatest) imageDetails = this.GetImageDetails(ContainerType.TransactionProcessor).Data; - ContainerBuilder transactionProcessorContainer = new ContainerBuilder() + ContainerBuilder transactionProcessorContainer = new ContainerBuilder(imageDetails.imageName) .WithName(this.TransactionProcessorContainerName) // similar to WithName() - .WithImage(imageDetails.imageName) .WithEnvironment(environmentVariables) .MountHostFolder(this.HostTraceFolder) .WithPortBinding(DockerPorts.TransactionProcessorDockerPort, true); diff --git a/Shared.Logger/ILogger.cs b/Shared.Logger/ILogger.cs index 91d3fb4..b4bd130 100644 --- a/Shared.Logger/ILogger.cs +++ b/Shared.Logger/ILogger.cs @@ -20,14 +20,12 @@ public interface ILogger /// Boolean IsInitialised { get; set; } - + void LogCritical(String message); void LogCritical(Exception exception); -#pragma warning disable S2190 // This overload delegates to the required string-only overload; it does not call itself. void LogCritical(String messageTemplate, params Object?[] args) => this.LogCritical(FormatMessageTemplate(messageTemplate, args)); -#pragma warning restore S2190 void LogCritical(Exception exception, String messageTemplate, diff --git a/Shared.Logger/Logger.cs b/Shared.Logger/Logger.cs index 08e8e58..de73c8c 100644 --- a/Shared.Logger/Logger.cs +++ b/Shared.Logger/Logger.cs @@ -84,72 +84,6 @@ public static void LogCritical(Exception exception, Logger.Write(logger => logger.LogCritical(exception, messageTemplate, args), true); } - // Compatibility overloads below remain available for existing callers and can be removed only in a breaking release. -#pragma warning disable S1133 // These deprecated APIs are retained for source compatibility until a breaking release. - [Obsolete("Use LogCritical(String messageTemplate, params Object?[] args) or the exception-aware structured overload.")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogCritical(Exception exception) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogCritical(exception)); - } - - [Obsolete("Use LogCritical(String messageTemplate, params Object?[] args) or the exception-aware structured overload.")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogCritical(String message, - Exception exception) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogCritical(message, exception)); - } - - [Obsolete("Use LogDebug(String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogDebug(String message) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogDebug(message)); - } - - [Obsolete("Use LogError(Exception exception, String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogError(Exception exception) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogError(exception)); - } - - [Obsolete("Use LogError(String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogError(String message) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogError(message)); - } - - [Obsolete("Use LogError(Exception exception, String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogError(String message, - Exception exception) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogError(message, exception)); - } - - [Obsolete("Use LogInformation(String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogInformation(String message) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogInformation(message)); - } - - [Obsolete("Use LogTrace(String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogTrace(String message) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogTrace(message)); - } - - [Obsolete("Use LogWarning(String messageTemplate, params Object?[] args).")] // NOSONAR - retained for source compatibility until a breaking release. - public static void LogWarning(String message) - { - Logger.ValidateLoggerObject(); - Logger.Write(logger => logger.LogWarning(message)); - } #pragma warning restore S1133 [MemberNotNull(nameof(LoggerObject))] diff --git a/Shared.Logger/NlogLogger.cs b/Shared.Logger/NlogLogger.cs index 864ede6..6d4102e 100644 --- a/Shared.Logger/NlogLogger.cs +++ b/Shared.Logger/NlogLogger.cs @@ -24,6 +24,8 @@ public void Initialise(NLog.Logger loggerObject, this.IsInitialised = true; } + public void LogCritical(String message) => this.LogMessage(LogLevel.Fatal, message, null, Array.Empty()); + public void LogCritical(Exception exception) => this.LogMessage(LogLevel.Fatal, exception?.Message ?? String.Empty, exception, Array.Empty()); diff --git a/Shared.Logger/NullLogger.cs b/Shared.Logger/NullLogger.cs index 6f15e58..34e7111 100644 --- a/Shared.Logger/NullLogger.cs +++ b/Shared.Logger/NullLogger.cs @@ -21,6 +21,10 @@ public void Initialise() { this.IsInitialised = true; } + public void LogCritical(String message) { + // This is a null logger so needs to actual implementation + } + public void LogCritical(Exception exception) { // This is a null logger so needs to actual implementation } diff --git a/Shared.Tests/ConfigurationRootExtensionsTests.cs b/Shared.Tests/ConfigurationRootExtensionsTests.cs index ad1f046..45393b3 100644 --- a/Shared.Tests/ConfigurationRootExtensionsTests.cs +++ b/Shared.Tests/ConfigurationRootExtensionsTests.cs @@ -24,7 +24,7 @@ public void ConfigurationRootExtensions_LogConfiguration_ConfigurationIsLogged() IConfigurationRoot configuration = builder.Build(); TestLogger testLogger = new(); - Action loggerAction = message => { testLogger.LogInformation(message); }; + Action loggerAction = testLogger.LogInformation; configuration.LogConfiguration(loggerAction); @@ -53,7 +53,7 @@ public void ConfigurationRootExtensions_LogConfiguration_NoConfiguration_NoConfi IConfigurationRoot configuration = builder.Build(); TestLogger testLogger = new(); - Action loggerAction = message => { testLogger.LogInformation(message); }; + Action loggerAction = testLogger.LogInformation; configuration.LogConfiguration(loggerAction); diff --git a/Shared.Tests/LoggingTests.cs b/Shared.Tests/LoggingTests.cs index ec02cfc..d44194f 100644 --- a/Shared.Tests/LoggingTests.cs +++ b/Shared.Tests/LoggingTests.cs @@ -32,13 +32,13 @@ public void Logger_LogMethods_LogWrittenNoErrors(LogLevel loglevel){ switch(loglevel){ case LogLevel.Critical: - Should.NotThrow(() => Logger.Logger.LogCritical(new Exception(message))); + Should.NotThrow(() => Logger.Logger.LogCritical(message)); break; case LogLevel.Debug: Should.NotThrow(() => Logger.Logger.LogDebug(message)); break; case LogLevel.Error: - Should.NotThrow(() => Logger.Logger.LogError(new Exception(message))); + Should.NotThrow(() => Logger.Logger.LogError(message)); break; case LogLevel.Information: Should.NotThrow(() => Logger.Logger.LogInformation(message)); diff --git a/Shared.Tests/StructuredLoggingTests.cs b/Shared.Tests/StructuredLoggingTests.cs index 4b40ed0..825790b 100644 --- a/Shared.Tests/StructuredLoggingTests.cs +++ b/Shared.Tests/StructuredLoggingTests.cs @@ -251,6 +251,7 @@ private sealed class CapturingLogger : Shared.Logger.ILogger public Boolean IsInitialised { get; set; } = true; public List Entries { get; } = new(); + public void LogCritical(String message) => this.Add(message, Array.Empty(), LogLevel.Critical); public void LogCritical(Exception exception) => this.Add(exception.Message, Array.Empty(), LogLevel.Critical); public void LogCritical(String message, Exception exception) => this.Add(message, [exception], LogLevel.Critical); public void LogCritical(String messageTemplate, params Object?[] args) => this.Add(messageTemplate, args, LogLevel.Critical); @@ -277,6 +278,7 @@ private sealed class LegacyCapturingLogger : Shared.Logger.ILogger public Boolean IsInitialised { get; set; } = true; public List Entries { get; } = new(); + public void LogCritical(String message) => this.Entries.Add(message); public void LogCritical(Exception exception) => this.Entries.Add(exception.Message); public void LogCritical(String message, Exception exception) => this.Entries.Add(message); public void LogDebug(String message) => this.Entries.Add(message); diff --git a/Shared.Tests/TestLogger.cs b/Shared.Tests/TestLogger.cs index a43f597..805edeb 100644 --- a/Shared.Tests/TestLogger.cs +++ b/Shared.Tests/TestLogger.cs @@ -17,6 +17,8 @@ public String[] GetLogEntries() return this.LogEntries.ToArray(); } + public void LogCritical(String message) => this.LogEntries.Add(message); + public void LogCritical(Exception exception) { this.LogEntries.Add(exception.ToString()); diff --git a/Shared/Middleware/ExceptionHandlerMiddleware.cs b/Shared/Middleware/ExceptionHandlerMiddleware.cs index 87bb7f2..70f9beb 100644 --- a/Shared/Middleware/ExceptionHandlerMiddleware.cs +++ b/Shared/Middleware/ExceptionHandlerMiddleware.cs @@ -27,8 +27,7 @@ public async Task Invoke(HttpContext context) { private async Task HandleExceptionAsync(HttpContext context, Exception exception) { - Exception newException = new($"An unhandled exception has occurred while executing the request. Url: {context.Request.GetDisplayUrl()}", exception); - Logger.Logger.LogError(newException); + Logger.Logger.LogError(exception, "An unhandled exception has occurred while executing the request. Url: {url}", context.Request.GetDisplayUrl()); // Set some defaults HttpResponse response = context.Response; diff --git a/Shared/Middleware/Helpers.cs b/Shared/Middleware/Helpers.cs index c6d648d..45bc7e0 100644 --- a/Shared/Middleware/Helpers.cs +++ b/Shared/Middleware/Helpers.cs @@ -1,7 +1,6 @@ #nullable enable using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Text;