ASP.NET MVC Custom Action Filter ile Loglama
15.10.2017 07:14:57 | Okunma Sayisi : 7702 | Yorum Sayisi : 0Bu örneğe geçmeden önce ASP.NET MVC Custom Action Filter isimli makalemi okumanızı tavsiye ederim.
Örneğimizde, ASP.NET MVC Custom Action Filter kullanarak, MVC uygulamamızdaki tüm Action' lar için Loglama yapacağız.
Visual Studio ile yeni bir ASP.NET Web Application açalım.
Proje açıldıktan sonra Controllers klasörüne HomeController isminde bir Controller ekleyelim ve içerisindeki kodları aşağıdaki gibi düzenleyelim. HomeController içerisinde 3 adet Action var ve bunlar ilgili View' leri gösterecekler (View' leri ekleyip içerilerine herhangi bir şey yazabilirsiniz, konu ile çok ilgili olmadığından o kısımları es geçiyorum).
Projeye Filters isminde bir klasör ekleyip (Filters yerine farklı bir isim de olabilir, hatta dilerseniz klasör kullanmayabilirsiniz) içerisine LogFilterAttribute.cs isminde bir C# dosyası (class) ekleyelim ve bu class' ın kodlarını aşağıdaki gibi düzenleyelim.
LogFilterAttribute isimli class' ın, ActionFilterAttribute class' ından kalıtım almasını sağladık. Bu kalıtım bize 4 adet override metodu sunacaktır (detay için).
Bu 4 override metottan yalnızca OnActionExecuting' i kullanacağız (yani Action çalışmadan önce çalışacak metodu).
string parametre alıp bu string parametreyi StreamWriter ile loglar.txt isimli dosyaya yazan Logla isminde bir metot tanımladık. Örneğin basit olması açısından diske yazmayı tercih ettim. Dilerseniz bu metodun içerisini veritabanı ya da başka bir hedefe yazacak şekilde düzenleyebilirsiniz.
OnActionExecuting içerisinde;
- filterContext.ActionDescriptor.ControllerDescriptor.ControllerName diyerek ilgili Controller adını
- filterContext.ActionDescriptor.ActionName diyerek ilgili Action adını
- filterContext.HttpContext.Request.UserHostAddress diyerek kullanıcının IP adresini
- filterContext.HttpContext.Timestamp diyerek HTTP isteğinin başlangıç zamanını
Filter' ımız hazır ancak çalışır durumda değildir. Çalışır duruma getirmek için hangi durumlarda çalıştırılacağını belirlememiz gerekmektedir. Uygulamadaki tüm Action' lar için çalışmasını istediğimiz için bu Filter' ı GlobalFilter olarak Global.asax.cs içerisinde kaydedeceğiz.
Daha sonradan farklı Filter' lar da ekleme ihtimali olacağı için App_Start klasörüne FilterConfig isminde bir C# dosyası ekleyip içerisini aşağıdaki gibi düzenleyelim.
FilterConfig class ismi ve RegisterGlobalFilters metot ismi zorunlu değildir, varsayılan olarak bu isimler kullanıldığı için bu isimleri verdim, farklı isimler verebilirsiniz 💪🏻.
RegisterGlobalFilters isimli metot içerisinde, -MVC uygulaması seviyesinde tüm Global Filter' ları barındıran/barındıracak olan- GlobalFilterCollection class' ına, az önce yazmış olduğumuz LogFilterAttribute isimli filtremizi eklemiş olduk. Artık bizim LogFilterAttribute class' ımız da bir Global Filter haline gelmiştir.
Yapmamız gereken son işlem, bu RegisterGlobalFilters metodunu MVC uygulaması ayağa kalkarken yani Application Start içerisinde çalıştırmak. Bunun için de Global.asax.cs dosyasını aşağıdaki gibi düzenleyelim.
Basit bir Layout hazırlayıp 3 Action' a link vererek uygulamayı deneyebiliriz.
Deneme sonrasında C:\Program Files (x86)\IIS Express klasörü içerisinde loglar.txt isimli dosya oluşmuş ve içerisine, tıkladığınız action link kadar log satırı yazılmış olacaktır.
Projenin kaynak kodlarına buradan erişebilirsiniz.
0 Yorum