ASP.NET Core

Scrutor ile iptal edilen HTTP isteklerinin loglanmasını engellemek

Yazar, istemci HTTP isteğini iptal ettiğinde ASP.NET Core ekibinde OperationCanceledException kayıtlarının nasıl gereksiz hata olarak loglandığını ve bunun nasıl bastırıldığını anlatıyor. NLog filtreleri ve middleware denemeleri yetersiz kaldı. Çözüm, Scrutor ile ILoggerProvider'ı dekore edip yazmadan önce HttpContext.RequestAborted durumunu kontrol etmek.

Habr C# (ru) alexeysp11
Yayın tarihi
Okuma süresi
14 dk okuma
agent çalıştırması #7
agent çalıştırması #7
Orijinale git habr.com

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

Kilit noktalar

  • Loglama için ILogger<T> yerine ILoggerProvider'ı dekore edin; böylece ILoggerFactory.CreateLogger(string) ile üretilen loggerlar da kapsanır.
  • HttpContext?.RequestAborted kontrolündeki null-conditional operatörünü koruyun; arka plan servislerinde ve kuyruk tüketicilerinde gerekli.
  • services.Decorate<ILoggerProvider, T>() çağrısı, Console ve NLog dahil kayıtlı tüm provider'ları sarmalar.
  • Üretimde AggregateException içindeki OperationCanceledException'ı da açıp kontrol edin.
  • Token eşleşmesi kontrolü basitleştirilmiştir; rastgele bir eşleşme gerçek bir dış servis hatasını gizleyebilir.

İstemci sayfadan ayrıldığında tarayıcı isteği iptal eder ve bu durumda oluşan OperationCanceledException, ASP.NET Core servislerinde gerçek bir hataymış gibi loglara düşer. Yazarın ekibi önce bunu NLog yapılandırmasındaki filtrelerle, sonra middleware içinde yakalayarak çözmeyi denedi. Her iki yaklaşım da yetersiz kaldı: NLog HTTP bağlamını görmüyor, repository katmanındaki loglama ise istisna middleware'e ulaşmadan kaydı oluşturuyor.

Çözüm, Scrutor'un Decorate metoduyla ILoggerProvider'ı sarmalamak. Sarmalayıcı logger, istisna bir OperationCanceledException ise ve HttpContext.RequestAborted zaten iptal edilmişse kaydı atlıyor. Sarmalayıcı aynı arayüzü uyguladığı için loglama zincirinin geri kalanı değişmiyor. Yazar ayrıca arka plan servislerinde HttpContext'in null olabileceğini, Decorate'in kayıtlı tüm sağlayıcılara uygulandığını ve AggregateException içine sarılı iptallerin ayrıca ele alınması gerektiğini not ediyor.

Gerçek dünyada kullanımı

  • Kullanıcıların uzun süren rapor üretimi sırasında sayfadan ayrıldığı bir ASP.NET Core API, gereksiz hata loglarından kurtulmak istiyor.
  • Repository katmanında her istisnayı loglayıp yeniden fırlatan bir ekip, middleware tabanlı bastırmanın işe yaramadığı bir projede tek noktadan çözüm arıyor.

Neden önemli

Rutin istemci kopmalarından gelen gürültü tek bir yerde susturulur; gerçek zaman aşımları ve veritabanı hataları yine loglanmaya devam eder.

Bu özet, Habr C# (ru) üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü