Dot-Net
什麼是 Serilog 解構?
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 }那麼,
@應該怎麼做呢?
仔細看,你會發現它不是同一個輸出。
@Dummy 前面的運算符告訴 Serilog 序列化傳入的對象,而不是使用 轉換它ToString(),這是在您的第一個範例中不使用@運算符時發生的情況。第一個範例中的日誌事件將以如下屬性結束(此處為 JSON):
{ "Dummy": "{ Foo = Bar, Date = 25/06/2016 16:20:30 }" }使用 {@Dummy} 將導致參數被序列化為結構化數據:
{ "Dummy": { "Foo": "Bar", "Date": "25/06/2016 16:20:30" } }Nicholas Blumhardt(Serilog 的創建者)的評論:
在適當的情況下,使用
@運算符對操作/分析更有用。這種“選擇加入”要求的原因是 .NET 程序中的大多數類型都可以很好地轉換為字元串,但不能乾淨/有意義地序列化。通過選擇使用 @ 進行序列化,您是在說:“我知道我在做什麼,序列化這個對象!” :)