Мне нужно временно отключить ведение журнала для некоторой области. В моем случае есть фоновая задача, которая периодически пытается создать экземпляр API какого-либо устройства для каждого доступного COM-порта в системе и проверяет, не выходит ли он из строя. Этот API записывает много информации в журнал в случае сбоя (исключения, вызовы Dispose внутренних компонентов и т. Д.). В результате журнал переполняется ошибками таких неудачных попыток каждую секунду.
Я придумал решение, которое использует LogContext.PushProperty
для идентификации подавленных событий журнала. Однако следующий код ничего не регистрирует:
internal static class Program
{
public static void Main(String[] args)
{
void StartListeningSomething()
{
Task.Factory.StartNew(() =>
{
while (true)
{
Log.Information("Listening");
Thread.Sleep(500);
}
}, TaskCreationOptions.LongRunning);
}
Log.Logger = new LoggerConfiguration()
.Enrich.WithThreadId()
.Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("SuppressLogging"))
.Enrich.FromLogContext()
.WriteTo.Console(new JsonFormatter())
.CreateLogger();
using (LogContext.PushProperty("SuppressLogging", true))
{
StartListeningSomething();
Console.ReadKey(); // Will ignore background thread log messages until key enter
}
// We want to start logging events after exiting using block
// But they won't be logged for listener thread at all
Console.ReadKey();
}
}
Все события журнала внутри задачи слушателя будут обогащены свойством «SupressLogging» даже после его извлечения из области видимости.