2016-06-25 5 views
2

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 } 

だから、@とは何ですか?そう?

答えて

5

よく見ると、同じ出力ではないことがわかります。

ダミーの前で@オペレータは、渡されたオブジェクトをシリアル化ではなく、@演算子を使用せずに、あなたの最初の例に何が起こるかであるToString()を使用して、それを変換するSerilogに指示します。


第一の例におけるログのイベント(ここではJSONで)のような特性を有することになります:{@Dummy}を使用

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

パラメータが構造化データとしてシリアル化されます。

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

Comment from Nicholas Blumhardt(Serilogの作成者):

適切な場合、@演算子を使用すると、 操作/分析にはるかに役立ちます。

この「オプトイン」要件の理由は、ほとんどのタイプの.NETの プログラムは、文字列にうまく変換されますが、きれいに/意味よく シリアライズ可能ではありません。 @とシリアル化するように設定すると、 "私は 私がやっていることを知り、このオブジェクトをシリアル化します!" :)

+0

はい! 'ToString()'で匿名型を使うと、シリアライズされたフォームが得られます。 – BanksySan

+0

@BanksySan Kind of ... ToString()は匿名型の文字列でも、文字列が1つだけ表示されます。 '@'はシンクにシリアライズされたオブジェクトを提供し、シンクはシリアライズされたデータを格納することを含め、シンクが望むものを何でも行うことができます。 Seil(https://getseq.net)を使ってSerilogを使って、 '@ '演算子がどの程度強力であるかを調べてみてください。 –

関連する問題