Dot-Net

什麼是 Serilog 解構?

  • June 26, 2016

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 程序中的大多數類型都可以很好地轉換為字元串,但不能乾淨/有意義地序列化。通過選擇使用 @ 進行序列化,您是在說:“我知道我在做什麼,序列化這個對象!” :)

引用自:https://stackoverflow.com/questions/38029980