#.net #serilog
#.net #serilog
Вопрос:
Учитывая этот код:
var d1 = new { x = 5, y = 88 };
Log.Logger.Information("{d1}", d1);
Log.Logger.Information("{@d1}", d1);
Как объект в d1 будет регистрироваться по-разному в двух журналах.Регистратор.Информационные (…) строки?
Другими словами, каков эффект добавления @ между { } ?
Я прочитал https://github.com/serilog/serilog/wiki/Structured-Data под заголовком «Сохранение структуры объекта», но для меня это не имело смысла.
Комментарии:
1.На самом деле есть
{..}
(default),{$..}
(stringify) и{@..}
(destructure). Может это помочь больше?2. Это не прояснило ситуацию для меня. И «default», и «destructure», похоже, хранят объекты в виде структурированных объектов, а не строк. Я ценю, что есть разница, но не вижу ее.
3. Удобно, что кто-то только что написал отличный курс Pluralsight, объясняющий и это тоже: pluralsight.com/training/Courses/TableOfContents /…
Ответ №1:
{d1}
преобразует нераспознанные типы, подобные приведенному здесь анонимному, в string
s для ведения журнала, то есть с использованием ToString()
. Таким образом, ваше событие журнала в первом примере будет иметь свойство, подобное (здесь в JSON):
{
"d1": "{ x = 5, y = 88 }"
}
Использование {@d1}
приведет к сериализации параметра в виде структурированных данных:
{
"d1":
{
"x": 5,
"y": 88
}
}
При необходимости второй пример гораздо более полезен для манипулирования / анализа.
Причина этого требования «выбора» заключается в том, что большинство типов в программах .NET хорошо преобразуются в строки, но не являются сериализуемыми чисто / осмысленно. Выбирая сериализацию с помощью @
, вы говорите: «Я знаю, что я делаю, сериализуйте этот объект!» 🙂
Комментарии:
1. Что, если объект имеет общедоступное свойство типа List<int> ? Я вижу, что Serilog разрушает объект и перечисляет все свойства, которые являются double и integer, но не учитывает это конкретное свойство, которое имеет тип List.
2. @NotAgain возможно ли, что список является общедоступным полем, а не свойством? Serilog игнорирует поля, так что это одна из возможностей. Если нет — не могли бы вы опубликовать свой код в новом вопросе? Приветствия!
3. В точку. Это поле, а не свойство. Моя ошибка.