Мы используем Serilog для создания журналов json (т.е. каждая запись журнала - это json, а не текст).Преимущество в том, что они могут содержать объекты.Я использую его, например, для записи объекта исключения C # следующим образом:
ILogger.Error("Something bad happened. {@exception}", exception);
Это будет передавать все свойства объекта exception
в журнал.(Переменная exception
имеет тип Exception
здесь.)
Теперь я запуталась, почему нет простой аналогии, как сделать это в обогащении.В настоящее время мы добавляем исключение для входа в систему таким образом:
LogEvent.AddPropertyIfAbsent(new LogEventProperty("exception", new ScalarValue(exception));
Конечно, ScalarValue
преобразует исключение в строку.Он выглядит как объект json внутри двойных кавычек («строковый json»).
Теперь проблема в том, что когда мы помещаем это в ELK (программное обеспечение для контроля журналов и поиска в них), оножалуется на exception
поле, имеющее другой тип, и говорит, что оно должно быть объектом, как это было раньше, а не строкой.(Это еще одна тема - я нашел много повторяющихся вопросов о том, как «решить» это в ELK. Но, по-видимому, это не может быть «исправлено» в ELK, оно должно всегда создаваться в одном и том же формате. Вот почему я задаю этот вопрос.)
Я не вижу никакой объектной аналогии ScalarValue
в Serilog.AddPropertyIfAbsent
не принимает объект напрямую, он хочет LogEventProperty
с LogEventPropertyValue
.И у этого абстрактного класса есть несколько реализаций, включая простое значение, массив и словарь, но ни одна из них, кажется, не излучает объект так же, как @exception
.Поэтому мне интересно, не охватывает ли этот очень распространенный и основной сценарий Serilog, или я просто слепой?