EFオブジェクトを破棄すると、Serilogのメモリが不足します

ピッチマット

EntityFrameworkを使用しているSaaSアプリケーションのSerilogをテストしています。オブジェクトのロード元のコンテキストが破棄されていない場合、SerilogはEFオブジェクトの破棄を処理できないことに気付きました。

Supplier supplier = context.Supplier.Find(6100);
Log.Information("This works and the cost for ToString() is negligible {supp}", supplier);

Log.Fatal("This will cause an Out of Memory error {@supp}", supplier);

Serilogはデータベース全体を遅延読み込みしようとしますが、アプリは1分間ハングし、クラッシュします。SerilogログファイルはOutOfMemoryExceptionを報告します

他の開発者が誤って次のようなことをして予期しないハング/クラッシュを引き起こすのを防ぐ方法は?

if(veryRarelyOccuringEvent)
    Log.Information("Supplier {@supplier} just did something, supplier)

私がしたことは、すべての破壊を防ぐために破壊ポリシーを使用することでした。@を使用するよりも、開発者にToStringメソッドを明示的に宣言してもらいたいと思います。もちろん、@演算子を使用しないことを決定することはできますが、誰かが忘れてアプリがダウンした場合はどうなりますか?@は、コードレビューで見逃しがちです。@の使用を防ぐためだけに、Serilog操作のラッパーを作成したくありません。

以下は、@演算子の使用を防ぎます。

            Log.Logger = new LoggerConfiguration()
                .Destructure.With<PreventDestructure>()
            ...

そして、{}を返します。しかし、以下のコードよりも簡単な方法はありますか?

public class PreventDestructure : IDestructuringPolicy {
    public bool TryDestructure(
        object value,
        ILogEventPropertyValueFactory propertyValueFactory,
        out LogEventPropertyValue result) {



        List<LogEventProperty> fieldsWithValues;
        fieldsWithValues = new List<LogEventProperty>();
        result = new StructureValue(fieldsWithValues);

        return true;

    }
}

2番目の質問:ロギングイベントに最大XXXmsを費やすようにSerilogに指示する方法はありますか?データベースシンクを使用していて、データベースがオフラインの場合はどうでしょうか。また、AIシンクを使用していて、ApplicationInsightsにアクセスできない場合などはどうなりますか?

RMH

エンティティのナビゲーションプロパティが原因でSerilogがハングし、データベース全体が簡単に読み込まれる可能性があると思います。同じ問題を説明しているように見えるSerilogプロジェクトの問題を見つけまし

その問題で彼らは言う:

Serilogにはすでに最大深度制限があります。デフォルトでは10に設定されていますが、Destructure.ToMaximumDepth(n)を使用して減らすことができます。

関連するエンティティが読み込まれないように、1に設定してみてください。しかし、個人的にはこれが望ましい解決策ではないと思います。

ログに記録したくないプロパティまたはフィールドの属性を使用できるようにするこのNuGetパッケージもありNotLoggedます。これは機能しますが、どこかのナビゲーションプロパティで忘れると、見逃しがちです。

Serilogは、破壊の処理方法をカスタマイズするオプションを提供します。ロギングに費やす最大時間など、すべての要件を処理する独自のハンドラーを作成するか、オブジェクトをフェイルセーフとして非構造化しようとしていることを示すスタックトレースをログに記録させることができます。しかし、それはあなた次第です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オブジェクトのリストを破棄する方法;メモリを解放しますか

分類Dev

Pythonオブジェクトを破棄してメモリを解放する方法

分類Dev

C ++のメソッド内にオブジェクトを作成した場合、関数が戻ったときにオブジェクトは自動的に破棄されますか、それともメモリを消費し続けますか?

分類Dev

Javaメモリ管理とオブジェクトを破棄するタイミング

分類Dev

オブジェクトを破棄するときのStackOverflowException

分類Dev

オブジェクトが多すぎるため、メモリ不足の例外が発生します

分類Dev

ifelse()を使用して変数をRのtbl_df / data.frameオブジェクトに割り当てると、Rのメモリが不足します。

分類Dev

オブジェクトの破棄を使用すると、Sinonスタブが機能しないようです

分類Dev

Delphiアプリでメモリリークが発生しました。オブジェクトと文字列を適切に破棄するにはどうすればよいですか?

分類Dev

メソッドから返す必要のあるdatatableオブジェクトを破棄します

分類Dev

mysqli_close()は、オブジェクトを破棄する以外のことをしますか?

分類Dev

Swiftでオブジェクトを破棄しても、RAMメモリが解放されません

分類Dev

オブジェクトのポインタをコンストラクタに提供すると、オブジェクトが破棄されます

分類Dev

オブジェクトのトランジットjsを破棄します

分類Dev

C ++で動的に割り当てられたメモリ(配列オブジェクト)を破棄する

分類Dev

AndEngine GLES1Box2D衝突中にオブジェクトを破棄して作成するとアプリがクラッシュします

分類Dev

メソッド内の新しいオブジェクトパラメータを破棄する必要がありますか?

分類Dev

オブジェクトが破棄された場合、MouseLeaveトリガーをブロックします

分類Dev

条件が欠落している場合は、モデルファイル内のオブジェクトを破棄します

分類Dev

オブジェクトを破棄して復元する

分類Dev

値を取得するメソッドは、破棄されたオブジェクトを返します

分類Dev

オブジェクトを破棄しようとすると、「破棄式は識別子参照しか持てない」というメッセージが表示されるのはなぜですか?

分類Dev

ネストされたオブジェクトを関数パラメーターとして破棄する

分類Dev

オブジェクトを破棄するときにタイプの名前を変更して追加する

分類Dev

配列のゲームオブジェクトを破棄します

分類Dev

メモリリーク、および実行可能なクラスの奇妙なバグ-オブジェクトを適切に破棄する方法は?

分類Dev

すべてのC ++ / CLIオブジェクトを破棄する必要がありますか?

分類Dev

Unity:レンダリングが終了した後にVFXオブジェクトを破棄します

分類Dev

関数の引数を破棄するときにオブジェクトを作成できますか?

Related 関連記事

  1. 1

    オブジェクトのリストを破棄する方法;メモリを解放しますか

  2. 2

    Pythonオブジェクトを破棄してメモリを解放する方法

  3. 3

    C ++のメソッド内にオブジェクトを作成した場合、関数が戻ったときにオブジェクトは自動的に破棄されますか、それともメモリを消費し続けますか?

  4. 4

    Javaメモリ管理とオブジェクトを破棄するタイミング

  5. 5

    オブジェクトを破棄するときのStackOverflowException

  6. 6

    オブジェクトが多すぎるため、メモリ不足の例外が発生します

  7. 7

    ifelse()を使用して変数をRのtbl_df / data.frameオブジェクトに割り当てると、Rのメモリが不足します。

  8. 8

    オブジェクトの破棄を使用すると、Sinonスタブが機能しないようです

  9. 9

    Delphiアプリでメモリリークが発生しました。オブジェクトと文字列を適切に破棄するにはどうすればよいですか?

  10. 10

    メソッドから返す必要のあるdatatableオブジェクトを破棄します

  11. 11

    mysqli_close()は、オブジェクトを破棄する以外のことをしますか?

  12. 12

    Swiftでオブジェクトを破棄しても、RAMメモリが解放されません

  13. 13

    オブジェクトのポインタをコンストラクタに提供すると、オブジェクトが破棄されます

  14. 14

    オブジェクトのトランジットjsを破棄します

  15. 15

    C ++で動的に割り当てられたメモリ(配列オブジェクト)を破棄する

  16. 16

    AndEngine GLES1Box2D衝突中にオブジェクトを破棄して作成するとアプリがクラッシュします

  17. 17

    メソッド内の新しいオブジェクトパラメータを破棄する必要がありますか?

  18. 18

    オブジェクトが破棄された場合、MouseLeaveトリガーをブロックします

  19. 19

    条件が欠落している場合は、モデルファイル内のオブジェクトを破棄します

  20. 20

    オブジェクトを破棄して復元する

  21. 21

    値を取得するメソッドは、破棄されたオブジェクトを返します

  22. 22

    オブジェクトを破棄しようとすると、「破棄式は識別子参照しか持てない」というメッセージが表示されるのはなぜですか?

  23. 23

    ネストされたオブジェクトを関数パラメーターとして破棄する

  24. 24

    オブジェクトを破棄するときにタイプの名前を変更して追加する

  25. 25

    配列のゲームオブジェクトを破棄します

  26. 26

    メモリリーク、および実行可能なクラスの奇妙なバグ-オブジェクトを適切に破棄する方法は?

  27. 27

    すべてのC ++ / CLIオブジェクトを破棄する必要がありますか?

  28. 28

    Unity:レンダリングが終了した後にVFXオブジェクトを破棄します

  29. 29

    関数の引数を破棄するときにオブジェクトを作成できますか?

ホットタグ

アーカイブ