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.
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.
Benzer haberler
- .NET ile SSH, Docker ve Dosya Yönetimi Bir Arada: TermForge İncelemesiHabr C# (ru)2 gün önce
- Odoo'ya lead gönderirken kaybetmemek: ASP.NET Core'da transactional outboxDEV Community: #aspnetcore2 gün önce
- Vertical Slice mı Clean Architecture mı? .NET 10'da kullanılan hibrit yapıMukesh Murugan (codewithmukesh)4 gün önce