小编Mas*_*ton的帖子

控制请求对象解构的选项

我遇到了一个问题,我正在努力寻找一个干净的解决方案,谷歌搜索并没有让我变得更聪明。

情况

(1) 我们有自己的程序集,用于为我们的任何项目(一致的日志输出、主题等)设置和添加 Serilog 记录器,并且该程序集没有对任何消耗项目(位于不同的存储库中)的引用。让我们称之为CompanySerilog大会。

(2) 消费项目之一是外部可访问的 API,其“合同”对象在 ExternalContracts 程序集中定义。即请求和响应对象,以及用作这些对象一部分的任何枚举。可以将此 ExternalContracts 程序集提供给针对 API 进行集成的开发人员。

(3) 我们要记录所有请求,并使用一个IActionFilter使用 Serilog 结构化日志记录方法注销每个请求对象。例如循环遍历上下文中的每个参数并最终执行_logger.LogDebug("With {name} of {@requestObject}", name, value);

问题

一些请求对象具有我们想要屏蔽的敏感数据,但是:

  • 创造记录仪时,我们可以定义解构的方法CompanySerilog使用标准的.Destructure扩展,但不知道,或者想知道,要求的具体对象,因为这些可能是从Api1Api2等等,这将意味着要添加到每一个参考消耗项目。
  • 我们可以向我们的请求对象 ( Destructurama.Attributed)添加属性,但这意味着我们的ExternalContracts程序集现在需要对该 NuGet 包的引用,而后者又需要对所有必需的 Serilog 包的引用。严格来说,ExternalContracts 程序集中不需要日志记录问题:这是我们的问题,而不是我们 API 的使用者

正如我所说,我一直在努力想出解决这个问题的方法,但在使用 IDestructuringPolicy 以及它是否合适,或者转换是否应该发挥作用方面找不到太多信息。到目前为止,我只能想到以下选项,但我希望其他人遇到了这个问题,并且有一种非常聪明和干净的方式来支持这个用例。

解决方案?

  • 停止进行结构化日志记录,只需ToString()为每个请求对象定义一个掩蔽我们不想记录的值。这很简单,不需要讨厌的项目交叉引用或将日志记录问题添加到外部合同中。但这确实意味着不可能进行结构化日志记录。

  • 将所有需要的日志引用添加到外部合约中。这将允许我们继续使用内置销毁,但意味着我们 API 的使用者将拥有一个包含日志程序集的 ExternalContracts 程序集

  • 通过引用将使用此程序集的每个项目,.Destructure在配置登录时设置值CompanySerilog。不会发生!

  • 还有什么?请!

c# serilog asp.net-core

10
推荐指数
1
解决办法
2634
查看次数

System.Diagnostics.Activity 在 aspnet 核心 2.1 中为空

我们刚刚将一个 aspnet 核心 2.0 应用程序更新到 2.1 并且遇到了我们使用/依赖System.Diagnostics.Activity.

背景

我们希望跨服务边界传递一致的“相关 ID”,以便我们可以关联每个请求的日志条目。

我们采取的方法是:

  • 向中间件管道添加诊断侦听器 Microsoft.AspNetCore.Hosting.HttpRequestIn.Start

  • 调用此侦听器时,检查 context.request 中是否有名为“Request-Id”的标头,如果没有,则添加一个值为 Activity.Current.Id

  • 另一个中间件负责将“Request-Id”标头值推送到日志记录上下文中

这在 2.0 中工作得很好,并且它的层次结构Activity.Current.Id意味着我们可以将不同服务和层的日志条目关联起来。在 2.1 中,我们现在收到异常,因为Activity.Current在请求的入口点似乎始终为空(即命中的第一个服务,在本例中为 API)。

我没有找到任何信息表明只要 HttpRequest 进入,活动就不再自动启动,但这似乎正在发生。有没有人能够阐明发生了什么变化和/或我们做错了什么?

一些代码

启动配置方法...

public void Configure(IApplicationBuilder app, IHostingEnvironment env, DiagnosticListener diagnosticListener)
        {
           diagnosticListener.SubscribeWithAdapter(new HttpRequestInDiagnosticListener());
           app.UseMiddleware<SetRequestIdHeaderForHttpRequestInMiddleware>();

            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();
            else
                app.UseStatusCodePages();

            app.UseSecurityHeaders(Headers.AddSecurityHeaders());

            app.UseMvc();
        }
Run Code Online (Sandbox Code Playgroud)

...以及涉及的自定义类

    public class HttpRequestInDiagnosticListener
    {
        [DiagnosticName("Microsoft.AspNetCore.Hosting.HttpRequestIn.Start")]
        public virtual void OnMiddlewareStarting(HttpContext httpContext)
        {
            Console.WriteLine($"Middleware Starting, path: {httpContext.Request.Path}");
        }
    }

    public class SetRequestIdHeaderForHttpRequestInMiddleware
    {
        private readonly RequestDelegate …
Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core

7
推荐指数
1
解决办法
3155
查看次数

标签 统计

asp.net-core ×2

c# ×2

.net-core ×1

serilog ×1