簡體   English   中英

Serilog JSON配置中的“使用”有什么作用?

[英]What does “Using” in Serilog JSON configuration do?

在Serilog JSON配置中(例如,.Net Core環境中的AppSettings.json文件),實際Using做什么的?

讓我們以以下配置為例:

"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"
  }
}

在上面的示例中,我們使用了File器,而沒有將其添加到Using屬性。 但是,一切似乎都正常。

因此,我無法確切理解為什么我們基本上需要Using 有人可以向我解釋嗎?

Serilog.Settings.Configuration的文檔中Serilog.Settings.Configuration進行了Serilog.Settings.Configuration

(此軟件包使用DependencyContext實現了一個約定,以在名稱中的任意位置查找任何帶有Serilog軟件包,並Serilog提取配置方法,因此上述“ Using示例是多余的。)

這意味着它用於定義用於定位Serilog接收器的程序包,但是在使用Serilog.Settings.Configuration程序包時是多余的。


更多信息

我已經看過Serilog源代碼,以便能夠提供有關Using確切功能以及為什么首先需要Using它的更多信息。 希望以下說明對您有所幫助。

考慮以下基於代碼的設置:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

在此示例中, ConsoleLoggerSinkConfiguration的擴展方法(因此,它將LoggerSinkConfiguration的實例作為第一個參數)。 使用這種基於代碼的方法時,僅當在引用的程序集中可以找到此擴展方法時,才會編譯代碼。

接下來,考慮以下方法,該方法使用基於IConfiguration的方法:

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(someConfiguration)
    .CreateLogger();
{
    "Serilog": {
        "Using": ["Serilog.Sinks.Console"], // Redundant.
        "WriteTo": ["Console"]
    }
}

在此示例中,編譯過程不知道JSON字符串值"Console"是指什么,因此需要一個可以從字符串"Console"轉到上述Console()擴展方法的過程。 為此,Serilog需要首先在運行時 找到擴展方法(在此示例中,該方法位於 Serilog.Sinks.Console程序Serilog.Sinks.Console )。

此查找過程是使用反射完成的,該反射進行了一些程序集掃描以查找將LoggerSinkConfiguration作為其第一個參數的public static方法 您在問題中詢問過的Using指令是一種機制,可幫助您確定在查找這些擴展方法時應准確掃描哪些程序集

如文檔所述,基於IConfiguration的方法使用DependencyContext自動掃描名稱中具有Serilog程序集 由於Serilog.Sinks.Console 確實具有Serilog的名稱,因此無需將其添加到Using指令。 使用這種方法時,您還可以選擇提供自己的DependencyContext實例 ,因此在尋找接收器時可能需要明確說明要掃描的程序集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM