[英]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();
在此示例中, Console
是LoggerSinkConfiguration
的擴展方法(因此,它將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.