Как включить переопределения минимального уровня Serilog без особого соглашения о вызове ForContext? - PullRequest
0 голосов
/ 23 апреля 2020

В этой статье о переопределениях минимального уровня Serilog говорится:

Первый аргумент Override - это префикс исходного контекста, который обычно сопоставляется с именем типа, уточненным в пространстве имен класс, связанный с регистратором.

Для этого так называемого "нормального" поведения, не нужно ли мне вручную вручную устанавливать .ForContext<>() для каждого класса, из которого вызывается мой регистратор? Другими словами, как специфицированные для пространства имен c минимальные уровни журнала должны работать без специального c соглашения о том, как устанавливается .ForContext?

Если это имеет смысл, то как я могу автоматически установить ForContext без вызова с другим аргументом везде?

1 Ответ

3 голосов
/ 23 апреля 2020

Для этого так называемого "нормального" поведения, не нужно ли мне вручную устанавливать .ForContext <> () по-разному для каждого класса, из которого вызывается мой регистратор?

Да, вы бы. Обычный способ сделать это - использовать Log.ForContext<T>() в каждом классе в переменной-члене, которая используется совместно для различных методов вашего класса (так что все журналы записываются в одном и том же контексте). например,

public class SomeService
{
    private readonly ILogger _log = Log.ForContext<SomeService>();
    // ...
}

public class SomeRepository
{
    private readonly ILogger _log = Log.ForContext<SomeRepository>();
    // ...
}

Если вы используете контейнер Io C, такой как Autofa c, вы можете сделать так, чтобы вызов .ForContext<>() происходил автоматически, когда классы разрешаются Io C контейнер (например, с помощью инжектора конструктора).

Если вы используете Autofa c специально, вы можете использовать AutofacSerilogIntegration , который заботится о который. Могут быть аналогичные реализации для других контейнеров Io C (или вам придется реализовать свой собственный).

Если вы используете хост Generi c от Microsoft, вам необходимо настроить его на используйте пользовательский ServiceProviderFactory, который будет отвечать за создание экземпляров и вызов .ForContext<>() ... Простой способ - интегрировать Autofa c с Generi * 1036 от Microsoft Хост , а затем использовать AutofacSerilogIntegration Я упоминал выше.

...