2016-10-07 6 views
2

私は自分のウェブサイトで発生したイベントに関連するいくつかのプロパティを持つオブジェクトを持っています。Serilog with Seq - メッセージテキストに配置しないでプロパティを追加する

このイベントをログに記録し、それぞれのプロパティがSeq-asプロパティに表示されるようにしたいとします。しかし、実際のログメッセージテキストからほとんどのプロパティを省略したいので、私はメッセージテンプレートにそれらを必要としません。 V

私はこれを行う場合:

 var logInfo= new LogInfo() {Foo = 1, Bar= "Pending"}; 
     logger.Information("{@event}", logInfo); 

を直接ログに対して配列に点灯唯一のプロパティは、@eventプロパティです。

enter image description here

だから私はこれを試してみました:

 var enricher = new DnnLogInfoEnricher(logInfo); 
     using (LogContext.PushProperties(enricher)) 
     { 
      Log.Logger.Information("Event: {logInfo}", logInfo.LogTypeKey, logInfo.Exception); 
     } 

しかし、このアプローチには私の懸念は、この方法として、倍の膨大な数を発射しようとしていることで、私はそれは実際にはこのようになります毎回新しいエンリッチオブジェクトインスタンスを作成する必要はありません。作成するオブジェクトの数をできるだけ少なくすることが好きです。なぜなら、私はGCの影響を懸念しているからです(恐らく私の懸念は根拠がありません)。 。

これは、私が欲しいもの(つまり豊かなもの)を達成するための正しい/正しい方法ですか、何か不足していますか?

乾杯!

答えて

1

SerilogのForContext()は非常によく、シナリオのこの種のために最適化され、(それが可能であれば、それを避けるために、その方法の外に出る)あまりに多くのゴミを作成しません。コンテキストを作成するコストは、データのロギングに要するコストに比例して重要ではありません。

var log = Log.ForContext("Info", logInfo, destructureObjects: true); 
log.Information(logInfo.Exception, "Event happened"); 

キャプチャされたオブジェクトから例外を除外し、代わりにログ記録の最初のパラメータとして渡す方がよい場合があります。

Log.Logger = new LoggerConfiguration() 
    .Destructure.ByTransforming<LogInfo>(li => new { 
     li.BypassBuffering, li.LogConfigId, li.LogEventId, li.LogGUID 
    }) 
    // <snip> 
    .CreateLogger(); 

ByTransforming()はここに多くのオーバーヘッドを追加するように見えるかもしれませんが、あなたはcherry-ではるかに厳しいとより効率的な結果を得ることができる必要があります:ロガーが作成されたとき、それを除外するには、カスタムポリシーを設定することができます興味のあるプロパティだけを選択してLogInfoを選択します。

静的クラスでLog.Loggerを呼び出す必要はありません。 LogにはLog.Information(...)のように直接Information()のようなメソッドがあります。

関連する問題