Moh*_*din 4 c# serilog .net-core
Using在 Serilog JSON 配置中(例如在 .Net Core 环境中的 AppSettings.json 文件中)实际上做了什么?
让我们以这个配置为例:
"Serilog": {
  "Using": [ "Serilog.Sinks.Console" ], <=======***HERE***=========
  "MinimumLevel": "Debug",
  "WriteTo": [
    { "Name": "Console" },
    {
      "Name": "RollingFile",
      "Args": {
        "pathFormat": "logs\\log-{Date}.txt",
        "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
  "Properties": {
    "Application": "My Application"
  }
}
在上面的例子中,我们使用了Filesink 而没有将其添加到Using属性中。但是,一切似乎都正常。
所以我不明白为什么我们基本上需要这个Using。有人可以向我解释一下吗?
Kir*_*kin 10
这在以下文档中进行了介绍Serilog.Settings.Configuration:
(这个包实现了一个约定,
DependencyContext用于查找Serilog名称中包含任何位置的任何包并从中提取配置方法,因此Using上面的示例是多余的。)
这意味着它用于定义用于定位 Serilog sinks 的Serilog.Settings.Configuration包,但在使用包时它是多余的。
更多信息
我已经查看了 Serilog 源代码,以便能够提供更多关于究竟是什么Using以及为什么首先可能需要它的信息。我希望下面的解释有帮助。
考虑以下基于代码的设置:
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();
在本例中,Console是 的扩展方法LoggerSinkConfiguration(因此它的第一个参数是 的实例LoggerSinkConfiguration)。使用这种基于代码的方法时,只有在引用的程序集中可以找到此扩展方法时,代码才会编译。
接下来,考虑以下使用IConfiguration-based 方法的方法:
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(someConfiguration)
    .CreateLogger();
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();
在这个例子中,编译过程不知道 JSON 字符串值"Console"指的是什么,因此需要一个可以从字符串"Console"到上述Console()扩展方法的过程。为了做到这一点,Serilog 需要首先在运行时找到扩展方法(在这个例子中,它存在于Serilog.Sinks.Console程序)。
这个查找过程是使用反射完成的,它会进行一些汇编扫描以查找public static将 a 作为其第一个参数的方法LoggerSinkConfiguration。Using您在问题中询问的指令是一种机制,用于帮助确定在查找这些扩展方法时应该扫描哪些程序集。
作为文档状态,在IConfiguration基础的方法使用DependencyContext,以具有自动扫描组件Serilog在他们的名字。因为Serilog.Sinks.Console 确实有Serilog其名,没有必要把它添加到Using指令。使用此方法时,您还可以选择提供自己的DependencyContext实例,因此您可能需要明确说明在查找接收器时要扫描的程序集。