4

Web サイトで発生したばかりのイベントに関連するいくつかのプロパティを持つオブジェクトがあります。

このイベントをログに記録し、その各プロパティが Seq にプロパティとして表示されるようにします。ただし、実際のログ メッセージ テキストからほとんどのプロパティを省略したいので、メッセージ テンプレートに含めたくありません。v

私がこれを行う場合:

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

ログに対して Seq で直接点灯する唯一のプロパティは、@event プロパティです。実際には次のようになります。

ここに画像の説明を入力

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

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

しかし、このアプローチに関する私の懸念は、このメソッドが非常に多くの回数起動するため、作成されるオブジェクトの数を維持したいので、毎回新しいエンリッチャー オブジェクト インスタンスを作成する必要がないことです。一般的に可能な限り低く.. GC の影響について懸念しているという理由だけで (おそらく、私の懸念は根拠がありませんか?)。

これは私が望むものを達成するための正しい/正しい方法ですか(つまり、エンリッチャーを使用していますか)、それとも何か不足していますか?

乾杯!

4

1 に答える 1

6

SerilogForContext()は、この種のシナリオに対して非常に最適化されており、大量のガベージを作成しません(可能な限りガベージを回避します)。コンテキストを作成するコストは、最初にデータをログに記録するコストに比例して重要ではありません。

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

1 つの観察として、キャプチャされたオブジェクトから例外を除外し、代わりにロギング呼び出しの最初のパラメーターとして渡す方がよい場合があります。それを除外するには、ロガーの作成時にカスタム ポリシーを設定できます。

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

ここでオーバーヘッドが増えるように見えるかもしれませByTransforming()んが、 の興味深いプロパティのみを厳選することで、より厳密で効率的な結果を得ることができるはずですLogInfo

もう 1 つの小さなこと -Log.Logger静的クラスを呼び出す必要はありません。のように、直接のLogようなメソッドがあります。Information()Log.Information(...)

于 2016-10-07T05:39:56.673 に答える