Serilog: разница между {..} и {@ ..}

#.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. В точку. Это поле, а не свойство. Моя ошибка.