2014-07-05 189 views
3

鑑於此代碼:Serilog:之間{..} {差異@ ..}

var d1 = new { x = 5, y = 88 }; 
Log.Logger.Information("{d1}", d1); 
Log.Logger.Information("{@d1}", d1); 

如何將在D1的對象在兩個不同Log.Logger.Information登錄(...)行呢? 換句話說,在{}之間添加@會產生什麼影響?

我讀「https://github.com/serilog/serilog/wiki/Structured-Data」標題下的「保留對象結構」,但這對我沒有意義。

+0

實際上有'{..}'(默認),'{$ ..}'(stringify)和'{@ ..}'(結構)。是[this](https://github.com/serilog/serilog/blob/60e8120a12abee4db942d2ff03b123341fab1fff/src/Serilog/Parsing/Destructuring.cs)*也許*有更多幫助? –

+0

這並沒有爲我清除它。 「default」和「destructure」似乎都將對象存儲爲結構化對象,而不是字符串。我很欣賞有一個區別,但看不到它。 – user1147862

+0

方便的是,有人剛剛寫了一個很好的Pluralsight課程來解釋這個:http://pluralsight.com/training/Courses/TableOfContents/modern-structured-logging-serilog-seq –

回答

5

{d1}將無法​​識別的類型(如匿名的類型)轉換爲strings進行日誌記錄,即使用ToString()。因此,在第一個例子你的日誌事件將最終像(在這裏JSON)屬性:

{ 
    "d1": "{ x = 5, y = 88 }" 
} 

使用{@d1}將導致參數被序列化作爲結構化的數據:

{ 
    "d1": 
    { 
    "x": 5, 
    "y": 88 
    } 
} 

在適當的地方,第二個例子對於操縱/分析更有用。

此「選擇加入」要求的原因是.NET程序中的大多數類型都很好地轉換爲字符串,但不是乾淨/有意義的可序列化。通過選擇與@進行序列化,你會說:「我知道我在做什麼,序列化這個對象!」 :)

+0

如果對象有一個公共屬性是型號列表?我看到Serilog正在解構對象,並列出了所有的double和integer屬性,但是遺留了這個List類型的屬性。 – NotAgain

+0

@NotAgain有可能這個列表是一個公共領域,而不是一個屬性? Serilog忽略領域,所以這是一種可能性。如果沒有 - 你可以在新的問題中發佈你的代碼嗎?乾杯! –

+0

現貨。這是一個領域,而不是一個財產。我的錯。 – NotAgain