From 78fc810af957e8fe6ee871426aa6b1549c4e3f46 Mon Sep 17 00:00:00 2001 From: Rolf Kristensen Date: Mon, 28 Jul 2025 10:46:19 +0200 Subject: [PATCH] aspnet-request-endpoint-name - EndPoint Metadata Name --- .../Internal/AssemblyExtensionTypes.cs | 1 + .../Internal/AssemblyExtensionTypes.tt | 1 + ...AspNetRequestEndPointNameLayoutRenderer.cs | 30 +++++++++++++ ...tRequestEndPointNameLayoutRendererTests.cs | 44 +++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 src/NLog.Web.AspNetCore/LayoutRenderers/AspNetRequestEndPointNameLayoutRenderer.cs create mode 100644 tests/NLog.Web.AspNetCore.Tests/LayoutRenderers/AspNetRequestEndPointNameLayoutRendererTests.cs diff --git a/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.cs b/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.cs index 153a3237..0a689dad 100644 --- a/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.cs +++ b/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.cs @@ -112,6 +112,7 @@ public static void RegisterTypes(this NLog.Config.ISetupExtensionsBuilder setupB setupBuilder.RegisterLayoutRenderer("aspnet-request-servervariable"); setupBuilder.RegisterLayoutRenderer("aspnet-request-endpoint"); setupBuilder.RegisterLayoutRenderer("aspnet-request-endpoint-group"); + setupBuilder.RegisterLayoutRenderer("aspnet-request-endpoint-name"); #endif #pragma warning restore CS0618 // Type or member is obsolete diff --git a/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.tt b/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.tt index 98dffebe..f5c4fe8c 100644 --- a/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.tt +++ b/src/NLog.Web.AspNetCore/Internal/AssemblyExtensionTypes.tt @@ -128,6 +128,7 @@ namespace NLog.Web.Internal setupBuilder.RegisterLayoutRenderer("aspnet-request-servervariable"); setupBuilder.RegisterLayoutRenderer("aspnet-request-endpoint"); setupBuilder.RegisterLayoutRenderer("aspnet-request-endpoint-group"); + setupBuilder.RegisterLayoutRenderer("aspnet-request-endpoint-name"); #endif #pragma warning restore CS0618 // Type or member is obsolete diff --git a/src/NLog.Web.AspNetCore/LayoutRenderers/AspNetRequestEndPointNameLayoutRenderer.cs b/src/NLog.Web.AspNetCore/LayoutRenderers/AspNetRequestEndPointNameLayoutRenderer.cs new file mode 100644 index 00000000..583b4b43 --- /dev/null +++ b/src/NLog.Web.AspNetCore/LayoutRenderers/AspNetRequestEndPointNameLayoutRenderer.cs @@ -0,0 +1,30 @@ +#if NETCOREAPP3_0_OR_GREATER + +using System; +using System.Text; +using NLog.LayoutRenderers; +using NLog.Web.Internal; + +namespace NLog.Web.LayoutRenderers +{ + /// + /// ASP.NET request EndPoint Name. Metadata-attribute assigned by WithName or [EndpointName] + /// + /// + /// ${aspnet-request-endpoint-name} + /// + /// Documentation on NLog Wiki + [LayoutRenderer("aspnet-request-endpoint-name")] + public class AspNetRequestEndPointNameLayoutRenderer : AspNetLayoutRendererBase + { + /// + protected override void Append(StringBuilder builder, LogEventInfo logEvent) + { + var endPoint = HttpContextAccessor?.HttpContext.TryGetFeature()?.Endpoint; + var endPointGroup = endPoint?.Metadata.GetMetadata(); + builder.Append(endPointGroup?.EndpointName); + } + } +} + +#endif \ No newline at end of file diff --git a/tests/NLog.Web.AspNetCore.Tests/LayoutRenderers/AspNetRequestEndPointNameLayoutRendererTests.cs b/tests/NLog.Web.AspNetCore.Tests/LayoutRenderers/AspNetRequestEndPointNameLayoutRendererTests.cs new file mode 100644 index 00000000..0556860a --- /dev/null +++ b/tests/NLog.Web.AspNetCore.Tests/LayoutRenderers/AspNetRequestEndPointNameLayoutRendererTests.cs @@ -0,0 +1,44 @@ +#if NETCOREAPP3_0_OR_GREATER +using NLog.Web.LayoutRenderers; +using Microsoft.AspNetCore.Connections.Features; +using Microsoft.AspNetCore.Http.Features; +using NSubstitute; +using Xunit; + +namespace NLog.Web.Tests.LayoutRenderers +{ + public class AspNetRequestEndPointNameLayoutRendererTests : LayoutRenderersTestBase + { + [Fact] + public void SuccessTest() + { + // Arrange + var (renderer, httpContext) = CreateWithHttpContext(); + var endPointFeature = Substitute.For(); + var endPointMetaData = new Microsoft.AspNetCore.Http.EndpointMetadataCollection(new Microsoft.AspNetCore.Routing.EndpointNameMetadata("42")); + endPointFeature.Endpoint.Returns(new Microsoft.AspNetCore.Http.Endpoint(null, endPointMetaData, "DisplayName")); + + var featureCollection = new FeatureCollection(); + featureCollection.Set(endPointFeature); + + httpContext.Features.Returns(featureCollection); + // Act + var result = renderer.Render(new LogEventInfo()); + // Assert + Assert.Equal("42", result); + } + + [Fact] + public void NullTest() + { + // Arrange + var (renderer, httpContext) = CreateWithHttpContext(); + httpContext.Features.Returns(new FeatureCollection()); + // Act + var result = renderer.Render(new LogEventInfo()); + // Assert + Assert.Equal(string.Empty, result); + } + } +} +#endif