From f1e6499ba0896fccaa80d533e493f07d63e7d115 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Wed, 16 Feb 2022 08:02:42 +1000 Subject: [PATCH 1/6] Dev version bump [skip ci] --- src/Serilog.AspNetCore/Serilog.AspNetCore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj index c6ca09e..9764351 100644 --- a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj +++ b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj @@ -2,7 +2,7 @@ Serilog support for ASP.NET Core logging - 5.0.0 + 5.0.1 Microsoft;Serilog Contributors netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 true From e810384e3f21a8559288340c088306e1dfb22a82 Mon Sep 17 00:00:00 2001 From: Igor Fesenko Date: Wed, 23 Feb 2022 16:07:30 -0800 Subject: [PATCH 2/6] Update code snippet for Azure Diagnostics Log Stream configuration Update code snippet to add support for non-Windows based App Service --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4636c62..379d595 100644 --- a/README.md +++ b/README.md @@ -285,11 +285,13 @@ The Azure Diagnostic Log Stream ships events from any files in the `D:\home\LogF .WriteTo.Console() // Add this line: .WriteTo.File( - @"D:\home\LogFiles\Application\myapp.txt", - fileSizeLimitBytes: 1_000_000, - rollOnFileSizeLimit: true, - shared: true, - flushToDiskInterval: TimeSpan.FromSeconds(1)) + System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "LogFiles", "Application", "diagnostics.txt"), + rollingInterval: RollingInterval.Day, + fileSizeLimitBytes: 10 * 1024 * 1024, + retainedFileCountLimit: 2, + rollOnFileSizeLimit: true, + shared: true, + flushToDiskInterval: TimeSpan.FromSeconds(1)) .CreateLogger(); ``` From 33abd28efab290170f646ca645050a6302924f6f Mon Sep 17 00:00:00 2001 From: Andreas Gullberg Larsen Date: Thu, 4 Nov 2021 18:56:22 +0100 Subject: [PATCH 3/6] Log exception set in IDiagnosticContext If there is no unhandled exception, then log the exception set in IDiagnosticContext. --- .../AspNetCore/RequestLoggingMiddleware.cs | 4 +- .../SerilogWebHostBuilderExtensionsTests.cs | 60 +++++++++++++++++-- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs b/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs index cc2d84b..0c53ec8 100644 --- a/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs +++ b/src/Serilog.AspNetCore/AspNetCore/RequestLoggingMiddleware.cs @@ -86,7 +86,7 @@ bool LogCompletion(HttpContext httpContext, DiagnosticContextCollector collector // Enrich diagnostic context _enrichDiagnosticContext?.Invoke(_diagnosticContext, httpContext); - if (!collector.TryComplete(out var collectedProperties)) + if (!collector.TryComplete(out var collectedProperties, out var collectedException)) collectedProperties = NoProperties; // Last-in (correctly) wins... @@ -98,7 +98,7 @@ bool LogCompletion(HttpContext httpContext, DiagnosticContextCollector collector new LogEventProperty("Elapsed", new ScalarValue(elapsedMs)) }); - var evt = new LogEvent(DateTimeOffset.Now, level, ex, _messageTemplate, properties); + var evt = new LogEvent(DateTimeOffset.Now, level, ex ?? collectedException, _messageTemplate, properties); logger.Write(evt); return false; diff --git a/test/Serilog.AspNetCore.Tests/SerilogWebHostBuilderExtensionsTests.cs b/test/Serilog.AspNetCore.Tests/SerilogWebHostBuilderExtensionsTests.cs index e3ba4a0..0193263 100644 --- a/test/Serilog.AspNetCore.Tests/SerilogWebHostBuilderExtensionsTests.cs +++ b/test/Serilog.AspNetCore.Tests/SerilogWebHostBuilderExtensionsTests.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; using Serilog.Filters; using Serilog.AspNetCore.Tests.Support; @@ -65,7 +66,51 @@ public async Task RequestLoggingMiddlewareShouldEnrich() Assert.True(completionEvent.Properties.ContainsKey("Elapsed")); } - WebApplicationFactory Setup(ILogger logger, bool dispose, Action configureOptions = null) + [Fact] + public async Task RequestLoggingMiddlewareShouldEnrichWithCollectedExceptionIfNoUnhandledException() + { + var diagnosticContextException = new Exception("Exception set in diagnostic context"); + var (sink, web) = Setup(options => + { + options.EnrichDiagnosticContext += (diagnosticContext, _) => + { + diagnosticContext.SetException(diagnosticContextException); + }; + }); + + await web.CreateClient().GetAsync("/resource"); + + var completionEvent = sink.Writes.First(logEvent => Matching.FromSource()(logEvent)); + + Assert.Same(diagnosticContextException, completionEvent.Exception); + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public async Task RequestLoggingMiddlewareShouldEnrichWithUnhandledExceptionEvenIfExceptionIsSetInDiagnosticContext(bool setExceptionInDiagnosticContext) + { + var diagnosticContextException = new Exception("Exception set in diagnostic context"); + var unhandledException = new Exception("Unhandled exception thrown in API action"); + var (sink, web) = Setup(options => + { + options.EnrichDiagnosticContext += (diagnosticContext, _) => + { + if (setExceptionInDiagnosticContext) + diagnosticContext.SetException(diagnosticContextException); + }; + }, actionCallback: _ => throw unhandledException); + + Func act = () => web.CreateClient().GetAsync("/resource"); + + Exception thrownException = await Assert.ThrowsAsync(act); + var completionEvent = sink.Writes.First(logEvent => Matching.FromSource()(logEvent)); + Assert.Same(unhandledException, completionEvent.Exception); + Assert.Same(unhandledException, thrownException); + } + + WebApplicationFactory Setup(ILogger logger, bool dispose, Action configureOptions = null, + Action actionCallback = null) { var web = _web.WithWebHostBuilder( builder => builder @@ -80,14 +125,19 @@ WebApplicationFactory Setup(ILogger logger, bool dispose, Action { app.UseSerilogRequestLogging(configureOptions); - app.Run(_ => Task.CompletedTask); // 200 OK + app.Run(ctx => + { + actionCallback?.Invoke(ctx); + return Task.CompletedTask; + }); // 200 OK }) .UseSerilog(logger, dispose)); return web; } - (SerilogSink, WebApplicationFactory) Setup(Action configureOptions = null) + (SerilogSink, WebApplicationFactory) Setup(Action configureOptions = null, + Action actionCallback = null) { var sink = new SerilogSink(); var logger = new LoggerConfiguration() @@ -95,9 +145,9 @@ WebApplicationFactory Setup(ILogger logger, bool dispose, Action Date: Thu, 3 Mar 2022 13:14:10 +0100 Subject: [PATCH 4/6] Upgrade to Serilog.Extensions.Hosting 4.2.1-dev-00092 --- src/Serilog.AspNetCore/Serilog.AspNetCore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj index 9764351..e9f048d 100644 --- a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj +++ b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj @@ -30,7 +30,7 @@ - + From 532fd1b5d18805832b7ef69ed99b3ef5ed438ca9 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sat, 5 Mar 2022 07:38:38 +1000 Subject: [PATCH 5/6] Bump major version; breaking changes in #271 --- src/Serilog.AspNetCore/Serilog.AspNetCore.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj index e9f048d..7e3549e 100644 --- a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj +++ b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj @@ -2,7 +2,7 @@ Serilog support for ASP.NET Core logging - 5.0.1 + 6.0.0 Microsoft;Serilog Contributors netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 true @@ -30,7 +30,7 @@ - + From 91080dff4046f2d77f96653cf6d13953b3f1ae72 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Fri, 15 Jul 2022 08:53:29 +1000 Subject: [PATCH 6/6] Version 5.0.0 of Serilog.Extensions.Hosting is now released --- src/Serilog.AspNetCore/Serilog.AspNetCore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj index 7e3549e..0dfd0d5 100644 --- a/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj +++ b/src/Serilog.AspNetCore/Serilog.AspNetCore.csproj @@ -30,7 +30,7 @@ - +