Serilog: выберите, какой приемник регистрировать во время выполнения

Я собираюсь реализовать Serilog в стандартной библиотеке .net 2.0. Я ищу способ выбрать, какие приемники следует использовать для каждой строки журнала.

Допустим, мы определяем 2 приемника в конфигурации (консоль и файл):

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .WriteTo.Console()
        .WriteTo.File("c:\\temp\\SerilogTets.txt")
        .CreateLogger();

После этого мы напишем одно правило журнала:

Log.Information("Hello, world!");  //<- how can we define which sink we want to use

Я ищу способ определить, для каких приемников эти строки должны регистрироваться:

  • Консоль и файл
  • Только консоль
  • Только файл

Не полагаясь на то, что это за логический уровень.

Заранее спасибо!

С уважением, Курт


person Kurt Colemonts    schedule 08.01.2021    source источник
comment
Это можно сделать, указав условия фильтрации в конфигурации. Код приложения не должен ничего знать о раковинах. Это противоречит цели использования библиотеки журналирования для начала - отделить код приложения от приемников журналирования.   -  person Panagiotis Kanavos    schedule 08.01.2021
comment
Кроме того, нельзя сказать, как выбрать мойку, если не объяснишь, каковы критерии выбора той или иной мойки.   -  person Panagiotis Kanavos    schedule 08.01.2021
comment
Что говорит @PanagiotisKanavos, см. stackoverflow.com/questions/46516359/   -  person CodeCaster    schedule 08.01.2021
comment
Спасибо за ваш быстрый ответ. Основная причина: есть данные, которые мы хотим записывать только в файлы журналов из соображений безопасности. Другая информация журнала может регистрироваться для анализа приложений. Скорее нужно иметь выбор, что мы хотим донести до аналитики приложений, а что нет.   -  person Kurt Colemonts    schedule 08.01.2021
comment
Это то, что делает фильтрация в конфигурации логгера. Вы можете указать фильтры по категории и дополнительным свойствам контекста   -  person Panagiotis Kanavos    schedule 08.01.2021


Ответы (1)


В Serilog это разделение можно выполнить с помощью дополнительных регистраторов с помощью фильтров или через Serilog.Sinks.Map, используя контекстные свойства, чтобы решить, какой регистратор будет включать или исключать определенные сообщения.

В приведенном ниже примере определяется, что все события журнала будут записываться как в консоль, так и в файл по умолчанию, однако, если событие журнала имеет свойство с именем FileOnly в контексте журнала, оно не будет записано в консоль, и аналогично, если событие журнала имеет свойство ConsoleOnly, оно не будет записано в файл.

using Serilog;
using Serilog.Context;
using Serilog.Filters;
// ...

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .Enrich.FromLogContext()
    .WriteTo.Logger(c =>
        c.Filter.ByExcluding(Matching.WithProperty("FileOnly"))
            .WriteTo.Console())
    .WriteTo.Logger(c =>
        c.Filter.ByExcluding(Matching.WithProperty("ConsoleOnly"))
            .WriteTo.File("C:\\Temp\\SerilogTests.txt"))
    .CreateLogger();

// Writes to both Console & File
Log.Information("Hello, world! (Console and File)");

using (LogContext.PushProperty("ConsoleOnly", value: true))
{
    // Writes only to the Console
    Log.Information("Hello, world! (Console)");
}

using (LogContext.PushProperty("FileOnly", value: true))
{
    // Writes only to the File
    Log.Information("Hello, world! (File Only)");
}

Log.CloseAndFlush();

Примечание: в идеале вы придумаете более общие имена свойств, которые будут более общими, чтобы при ведении журналов в своем приложении ему не нужно было ничего знать о консоли или файле. например У вас может быть свойство с именем Secret или Classified и решать, куда записывать журналы, в зависимости от наличия этого свойства или нет.

Есть разные способы добавления свойств к событию журнала, включая добавление свойства в шаблон сообщения непосредственно, когда вы Log.Information и т. Д., Через _ 7_, как в примере выше, и vi _ 8_.

Вы можете увидеть другие примеры фильтрации, вспомогательных регистраторов и Serilog.Sinks.Map здесь:

person C. Augusto Proiete    schedule 08.01.2021
comment
Спасибо за ответ. Я находил это раньше, но проблема, с которой я столкнулся, заключается в том, что он также регистрирует (консоль) и (только файл) в файле журнала. - person Kurt Colemonts; 03.02.2021
comment
@KurtColemonts Я не уверен, что понимаю, что вы имеете в виду. Хотите добавить в свой вопрос более подробную информацию? - person C. Augusto Proiete; 03.02.2021