2016-06-25 7 views
2

Какова цель синтаксиса Serialog @?Что такое деструкция Serilog?

Если я запускаю следующее:

var dummy = new { Foo = "Bar", Date = DateTime.Now }; 

Log.Information("Dummy object: {Dummy}", dummy); 

Тогда я получаю вывод на консоль так:

Time: 16:20 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: "Foo = Bar, Date = 25/06/2016 16:20:30 }" 

Если я изменю {Dummy} к {@Dummy} тогда я получаю тот же результат

Time: 16:22 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: Foo: "Bar", Date: 06/25/2016 16:22:28 } 

Итак, что такое @ Предполагаемое значение t o делать?

ответ

5

Посмотрите внимательно, и вы увидите, что это не тот же результат.

@ оператор перед обманки говорит Serilog сериализовать объект, переданный в, а не конвертировать его с помощью ToString(), что и происходит на вашем первом примере, без использования оператора @.


Ваш журнал событий в первом примере, будет в конечном итоге со свойством типа (здесь в формате JSON):

{ 
    "Dummy": "{ Foo = Bar, Date = 25/06/2016 16:20:30 }" 
} 

Использование {@Dummy} вызовет параметр для сериализации в виде структурированных данных:

{ 
    "Dummy": 
    { 
    "Foo": "Bar", 
    "Date": "25/06/2016 16:20:30" 
    } 
} 

Comment from Nicholas Blumhardt (создатель Serilog):

При необходимости использование оператора @ гораздо более полезно для обработки или анализа .

Причина этого требования «отказаться» заключается в том, что большинство типов в .NET. программы хорошо преобразуются в строки, но не являются чисто/значимыми. serializable. Выбрав сериализацию с @, вы говорите: «Я знаю, что я делаю, сериализуйте этот объект!» :)

+0

Да! Когда вы 'ToString()' анонимный тип, вы получаете сериализованную форму. – BanksySan

+0

@BanksySan Вид ... 'ToString()' для анонимного типа по-прежнему дает вам одну строку, она просто выглядит красиво. '@' Намного больше, чем тот, который обеспечивает приемник сериализованным объектом, а приемник может делать с ним все, что захочет, включая хранение сериализованных данных. Попробуйте использовать Serilog с Seq (https://getseq.net), чтобы увидеть, насколько мощным может быть оператор '@'. –