31 Ekim 2011 Pazartesi

MVC için Elmah ile hata loglama

Problem

MVC uygulamanızda oluşan tüm hataları loglamak ve gerektiğinde listelemek istiyorsunuz. Bunun için tüm muhtemel yerlere try{}catch() blokları yerleştirmeli ve hatayı bir yerlere yazmalısınız. ActionFilter yazarak action'lar içindeki hatayı filter seviyesinde loglayabilirsiniz. Fakat action'lar dışındaki alanlarda oluşan beklenmedik hataları nasıl elde edeceksiniz.

ELMAH Nedir?

ELMAH ( Error Logging Modules And Handlers) çok fazla bilinmeyen açık kaynak kodlu bir ASP.NET projesidir. Çalışma anında beklenmeyen bir durum oluştuğunda loglama için tek satır kodu değiştirmeden tamemen web.config ayaları ile ELMAH sizin yerinize aşağıdaki işlemleri yapacaktır.

  • Bütün beklenmeyen hataları loglama
  • Uzaktan erişilebilir bir web sayfası ile tüm hataları listeleme
  • Uzaktan erişilebilir bir web sayfası ile hata detaylarını gösterme
  • Asp.Net'in sarı hata sayfası yerine özelleştirilmiş hata sayfalarına yönlendirebilme
  • Hata oluştuğunda mail ile bilgilendirme
  • Hata listeleme için RSS bağlantısı
  • Hataları sql server gibi farklı veri kaynaklarında saklayabilme

Nasıl Kullanılır ?

Öncelikle ELMAH'ı kendi projenize kurmanız gerekmektedir. Nuget ile aşağıdaki komutu çalıştırarak kendi projenize ekleyebilirsiniz.

PM> Install-Package elmah

Kurulumdan sonra Nuget gerekli tüm web.config ayarlarını yapacaktır. MVC uygulamanızda elmah.axd sayfasına giderek hata listeleme sayfasına ulaşabilirsiniz.

elmah.axd sayfasının görünümü

ELMAH bu işleri nasıl yapmaktadır. web.config dosyası üzerinde takip edelim.

[xml]

<httpHandlers>
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
    <httpModules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules>

Elmah.ErrorLogModule ile Asp.Net işlemi içinde oluşan her beklenmeyen hata kayıt etmektedir. Loglama, mail gönderme ve filtreleme özelliklerini gene web.config üzerinden değiştirebilirsiniz. Oluşan beklenmedik hatalar varsayılan olarak xml dosyalarda tutulmaktadır. Ben örnek olması açısından hataların bir SQL CE veri tabanında tutulmasını göstericeğim. Yapmamız gereken web.config üzerinde ELMAH'a veri saklama yerini değiştirmesini söylemek.

[xml]

<connectionStrings>
    <add name="elmah-sqlservercompact" connectionString="Data Source=|DataDirectory|\Elmah.sdf" />
  </connectionStrings>
  <elmah> 
    <errorLog type="Elmah.SqlServerCompactErrorLog, Elmah" connectionStringName="elmah-sqlservercompact" />
  </elmah>

MVC Entegrasyonu

Hiç bir ekstra geliştirme yapmadan ELMAH çalışacaktır. Fakat MVC ile gelen beklenmeyen hataları yönetem bir HandleErrorAttribute ActionFilter nesmemiz var. Bu attribute MVC uygulamamızda GlobalFilter olarak kayıt edilmektedir. Bunun anlamı MVC ile gelen HandleErrorAttribute tüm Action metotlarımızın için bir merkezi hata yönetim noktasıdır.(Daha fazlası için Aspect Programing, Policy Injection) Action içinde oluşan hatalar HandleErrorAttribute içinde yakalanacağı için ELMAH tarafından listelenemeyecektir. Yapmamız gereken HandleErrorAttribute ile ELMAH'ı konuşturmaktır. Kendi HandleErrorAttribute sınıfmızı yazıp oluşan hatayı ELMAH'a bildirmemiz gerekmektedir.

[cs]

[Export]
    public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            base.OnException(context);
            if (context.ExceptionHandled)
                ErrorSignal.FromCurrentContext().Raise(context.Exception);
        }
    }

Son olaral Global.asax içinde kendi HandleErrorAttibute sınıfımızı kayıt etmeliyiz.


[cs]

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new Filters.HandleErrorAttribute()); 
        }

Sonuç

ELMAH beklenmeyen hataları loglamak ve yönetmek için açık kaynak kodlu güçlü bir araçtır. Muhtemelen sonraki Asp.Net versiyonlarında framework içinde geleçek bir uygulamadır. MVC ile entegrasyonu oldukça kolaydır. Buradaki örnekte olduğu gibi hata loglarını ayrı bir SQL CE veri tabanında tutmanızı öneriyorum. Zira ELMAH hataların stack bilgisinide sakladığı için hata kayıtları çok fazla yer işgal etmektedir. Ayrı bir SQL CE veri tabanı kullanarak gerektiğinde hata kayıtlarını doğrudann silebilirsiniz.

Hiç yorum yok: