是否可以将一些日志记录的“范围变量”传递给.NET日志消息,而这些变量不在消息中?

92dk7w1h  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(111)

我希望为单个日志消息提供一些额外的 meta数据(又名范围变量)。
但是日志消息没有链接到任何作用域变量。那我该怎么做呢
例如。

var userId = 1;
var userName = "Leia";

_logger.LogInformation("Saved user.");

那么我如何将userIduserName传递给该日志消息,但我不想在该日志消息文本中打印这些值 *。
因为我使用的是SEMANTICLOGGING(幕后/logger),所以我可以很容易地看到与每个日志消息相关联的所有 meta数据。
这可能吗?

bpzcxfmw

bpzcxfmw1#

你可以尝试使用scopes。内置日志基础设施和许多第三方日志提供商使用此或类似的抽象:

var services = new ServiceCollection();
services.AddLogging(builder => builder.AddJsonConsole(opts=> opts.IncludeScopes = true));
var sp = services.BuildServiceProvider();
var logger = sp.GetRequiredService<ILogger<Tests>>();
using var _ = logger.BeginScope(new Dictionary<string, object>
{
    { "ScopedId", 1 }
});
logger.LogError("Test");

输出消息:

{
   "EventId":0,
   "LogLevel":"Error",
   "Category":"NET7Tests.Tests",
   "Message":"Test",
   "State":{
      "Message":"Test",
      "{OriginalFormat}":"Test"
   },
   "Scopes":[
      {
         "Message":"System.Collections.Generic.Dictionary\u00602[System.String,System.Object]",
         "ScopedId":1
      }
   ]
}

阅读更多:

相关问题