MehmetX.com

ASP.NET MVC Custom Action Filter ile Loglama

15.10.2017 07:14:57 | Okunma Sayisi : 7234 | Yorum Sayisi : 0

Bu ö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. 

aspnet_mvc_new_web_application
Bir sonraki ekranda üstten Empty, alt taraftan da MVC seçelim.
aspnet_mvc_new_web_application_selection



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).

aspnet_mvc_action_filter_homeController



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.

aspnet_mvc_action_filter_LogFilterAttribute.png



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ı
almış olduk. Bu değerleri string.Format ile formatlayarak Logla metoduna gönderdik ve loglar.txt isimli dosyaya yazılmasını sağladık.

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.

aspnet_mvc_action_filter_FilterConfig.png



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.

aspnet_mvc_action_filter_Global_asax_register_global_filters.png



Basit bir Layout hazırlayıp 3 Action' a link vererek uygulamayı deneyebiliriz.

aspnet_mvc_action_filter_Layout.png



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.

aspnet_mvc_action_filter_loglar


Projenin kaynak kodlarına buradan erişebilirsiniz.

0 Yorum




page-top