Я реализую некоторые методы ведения журнала в приложении, и мне нужно передать динамические (например, 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
.