asp.net-core - 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() 调用可能有问题?
任何想法,将不胜感激。谢谢-
解决方案
它不适用于signalR。
在屏幕后面,app.UseSerilogRequestLogging
使用请求管道中的中间件,RequestLoggingMiddleware
您可以在此处详细看到该调用。
SignalR 使用第一个 Http 请求设置连接到 websocket,这根本不会通过管道。RequestLoggingMiddleware
因此,与您用于注销请求的没有任何关系。
推荐阅读
- zsh - ZSH 补全分隔符
- ruby-on-rails - 使用 cancancan gem 后无法用图像保存对象
- javascript - AJAX 回调看不到 jQuery 插件的方法
- javascript - 如何将数据与 React native 和多对多 firebase firestore 集合关系结合起来?
- angular - 在两个组件Angular 7之间共享数据
- c# - 尝试添加到数据库:集合已修改;枚举操作可能无法执行?
- java - 如何在 Java 中读取两个点运算符?
- c - 如何使用函数按字典顺序排列拆分命令行参数?
- c# - WPF/DataGrid:绑定到不同的属性以进行显示和编辑
- javascript - 日期选择器天数不显示