首页 > 解决方案 > Serilog 使用 EnrichDiagnosticContext 并没有在 SignalR Hub 中记录其他属性

问题描述

我最近在使用 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-5serilog

解决方案


它不适用于signalR。

在屏幕后面,app.UseSerilogRequestLogging使用请求管道中的中间件,RequestLoggingMiddleware您可以在此处详细看到该调用。

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


推荐阅读