Для этого так называемого "нормального" поведения, не нужно ли мне вручную устанавливать .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 Я упоминал выше.