我最近在使用SignalR的ASP.NET Core/.NET5 web应用程序中实现了Serilog日志记录。我正在使用Elasticsearch水槽,一切基本上都如预期的那样工作。我决定添加一些额外的HttpContext属性来记录每个请求,所以我在StartUp.cs中将调用扩展到UseSerialRequestLogging(),以便用几个额外的属性来丰富诊断上下文(主要是因为这似乎是最简单的方法):
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()调用有问题?
任何想法都将不胜感激。谢谢-
它不适用于signalR。
在屏幕后面,app.UseSerilogRequestLogging
使用了请求管道中的中间件,该中间件调用RequestLoggingMiddleware
,您可以在这里详细看到。
SignalR使用第一个Http请求来设置到websocket的连接,这根本不会通过管道。因此,与用于注销请求的RequestLoggingMiddleware
没有任何关系。
我最终选择了几个自定义的Enrichers。我对中间件和Enricher做了简短的实验,它们似乎都能像预期的那样工作。两者总是将附加属性添加到所有日志条目中。我仍然不太确定我是否理解为什么DiagnosticContext选项的行为方式,除非这只是因为@Gordon Khanh Ng.发布的登录问题是在SignalR中心。如果这是问题的根源,那么你不会认为enricher或中间件也能工作。