Как деструктурировать динамически при использовании MEL ILogger <T>в качестве фасада? - PullRequest
0 голосов
/ 23 октября 2019

Я реализую некоторые методы ведения журнала в приложении, и мне нужно передать динамические (например, JSON) значения в качестве данных.

Теперь я обнаружил расширение Desctructurama для Serilog, и оно хорошо работает, еслиЯ внедряю зависимость от логгера как собственный тип ILogger от Serilog. Однако, если я ввожу Microsoft.Extensions.Logging.ILogger<T>, это не так.

Дело в том, что Serilog, похоже, поддерживает фасад ведения журнала ядра asp.net, так как он принимает шаблон сообщения и значения, переданные в порядке. Это наверняка с использованием конфигурации регистратора, выполненной в классе запуска. Он даже делает хоть какую-то деструктуризацию для того, что я вижу, но игнорирует расширение JsonNetTypes от Destructurama. Вы называете ILogger.Error -> правильную деструктуризацию Serilog, вы называете ILogger<T>.LogError -> неправильную деструктуризацию MS. Сообщения попадают в приемники samE, поэтому вызовы clearLy передаются тому же экземпляру регистратора внизу. Сообщение temPlate и значения одинаковы, я просто вызываю оба интерфейса в то же время для теста, поэтому конфигурация в порядке.

Простое введение Serilog.ILogger противоречит внутреннему чувству красоты клиентапоэтому я думаю, что я застрял с ILogger<T> instEad.

Редактировать: похоже, ILogger<T> игнорирует конвейер деструктурирования Serilog. Например, я пытался добавить это, чтобы исключить вероятность, что это ошибка Desctructurama:

.Destructure.ByTransforming<Dictionary<Guid, string[]>>(dic => new { Noim = "ABCDEFG" })

И запись в лог:

var dic = new Dictionary<Guid, string[]>();
_logger.LogError("{@dic}", dic);
_serilog.Error("{@dic}", dic);

В результате вызов _serilog возвращает значениеfields.dic.Noim = ABCDEFG, в то время как вызов _logger (то есть ILogger<T>) просто приводит к fields.dic = nothing.

...