Serilog: Как войти объект в обогащение? - PullRequest
0 голосов
/ 16 мая 2019

Мы используем 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, или я просто слепой?

1 Ответ

1 голос
/ 17 мая 2019

Ваш обогащатель принимает ILogEventPropertyFactory.Вы можете сделать

logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("User", userDetails, 
                                                            destructureObjects: true));

, и это обогатит его пользовательским объектом.

...