Что делает «Использование» в конфигурации Serilog JSON? - PullRequest
0 голосов
/ 15 декабря 2018

Что на самом деле Using делает в конфигурации Serilog JSON (например, в файле AppSettings.json в среде .Net Core)?

Давайте рассмотрим эту конфигурацию, например:

"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 sink БЕЗ , добавляя его к атрибуту Using.Тем не менее, кажется, что все работает хорошо.

Так что я не могу точно понять, зачем нам это нужно Using.Может кто-нибудь объяснить мне, пожалуйста?

1 Ответ

0 голосов
/ 16 декабря 2018

Это описано в документации для Serilog.Settings.Configuration:

(Этот пакет реализует соглашение, использующее DependencyContext для поиска любого пакета с Serilog в любом местеname и извлекает из него методы конфигурации, поэтому приведенный выше пример Using является избыточным.)

Это означает, что он используется для определения пакетов, используемых для поиска приемников Serilog, но он избыточен при использованииSerilog.Settings.Configuration пакет.


Дополнительная информация

Я посмотрел исходный код Serilog, чтобы иметь возможность предоставить больше информации о точномчто делает 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).

Этот процесс поиска выполняется с использованием отражения, которое немного сканирует сборку, чтобы найти public static методов, которые принимают в качестве своего первого параметра LoggerSinkConfiguration.Директива Using, о которой вы спрашивали в своем вопросе, - это механизм , помогающий точно определить, какие сборки следует сканировать при поиске этих методов расширения.

Как указано в документации,Подход на основе IConfiguration использует DependencyContext, чтобы автоматически сканировать сборки, в имени которых Serilog .Поскольку Serilog.Sinks.Console имеет в названии Serilog, нет необходимости добавлять это в директиву Using.У вас также есть возможность предоставить свой собственный DependencyContext экземпляр при использовании этого подхода, поэтому вам может потребоваться указать, какие сборки нужно сканировать при поиске приемников.

...