当前位置:首页 > Web开发 > 正文

则可以以相同的方式实现其他过滤器

2024-03-31 Web开发

第4部分-从Serilog请求记录中排除运行状况查抄端点

作者:依乐祝

译文地点:https://www.cnblogs.com/yilezhu/p/12243984.html

原文地点:https://andrewlock.net/using-serilog-aspnetcore-in-asp-net-core-3-logging-mvc-propertis-with-serilog/

在我上篇文章中,我描述了如何配置Serilog的RequestLogging中间件以向Serilog的请求日志摘要中添加其他属性(例如请求主机名或选定的端点名称)。这些属性都在HttpContext中可用,因此可以由中间件自己直接添加。

其他属性,例如MVC特定的成果,像操纵要领ID,RazorPages措置惩罚惩罚措施名称或ModelValidationState,仅在MVC上下文中可用,因此Serilog的中间件不能直接访谒。

在本文中,我将展示如何创建action/page过滤器来为您记录这些属性,以便中间件可以在后续创建日志时访谒。

Serilog的创建者Nicholas Blumhardt之前已经解决了这个话题。解决方案非常相似,尽管他在他的示例中创建了一个特性,您可以使用该特性来装饰actions/controllers。我在本文中跳过了这种要领,并要求将其全局应用,我但愿这将是常见的解决方案。

记录来自MVC的其他信息

就目前而言,ASP.NET Core中的一个特征是许多行为被MVC“根本布局”锁定在了MVC框架内部来实现。端点路由是给与MVC成果并将其下移到核心框架中的首要事情之一。ASP.NET Core团队一直在努力将更多MVC特定成果(例如模型绑定或操纵功效)从MVC中移除,然后“下推”到核心框架中。有关此内容的更多信息,请参见Ryan Nowak在NDC上对Houdini项目的讨论。

但是,就目前情况而言,MVC内仍然存在一些不容易从应用措施其他部分访谒的特性。当我们考虑到我们的Serilog的请求记录中间件的时候,这意味着有些属性我们也是不容易记录的。例如:

HandlerName(OnGet)

ActionId(1fbc88fa-42db-424f-b32b-c2d0994463f1)

ActionName (MyController.SomeApiMethod (MyTestApp))

RouteData({action = "SomeApiMethod", controller = "My", page = ""})

ValidationState(True/ False)

在上一篇文章中我展示了如何使用RequestLogging中间件的扩展要领通过使用IDiagnosticContext将附加属性写入Serilog的请求日志中。这也仅适用于在HttpContext可用的值。在这篇文章中,我将展示如安在过滤器中使用IDiagnosticContext,以及将MVC特定值添加到日志中。我还将展示如安在中添加RazorPages特定的值(如HandlerName)。

使用自界说过滤器记录MVC属性

过滤器相当于为每个请求运行的类似于MVC的微型中间件管道。.NET Core MVC中有多种类型的过滤器,每种类型的过滤器在MVC过滤器管道中的有着差此外用途(有关更多详细信息,请参见此文章)。在本文中,我们将使用最常见的过滤器之一,即Action过滤器。

Action过滤器在执行MVC操纵要领之前和之后运行。他们可以访谒许多MVC属性的值,例如正在执行的Action及其将被挪用的参数。

下面的Action过滤器直接实现IActionFilter。该OnActionExecuting要领在挪用action要领之前被挪用,并将特别的MVC特定属性添加到通过结构函数传入的IDiagnosticContext中。

public class SerilogLoggingActionFilter : IActionFilter { private readonly IDiagnosticContext _diagnosticContext; public SerilogLoggingActionFilter(IDiagnosticContext diagnosticContext) { _diagnosticContext = diagnosticContext ?? throw new ArgumentNullException(nameof(diagnosticContext)); } public void OnActionExecuting(ActionExecutingContext context) { _diagnosticContext.Set("RouteData", context.ActionDescriptor.RouteValues); _diagnosticContext.Set("ActionName", context.ActionDescriptor.DisplayName); _diagnosticContext.Set("ActionId", context.ActionDescriptor.Id); _diagnosticContext.Set("ValidationState", context.ModelState.IsValid); } // Required by the interface public void OnActionExecuted(ActionExecutedContext context) { } }

在将MVC处事添加到应用措施中时,可以在以下位置全局注册过滤器Startup.ConfigureServices():

public void ConfigureServices(IServiceCollection services) { services.AddControllers(opts => { opts.Filters.Add<SerilogLoggingPageFilter>(); }); // ... other service registration }

无论你使用AddControllers,AddControllersWithViews,AddMvc,或AddMvcCore的方法你都可以给与同样的方法来添加全局过滤器。

有了这个配置之后,如果你挪用一个MVC控制器,你在Serilog的请求日志动静中会看到特别的数据(ActionName,ActionId,和RouteData,ValidationState)记录:

技术图片

您可以在此处将所需的任何其他数据添加到日志中。只需注意记录参数值-切记不要记录敏感或小我私家身份信息!

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30865.html