【问题标题】:Serilog using EnrichDiagnosticContext with additional properties not being logged in SignalR Hub使用 EnrichDiagnosticContext 的 Serilog 未在 SignalR Hub 中记录其他属性
【发布时间】:2021-08-23 23:36:59
【问题描述】:

我最近在使用 SignalR 的 ASP.NET Core/.NET5 Web 应用程序中实现了 Serilog 日志记录。我正在使用 Elasticsearch 接收器,一切都按预期工作。我决定添加一些额外的 HttpContext 属性来记录每个请求,所以我在 StartUp.cs 中将调用扩展到 UseSerilogRequestLogging() 以丰富诊断上下文额外的属性(主要是因为这似乎是最简单的方法):

app.UseSerilogRequestLogging(options =>
{
    options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
    {
        diagnosticContext.Set("HttpRequestClientIP", httpContext.Connection.RemoteIpAddress);
        diagnosticContext.Set("UserName", httpContext.User?.Identity?.Name == null ? "(anonymous)" : httpContext.User.Identity.Name);
    };
});

起初,这似乎按预期工作,直到我注意到它并不总是工作。我真的希望在所有写入的日志记录上记录额外的属性,并且当典型的 HTTP GET、HTTP POST 等发生时,它似乎可以在 Serilog 自动写入的日志记录上正常工作......但在我的 Signalr Hub 类中,我有几个地方我手动编写自己的日志记录,例如 Logger.Log(LogLevel.Information, "whatever.."),但这些记录中根本不存在这些额外的属性。

我在这里缺少什么?是不是因为在 Signalr Hub 中导致它们不可用?或者我的 Logger.Log() 调用可能有问题?

任何想法将不胜感激。 谢谢-

【问题讨论】:

    标签: asp.net-core .net-5 serilog


    【解决方案1】:

    它不适用于 signalR。

    在屏幕后面,app.UseSerilogRequestLogging 在请求管道中使用了一个中间件,它调用了RequestLoggingMiddleware,您可以详细看到here

    SignalR 使用第一个 Http 请求设置连接到 websocket,这根本不会通过管道。因此,与您用于注销请求的RequestLoggingMiddleware 没有任何关系。

    【讨论】:

      【解决方案2】:

      我最终选择了几个定制的 Enrichers。我确实对中间件与丰富器进行了简单的实验,它们似乎都按预期工作。两者都始终将附加属性添加到所有日志条目。我仍然不太确定我理解为什么 DiagnosticContext 选项的行为方式如此,除非它仅仅是因为有问题的日志记录在作为@Gordon Khanh Ng 的 SignalR 集线器中。张贴。但是,如果这是问题的根源,您不会认为丰富器或中间件也可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        相关资源
        最近更新 更多