2016-10-19 3 views
1

私はSerilogためenricherを書いていると私は実際には、新しいログイベントをトリガしてプロパティを追加します:StackOverflowExceptionがEnricher

public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) 
{ 
    ISession session = /* HttpContext.Session */; 
    logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("ValueFromSession", session.GetString("ValueFromSession"))); 
    /* other properties ... */ 
} 

Iから値を追加できるようにしたいです私のHTTPセッションはログに記録されているので、私はLogContext.PushPropertiesをカスタムエンリージャで使用します。 ASP.NET Coreは期限切れのセッションが読み込まれるたびに警告を記録しますが、これはより豊かなトリガーとなりますが、エンリッチャのセッションから読み込もうとすると、期限切れのセッションについて警告して、 )。これにより、ブロックtryでキャッチ可能ではないように見えるStackOverflowExceptionが発生します。

Enrichメソッドでログを無効にする方法はありますか?または、何らかの形でこの種の再帰を検出できますか(スタックトレースの解析以外)?

+0

慎重にチェックしてください循環参照があります – Mostafiz

+0

質問に記載されているように、自分のコードとASP.NETの間に間接参照がありますが、セッションから読み込む必要があるため参照を削除できません。私は期限切れのセッションについて私に警告するASP.NETをしたい。 –

+0

'Enrich()'からスローされた例外は、Serilogによって捕捉され、別のトップレベル例外ハンドラがトリガされることはありません。ここで起こっているかもしれない何かのように聞こえる。おそらく質問にスタックトレースを追加できますか?乾杯! –

答えて

0

私のカスタム​​実装(Serilogを使用していない)でこの問題が発生しました。 Sessionオブジェクトにアクセスするといつでも発生します。私は、起動時に永続キーを持つDataProtectionをアプリケーションに追加することで、これを解決することができました。

services.AddDataProtection() 
    .PersistKeysToFileSystem(new DirectoryInfo("keys")); 

私は実装の詳細にあまりにも深く行っていないが、古いセッションキーが検出されたときに、私はDistributedSessionコードで見るものから、「期限切れのセッションへのアクセス」のメッセージが記録されます。ここでの問題は、isAvailableフラグがtrueに設定される前にログが発生し、再帰を引き起こすことです。なぜDataProtectionを追加するとこの問題が回避されるのか分かりませんが、DataProtectionによって_isNewSessionKeyが常にtrueになる可能性があります。

GitHubで提案されているもう1つの回避策は、ミドルウェアを追加して、HttpContext.Itemsにログを記録するセッション項目を保存することです。その後、ロガー内のアイテムを取得します。

関連する問題