Политика деструктуры Serilog c в мойку - PullRequest
0 голосов
/ 05 февраля 2020

У меня возникают проблемы с настройкой политики деструктуры Serilog, работающей только для определенного c приемника.

Сценарий

У меня есть два приемника: 1. Консоль 2. Файл

При регистрации в DataTable мне нужно, чтобы этот объект был сериализован в красивой печатной таблице для (1) приемника консоли, но не для (2) приемника файлов.

Например,

var table = new DataTable("MyDataSet");
table.Columns.Add("TextColumn");
table.Columns.Add("NumericColumn", typeof(int));
table.Rows.Add("Item0", 0);
table.Rows.Add("Item1", 1);

logger.Information("Test {@Data}", table);

Ожидаемый результат должен быть

[10:23:22 INF] Test 
┌────────────┬───────────────┐
│ TextColumn │ NumericColumn │
├────────────┼───────────────┤
│ Item0      │ 0             │
│ Item1      │ 1             │
└────────────┴───────────────┘

Проблема

У меня есть решение, работающее с пользовательским IDestructuringPolicy (с именем ConsoleTablePolicy) для выполнения форматирования , однако он применяется для всех приемников - не только для приемника консоли.

Текущая конфигурация

Работает , но применяется ко всем приемникам - приемник файлов также получает симпатичную печатную таблицу. Это не то, что мне нужно.

var logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Console()
    .WriteTo.File(@"C:\TEMP\log.txt")
    .Destructure.With(new ConsoleTablePolicy())
     .CreateLogger();

Ожидаемая конфигурация

При добавлении консольного приемника и пользовательской политики деструктуры в подлогер, политика деструктуры никогда не вызывается .

var logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Logger(c => c.WriteTo.Console().Destructure.With(new ConsoleTablePolicy()))
    .WriteTo.File(@"C:\TEMP\log.txt")
    .CreateLogger();

Как заставить эту конфигурацию работать?

Обратите внимание, что этот сценарий был упрощен для моих нужд.

1 Ответ

0 голосов
/ 05 февраля 2020

Разрушение применяется к потоку записи до того, как он будет передан в приемники.

Чтобы сделать то, что вы делаете, вы можете настроить свойства Enricher перед заданным приемником.

Для чтобы избежать преемников, видящих мутации, которые применяет Enricher, вы можете:

  • поместить обогатитель перед нужным ему приемником и иметь это последним приемником
  • разместить обогатитель, удаляющий свойство после раковины, которая использовала обогащение в первую очередь
...