К сожалению, Serilog не раскрывает список настроенных раковин, поэтому на данный момент единственным вариантом будет использование Reflection.
Если вы возьметесь за Исходный код Serilog ,вы увидите, что группирует все настроенные приемники в экземпляр внутреннего класса SafeAggregateSink
, который отвечает за отправку журналов в настройку различных приемников, и содержит массив со всемисконфигурированные приемники в приватном поле с именем _sinks
.
Вот простой пример:
var log = new LoggerConfiguration()
.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Verbose)
.WriteTo.File(path: "log.txt", restrictedToMinimumLevel: LogEventLevel.Verbose)
.CreateLogger();
var aggregateSinkFieldInfo = log.GetType()
.GetField("_sink", BindingFlags.Instance | BindingFlags.NonPublic);
var aggregateSink = (ILogEventSink)aggregateSinkFieldInfo?.GetValue(log);
var sinkEnumerableFieldInfo = aggregateSink?.GetType()
.GetField("_sinks", BindingFlags.Instance | BindingFlags.NonPublic);
var sinks = (ILogEventSink[])sinkEnumerableFieldInfo?
.GetValue(aggregateSink);
if (sinks != null)
{
foreach (var sink in sinks)
{
Console.WriteLine(sink.GetType().FullName);
}
}
Это должно привести к выводу:
Serilog.Sinks.SystemConsole.ConsoleSink
Serilog.Sinks.File.FileSink
NB: Сохранить впомните, что в некоторых случаях Serilog оборачивает раковины, поэтому вам, возможно, придется с этим справиться, прежде чем вы сможете найти раковину, которую ищете.Например, если вы ограничите минимальный уровень приемника, ваш приемник будет обернут в RestrictedSink
, поэтому вам нужно взять его поле _sink
, чтобы получить «реальный»"раковина, которую вы ищете.