ELMAH ile Hata Ayrıntılarını Günlüğe Kaydetme (VB)

tarafından Scott Mitchell

Hata Günlüğü Modülleri ve İşleyicileri (ELMAH), üretim ortamındaki çalışma zamanı hatalarını günlüğe kaydetmeye yönelik başka bir yaklaşım sunar. ELMAH, hata filtreleme ve hata günlüğünü bir web sayfasından, RSS akışı olarak görüntüleme veya virgülle ayrılmış dosya olarak indirme gibi özellikleri içeren ücretsiz, açık kaynak bir hata günlüğü kitaplığıdır. Bu öğreticide ELMAH'yi indirme ve yapılandırma adımları gösterilmektedir.

Giriş

Önceki öğreticide ASP incelendi. NET'in çok çeşitli Web olaylarını kaydetmek için kullanıma hazır bir kitaplık sunan sistem durumu izleme sistemi. Birçok geliştirici, işlenmeyen özel durumların ayrıntılarını günlüğe kaydetmek ve e-posta ile göndermek için sistem durumu izlemeyi kullanır. Ancak, bu sistem ile birkaç ağrı noktası vardır. İlk ve en önemlisi, günlüğe kaydedilen olaylar hakkındaki bilgileri görüntülemek için herhangi bir kullanıcı arabiriminin olmamasıdır. Son 10 hatanın özetini görmek veya geçen hafta gerçekleşen bir hatanın ayrıntılarını görüntülemek istiyorsanız, veritabanını araştırmanız, e-posta Gelen Kutunuzu taramanız veya tablodan aspnet_WebEvent_Events bilgileri görüntüleyen bir web sayfası oluşturmanız gerekir.

Başka bir ağrı noktası, sağlık izlemenin karmaşıklığı konusunda ortalanıyor. Sistem durumu izleme farklı olayların bol miktarda kaydını yapmak için kullanılabildiğinden ve olayların nasıl ve ne zaman günlüğe kaydedildiği konusunda çeşitli seçenekler olduğundan sistem durumu izleme sisteminin doğru yapılandırılması tek bir görev olabilir. Son olarak, uyumluluk sorunları vardır. Sistem durumu izleme ilk olarak sürüm 2.0'daki .NET Framework eklendiğinden, ASP.NET sürüm 1.x kullanılarak oluşturulan eski web uygulamalarında kullanılamaz. Ayrıca, SqlWebEventProvider önceki öğreticide hata ayrıntılarını bir veritabanına günlüğe kaydetmek için kullandığımız sınıfı yalnızca Microsoft SQL Server veritabanlarıyla çalışır. XML dosyası veya Oracle veritabanı gibi alternatif bir veri deposuna hataları günlüğe kaydetmeniz gerekiyorsa özel bir günlük sağlayıcısı sınıfı oluşturmanız gerekir.

Sistem durumu izleme sistemine alternatif olarak Atif Aziz tarafından oluşturulan ücretsiz ve açık kaynak hata günlüğü sistemi olan Hata Günlüğü Modülleri ve İşleyicileri (ELMAH) de kullanılabilir. İki sistem arasındaki en önemli fark, ELAMH'nin bir hata listesini ve bir web sayfasından ve RSS akışı olarak belirli bir hatanın ayrıntılarını görüntüleyebilmesidir. ELMAH, yalnızca hataları günlüğe kaydeddiği için sistem durumu izlemesinden daha kolay yapılandırılabilir. Ayrıca ELMAH, ASP.NET 1.x, ASP.NET 2.0 ve ASP.NET 3.5 uygulamaları için destek içerir ve çeşitli günlük kaynağı sağlayıcılarıyla birlikte gönderilir.

Bu öğretici, ELMAH'yi ASP.NET bir uygulamaya ekleme adımlarını gösterir. Haydi başlayalım!

Not

Sistem durumu izleme sistemi ve ELMAH'nin kendi artıları ve dezavantajları vardır. Her iki sistemi de denemenizi ve ihtiyaçlarınıza en uygun olanı belirlemenizi tavsiye ederim.

ASP.NET Web Uygulamasına ELMAH Ekleme

ELMAH'yi yeni veya mevcut bir ASP.NET uygulamasıyla tümleştirmek, beş dakikadan kısa süren kolay ve basit bir işlemdir. Özetle dört basit adım içerir:

  1. ELMAH'yi indirin ve derlemeyi Elmah.dll web uygulamanıza ekleyin,
  2. ELMAH'ın HTTP Modüllerini ve İşleyicisini'ne Web.configkaydedin.
  3. ELMAH'ın yapılandırma seçeneklerini belirtin ve
  4. Gerekirse hata günlüğü kaynak altyapısını oluşturun.

Şimdi bu dört adımı teker teker inceleyelim.

1. Adım: ELMAH Proje Dosyalarını İndirme ve Web Uygulamanıza EklemeElmah.dll

ElmaH 1.0 BETA 3 (Derleme 10617), yazma sırasındaki en son sürüm, bu öğretici ile sunulan indirmeye dahil edilir. Alternatif olarak, en son sürümü almak veya kaynak kodunu indirmek için ELMAH web sitesini ziyaret edebilirsiniz. ELMAH indirmesini masaüstünüzdeki bir klasöre ayıklayın ve ELMAH derleme dosyasını ()Elmah.dll bulun.

Not

DosyaElmah.dll, farklı .NET Framework sürümleri ve Yayın ve Hata Ayıklama derlemeleri için alt klasörleri olan indirme Bin klasöründe bulunur. Uygun çerçeve sürümü için Yayın derlemesini kullanın. Örneğin, ASP.NET 3.5 web uygulaması oluşturuyorsanız, dosyayı klasörden Bin\net-3.5\Release kopyalayınElmah.dll.

Ardından Visual Studio'yu açın ve Çözüm Gezgini web sitesi adına sağ tıklayıp bağlam menüsünden Başvuru Ekle'yi seçerek derlemeyi projenize ekleyin. Bu, Başvuru Ekle iletişim kutusunu açar. Gözat sekmesine gidin ve dosyayı seçin Elmah.dll . Bu eylem, dosyayı web uygulamasının Bin klasörüne eklerElmah.dll.

Not

Web Uygulaması Projesi (WAP) türü, Çözüm Gezgini klasörü göstermezBin. Bunun yerine, bu öğeleri Başvurular klasörünün altında listeler.

Derleme, Elmah.dll ELMAH sistemi tarafından kullanılan sınıfları içerir. Bu sınıflar üç kategoriden birine ayrılır:

  • HTTP Modülleri - HTTP Modülü, olay gibi olaylar için HttpApplication olay işleyicilerini tanımlayan bir sınıftır Error . ELMAH birden çok HTTP Modülü içerir ve en almanca olan üç modül şunlardır:

    • ErrorLogModule - bir günlük kaynağına işlenmeyen özel durumları günlüğe kaydeder.
    • ErrorMailModule - bir e-posta iletisinde işlenmeyen özel durumun ayrıntılarını gönderir.
    • ErrorFilterModule - hangi özel durumların günlüğe kaydedildiğini ve hangilerinin yoksayıldığını belirlemek için geliştirici tarafından belirtilen filtreleri uygular.
  • HTTP İşleyicileri - HTTP İşleyicisi, belirli bir istek türü için işaretleme oluşturmakla sorumlu olan bir sınıftır. ELMAH, hata ayrıntılarını web sayfası, RSS akışı veya virgülle ayrılmış dosya (CSV) olarak işleyen HTTP İşleyicileri içerir.

  • Hata Günlüğü Kaynakları - kullanıma açık ELMAH hataları belleğe, Microsoft SQL Server veritabanına, Microsoft Access veritabanına, Oracle veritabanına, XML dosyasına, SQLite veritabanına veya Vista DB veritabanına kaydedebilir. Sistem durumu izleme sistemi gibi ELMAH'nin mimarisi de sağlayıcı modeli kullanılarak oluşturulmuş, yani gerekirse kendi özel günlük kaynağı sağlayıcılarınızı oluşturup sorunsuzca tümleştirebilirsiniz.

2. Adım: ELMAH'nın HTTP Modülünü ve İşleyicisini Kaydetme

Dosya, Elmah.dll işlenmeyen özel durumları otomatik olarak günlüğe kaydetmek ve bir web sayfasından hata ayrıntılarını görüntülemek için gereken HTTP Modüllerini ve İşleyiciyi içeriyor olsa da, bunlar açıkça web uygulamasının yapılandırmasına kaydedilmelidir. HTTP ErrorLogModule Modülü kaydedildikten sonra 'nin Error olayına HttpApplicationabone olur. Bu olay her tetiklendiğinde ErrorLogModule , özel durumun ayrıntılarını belirtilen günlük kaynağına kaydeder. Sonraki "ELMAH'yi Yapılandırma" bölümünde günlük kaynağı sağlayıcısının nasıl tanımlanacağına bakacağız. ErrorLogPageFactory HTTP İşleyici fabrikası, bir web sayfasından hata günlüğünü görüntülerken işaretlemeyi oluşturmaktan sorumludur.

HTTP Modüllerini ve İşleyicilerini kaydetmeye özgü söz dizimi, siteyi destekleyen web sunucusuna bağlıdır. ASP.NET Geliştirme Sunucusu ve Microsoft'un IIS 6.0 ve önceki sürümleri için HTTP Modülleri ve İşleyicileri öğesi içinde <httpModules> görünen ve <httpHandlers> bölümlerine <system.web> kaydedilir. IIS 7.0 kullanıyorsanız, öğenin <modules> ve <handlers> bölümlerine <system.webServer> kaydedilmesi gerekir. Neyse ki, kullanılan web sunucusundan bağımsız olarak her iki yerde de HTTP Modülleri ve İşleyicileri tanımlayabilirsiniz. Bu seçenek, kullanılan web sunucusundan bağımsız olarak geliştirme ve üretim ortamlarında aynı yapılandırmanın kullanılmasına izin verdiğinden en taşınabilir seçenektir.

başlangıç olarakErrorLogModule, içindeki ve bölümüne <system.web>HTTP Modülünü ErrorLogPageFactory ve <httpHandlers> HTTP İşleyicisini <httpModules> kaydedin. Yapılandırmanız bu iki öğeyi zaten tanımlıyorsa ELMAH'ın HTTP Modülü ve İşleyicisi öğesini eklemeniz <add> yeterlidir.

<?xml version="1.0"?>
<configuration>
  ...
  
  <system.web>
  ...

  <httpHandlers>
  ...

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

  ...
  </system.web>

  ...
</configuration>

Ardından, ELMAH'nın HTTP Modülünü ve İşleyicisini <system.webServer> öğesine kaydedin. Daha önce olduğu gibi, bu öğe yapılandırmanızda zaten yoksa ekleyin.

<?xml version="1.0"?>
<configuration>
  ...

  <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  ...

  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  </modules>
  <handlers>
  ...

  <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
  </handlers>
  </system.webServer>
</configuration>

Varsayılan olarak IIS 7, HTTP Modülleri ve İşleyicileri bölümünde <system.web> kayıtlıysa şikayet eder. validateIntegratedModeConfiguration öğesindeki <validation> özniteliği, IIS 7'ye bu tür hata iletilerini gizlemesini emreder.

HTTP İşleyicisi'ni kaydetme söz diziminin ErrorLogPageFactory olarak ayarlanmış bir path öznitelik içerdiğini elmah.axdunutmayın. Bu öznitelik, web uygulamasına adlı elmah.axd bir sayfa için istek gelmesi durumunda isteğin HTTP İşleyicisi tarafından ErrorLogPageFactory işlenmesi gerektiğini bildirir. Bu öğreticinin ErrorLogPageFactory ilerleyen bölümlerinde HTTP İşleyicisi'nin çalıştığını göreceğiz.

3. Adım: ELMAH'yi Yapılandırma

ELMAH, web sitesinin Web.config dosyasındaki yapılandırma seçeneklerini adlı <elmah>özel bir yapılandırma bölümünde arar. içindeki özel bir bölümü Web.config kullanmak için önce öğesinde <configSections> tanımlanmalıdır. Web.config Dosyasını açın ve dosyasına aşağıdaki işaretlemeyi <configSections>ekleyin:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
  ...

  <sectionGroup name="elmah">
  <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
  <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
  <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
  <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
  </sectionGroup>
  </configSections>

  ...
</configuration>

Not

ELMAH'yi bir ASP.NET 1.x uygulaması için yapılandırıyorsanız özniteliğini requirePermission="false" yukarıdaki öğelerden <section> kaldırın.

Yukarıdaki söz dizimi özel <elmah> bölümü ve alt bölümlerini kaydeder: <security>, <errorLog>, <errorMail>ve <errorFilter>.

Ardından bölümünü öğesine Web.configekleyin<elmah>. Bu bölüm, öğesiyle aynı düzeyde <system.web> görünmelidir. bölümün <elmah> içine ve <errorLog> bölümlerini ekleyin<security>:

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  <security allowRemoteAccess="0" />
  
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ReviewsConnectionString" />
  </elmah>

  ...
</configuration>

Bölümün <security>allowRemoteAccess özniteliği uzaktan erişime izin verilip verilmeyeceğini gösterir. Bu değer 0 olarak ayarlanırsa hata günlüğü web sayfası yalnızca yerel olarak görüntülenebilir. Bu öznitelik 1 olarak ayarlanırsa, hem uzak hem de yerel ziyaretçiler için hata günlüğü web sayfası etkinleştirilir. Şimdilik, uzak ziyaretçiler için hata günlüğü web sayfasını devre dışı bırakalım. Bunu yapmanın güvenlik sorunlarını tartışma fırsatı buldukktan sonra uzaktan erişime izin vereceğiz.

<errorLog> bölümü, hata ayrıntılarının kaydedildiği yeri belirten hata günlüğü kaynağını tanımlar; sistem durumu izleme sistemindeki bölüme <providers> benzer. Yukarıdaki söz dizimi, hata günlüğü kaynağı olarak sınıfını belirtir SqlErrorLog ve bu da hataları öznitelik değeri tarafından belirtilen bir Microsoft SQL Server veritabanına günlüğe connectionStringName kaydeder.

Not

ELMAH bir XML dosyasına, Microsoft Access veritabanına, Oracle veritabanına ve diğer veri depolarına hataları günlüğe kaydetmek için kullanılabilecek ek hata günlüğü sağlayıcılarıyla birlikte geliyor. Bu alternatif hata günlüğü sağlayıcılarının nasıl kullanılacağı hakkında bilgi için ELMAH indirmesine dahil edilen örnek Web.config dosyaya bakın.

4. Adım: Hata Günlüğü Kaynak Altyapısını Oluşturma

ELMAH sağlayıcısı SqlErrorLog hata ayrıntılarını belirtilen bir Microsoft SQL Server veritabanına kaydeder. Sağlayıcı SqlErrorLog bu veritabanının adlı ELMAH_Error ve üç saklı yordamı olan bir tablosu olmasını bekler: ELMAH_GetErrorsXml, ELMAH_GetErrorXmlve ELMAH_LogError. ELMAH indirmesi, bu tabloyu ve bu saklı yordamları oluşturmak için T-SQL'i içeren klasörde adlı SQLServer.sqldb bir dosya içerir. Sağlayıcıyı kullanmak SqlErrorLog için bu deyimleri veritabanınızda çalıştırmanız gerekir.

Şekil 1 ve 2'de , sağlayıcı tarafından gereken veritabanı nesneleri eklendikten sonra Visual Studio'daki SqlErrorLog Veritabanı Gezgini gösterilmektedir.

S Q L hata günlüğü sağlayıcısı günlük hatalarını içeren ELMAH hata tablosunu gösteren ekran görüntüsü.

Şekil 1: Sağlayıcı Hataları SqlErrorLog Tabloya ELMAH_Error Kaydeder

S Q L hata günlüğü sağlayıcısının üç saklı yordamı nasıl kullandığını gösteren ekran görüntüsü.

Şekil 2: SqlErrorLog Sağlayıcı üç saklı yordam kullanır

ELMAH İş Başında

Bu noktada, web uygulamasına ELMAH ekledik, HTTP Modülünü ErrorLogModule ve ErrorLogPageFactory HTTP İşleyicisini kaydettik, ELMAH'nin yapılandırma seçeneklerini içinde Web.configbelirttik ve hata günlüğü sağlayıcısı için SqlErrorLog gerekli veritabanı nesnelerini ekledik. ARTıK ELMAH'ı iş başında görmeye hazırız! Kitap İncelemeleri web sitesini ziyaret edin ve gibi Genre.aspx?ID=foobir çalışma zamanı hatası veya gibi mevcut olmayan bir sayfa oluşturan bir sayfayı NoSuchPage.aspxziyaret edin. Bu sayfaları ziyaret ederken ne göreceğiniz yapılandırmaya <customErrors> ve yerel olarak mı yoksa uzaktan mı ziyaret ettiğinize bağlıdır. (Bu konudaki bir yenileyici için Özel Hata Sayfası Görüntüleme öğreticisine geri bakın.)

ELMAH, işlenmeyen bir özel durum oluştuğunda kullanıcıya gösterilen içeriği etkilemez; yalnızca ayrıntılarını günlüğe kaydeder. Bu hata günlüğüne web sitenizin kökünden ( gibihttp://localhost/BookReviews/elmah.axd) web sayfasından elmah.axd erişilebilir. (Bu dosya projenizde fiziksel olarak yok, ancak çalışma zamanı için elmah.axd bir istek geldiğinde bunu HTTP İşleyicisi'ne ErrorLogPageFactory gönderir ve bu da tarayıcıya geri gönderilen işaretlemeyi oluşturur.)

Not

ElmaH'a elmah.axd test hatası oluşturmasını bildirmek için de sayfayı kullanabilirsiniz. Ziyaret etmek elmah.axd/test (örneğin, http://localhost/BookReviews/elmah.axd/test) ELMAH'nın Elmah.TestExceptiontüründe bir özel durum oluşturmasına neden olur ve şu hata iletisine sahiptir: "Bu, güvenle yoksayılabilir bir test özel durumudur."

Şekil 3'de geliştirme ortamından ziyaret elmah.axd sırasında oluşan hata günlüğü gösterilmektedir.

Web sayfasından hata günlüğünü görüntüleyen ekran görüntüsü.

Şekil 3: Elmah.axd Web Sayfasından Hata Günlüğünü görüntüler
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 3'teki hata günlüğü altı hata girdisi içerir. Her giriş HTTP durum kodunu (bu hatalar için 404 veya 500), türü, açıklamayı, hata oluştuğunda oturum açmış olan kullanıcının adını ve tarih ve saati içerir. Ayrıntılar bağlantısına tıklanması, Hata Ayrıntıları Sarı Ölüm Ekranı'nda gösterilen hata iletisinin aynısını içeren bir sayfa görüntüler (bkz . Şekil 4) ve hata sırasındaki sunucu değişkenlerinin değerleri (bkz . Şekil 5). Http POST üst bilgisindeki değerler gibi ek bilgileri içeren hata ayrıntılarının kaydedildiği ham XML'yi de görüntüleyebilirsiniz.

Y S O D hata ayrıntılarını görüntüleyebileceğinizi gösteren ekran görüntüsü.

Şekil 4: Hata Ayrıntılarını Görüntüleme YSOD
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Hata sırasında sunucu değişkenleri koleksiyonunun değerlerinin nasıl keşfedildiğini gösteren ekran görüntüsü.

Şekil 5: Hata Anında Sunucu Değişkenleri Koleksiyonunun Değerlerini Keşfetme
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

ELMAH'nin üretim web sitesine dağıtılması için gerekenler:

  • Elmah.dll Dosyayı üretim ortamındaki Bin klasöre kopyalama,
  • ELMAH'ye özgü yapılandırma ayarlarını üretimde kullanılan dosyaya Web.config kopyalama ve
  • Hata günlüğü kaynak altyapısını üretim veritabanına ekleme.

Önceki öğreticilerde geliştirme aşamasından üretime dosya kopyalama tekniklerini inceledik. Üretim veritabanında hata günlüğü kaynak altyapısını almanın en kolay yolu, üretim veritabanına bağlanmak için SQL Server Management Studio kullanmak ve ardından gerekli tablo ve saklı yordamları oluşturacak betik dosyasını yürütmektirSqlServer.sql.

Üretimde Hata Ayrıntıları Sayfasını Görüntüleme

Sitenizi üretime dağıttıktan sonra üretim web sitesini ziyaret edin ve işlenmeyen bir özel durum oluşturun. Geliştirme ortamında olduğu gibi, ELMAH işlenmeyen bir özel durum oluştuğunda görüntülenen hata sayfasında hiçbir etkisi yoktur; bunun yerine yalnızca hatayı günlüğe kaydeder. Üretim ortamından hata günlüğü sayfasını (elmah.axd) ziyaret etmeye çalışırsanız, Şekil 6'da gösterilen Yasak sayfasıyla karşılanırsınız.

Uzak ziyaretçilerin hata günlüğü web sayfasını varsayılan olarak nasıl görüntüleyebileceğini gösteren ekran görüntüsü.

Şekil 6: Varsayılan olarak, Uzak Ziyaretçiler Hata Günlüğü Web Sayfasını Görüntüleyemez
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

ELMAH yapılandırmasının <security> bölümünde özniteliğini allowRemoteAccess 0 olarak ayarladığımız ve bu da uzak kullanıcıların hata günlüğünü görüntülemesini yasaklamıştı. Hata ayrıntıları güvenlik açıklarını veya diğer hassas bilgileri ortaya çıkarabileceğinden anonim ziyaretçilerin hata günlüğünü görüntülemesini yasaklamamak önemlidir. Bu özniteliği 1 olarak ayarlamaya ve hata günlüğüne uzaktan erişimi etkinleştirmeye karar verirseniz, yolu yalnızca yetkili ziyaretçilerin erişebilmesi için kilitlemeniz elmah.axd önemlidir. Bu, dosyaya Web.config bir <location> öğe eklenerek elde edilebilir.

Aşağıdaki yapılandırma yalnızca Yönetici rolündeki kullanıcıların hata günlüğü web sayfasına erişmesine izin verir:

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  <security allowRemoteAccess="1" />
  
  ...
  </elmah>

  ...

  <location path="elmah.axd">
  <system.web>
  <authorization>
  <allow roles="Admin" />
  <deny users="*" />
  </authorization>
  </system.web>  
  </location>
</configuration>

Not

Yönetici rolü ve sistemdeki üç kullanıcı - Scott, Jisun ve Alice - Uygulama Hizmetlerini Kullanan Bir Web Sitesi Yapılandırma öğreticisine eklendi. Scott ve Jisun kullanıcıları Yönetici rolünün üyeleridir. Kimlik doğrulaması ve yetkilendirme hakkında daha fazla bilgi için Web Sitesi Güvenliği Öğreticilerim'e bakın.

Üretim ortamındaki hata günlüğü artık uzak kullanıcılar tarafından görüntülenebilir; Hata günlüğü web sayfasının ekran görüntüleri için Şekiller 3, 4 ve 5'e geri bakın. Ancak anonim veya Yönetici olmayan bir kullanıcı hata günlüğü sayfasını görüntülemeye çalışırsa, Şekil 7'de gösterildiği gibi otomatik olarak oturum açma sayfasına ()Login.aspx yönlendirilir.

Yetkisiz kullanıcıların otomatik olarak oturum açma sayfasına yönlendirildiğini gösteren ekran görüntüsü.

Şekil 7: Yetkisiz Kullanıcılar Otomatik Olarak Oturum Açma Sayfasına Yönlendiriliyor
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Program Aracılığıyla Günlüğe Kaydetme Hataları

ELMAH'ın ErrorLogModule HTTP Modülü, işlenmeyen özel durumları otomatik olarak belirtilen günlük kaynağına kaydeder. Alternatif olarak, sınıfını Raise ve yöntemini kullanarak ErrorSignal işlenmeyen bir özel durum oluşturmadan bir hata kaydedebilirsiniz. Raise yöntemine bir Exception nesne geçirilir ve bu özel durum oluşturuldu ve işlenmeden ASP.NET çalışma zamanına ulaşmış gibi günlüğe kaydeder. Ancak fark, yöntem çağrıldıktan sonra Raise isteğin normal şekilde yürütülmeye devam etmesi, oluşturulurken işlenmeyen bir özel durumun isteğin normal yürütmesini kesintiye uğratması ve ASP.NET çalışma zamanının yapılandırılmış hata sayfasını görüntülemesine neden olmasıdır.

Sınıfı ErrorSignal , başarısız olabilecek bazı eylemlerin olduğu ancak başarısızlığının gerçekleştirilmekte olan genel işlem için yıkıcı olmadığı durumlarda yararlıdır. Örneğin, bir web sitesi kullanıcının girişini alan, bir veritabanında depolayan ve ardından kullanıcıya bilgilerin işlendiğini bildiren bir e-posta gönderen bir form içerebilir. Bilgiler veritabanına başarıyla kaydedilirse ancak e-posta iletisi gönderilirken bir hata oluşursa ne olmalıdır? Bir seçenek özel durum oluşturup kullanıcıyı hata sayfasına göndermek olabilir. Ancak bu, kullanıcının girdiği bilgilerin kaydedilmediğini düşünmesine neden olabilir. Bir diğer yaklaşım da e-postayla ilgili hatayı günlüğe kaydetmektir, ancak kullanıcının deneyimini hiçbir şekilde değiştirmemektir. Sınıfın yararlı olduğu yer ErrorSignal burasıdır.

' ... Save user's information to the database ...
...
' Attempt to send the user a confirmation email
    ' ... Send an email ...
Try
Catch e As Exception
' Error in sending email. Log it!
ErrorSignal.FromCurrentContext().Raise(e)
End Try

Email Aracılığıyla Hata Bildirimi

ELMAH, veritabanındaki günlük hatalarıyla birlikte hata ayrıntılarını belirtilen alıcıya e-postayla gönderecek şekilde de yapılandırılabilir. Bu işlev HTTP Modülü tarafından ErrorMailModule sağlanır; bu nedenle hata ayrıntılarını e-postayla göndermek için bu HTTP Modülünü Web.config kaydetmeniz gerekir.

<?xml version="1.0"?>
<configuration>
  ...
  
  <system.web>
  ...

  <httpModules>
  ...
  
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
  </httpModules>
  </system.web>

  <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  ...

  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  <add name="Elmah.ErrorMail" type="Elmah.ErrorMailModule" preCondition="managedHandler" />
  </modules>
  
  ...
  </system.webServer>
</configuration>

Ardından, öğenin <errorMail> bölümünde, e-postanın <elmah> gönderenini ve alıcısını, konusunu ve e-postanın zaman uyumsuz olarak gönderilip gönderilmediğini belirten hata e-postası hakkındaki bilgileri belirtin.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  ...

  <errorMail from="support@example.com"
  to="support@example.com"
  subject="Book Reviews Runtime Error"
  async="true" />
  </elmah>

  ...
</configuration>

Yukarıdaki ayarlar uygulandığında, ELMAH her çalışma zamanı hatası oluştuğunda hata ayrıntılarını içeren bir e-posta support@example.com gönderir. ELMAH'ın hata e-postası, hata ayrıntıları web sayfasında gösterilen bilgilerle (hata iletisi, yığın izlemesi ve sunucu değişkenleri) içerir ( Şekil 4 ve 5'e geri bakın). Hata e-postası ek olarak Özel Durum Ayrıntıları Sarı Ölüm Ekranı içeriğini de içerir (YSOD.html).

Şekil 8'de ELMAH'nin ziyaret ederek oluşturduğu hata e-postası gösterilmektedir Genre.aspx?ID=foo. Şekil 8'de yalnızca hata iletisi ve yığın izleme gösteriliyor olsa da, sunucu değişkenleri e-postanın gövdesine daha da aşağıya eklenir.

E-posta aracılığıyla hata ayrıntılarını göndermek için ELMAH'nin nasıl yapılandırıldığını gösteren ekran görüntüsü.

Şekil 8: ELMAH'ı hata ayrıntılarını Email yoluyla gönderecek şekilde yapılandırabilirsiniz
(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Yalnızca İlgilenen Günlüğe Kaydetme Hataları

Varsayılan olarak, ELMAH 404 ve diğer HTTP hataları dahil olmak üzere işlenmeyen her özel durumun ayrıntılarını günlüğe kaydeder. Hata filtrelemeyi kullanarak ELMAH'ye bu hataları veya diğer hata türlerini yoksaymasını bildirebilirsiniz. Filtreleme mantığı ELMAH'ın ErrorFilterModule HTTP Modülü tarafından gerçekleştirilir ve filtreleme mantığını kullanmak için bu modüle kaydolmanız Web.config gerekir. Filtreleme kuralları bölümünde <errorFilter> belirtilir.

Aşağıdaki işaretleme ELMAH'ye 404 hatalarını günlüğe kaydetmemesi talimatını vemektedir.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  ...

  <errorFilter>
  <test>
  <equal binding="HttpStatusCode" value="404" type="Int32" />
  </test>
  </errorFilter>
  </elmah>

  ...
</configuration>

Not

Unutmayın, hata filtrelemeyi kullanmak için HTTP Modülünü ErrorFilterModule kaydetmeniz gerekir.

<equal> Bölümün <test> içindeki öğesi onay olarak adlandırılır. Onaylama işlemi true olarak değerlendirilirse hata ELMAH günlüğünden filtrelenmiş olur. , vb. gibi <greater><lesser><greater-or-equal><not-equal><lesser-or-equal>başka onaylar da vardır. Onayları ve <or> Boole işleçlerini kullanarak <and> da birleştirebilirsiniz. Dahası, basit bir JavaScript ifadesini onay olarak dahil edebilir veya C# veya Visual Basic'te kendi onaylamalarınızı yazabilirsiniz.

ELMAH'ın hata filtreleme özellikleri hakkında daha fazla bilgi için ELMAH wiki'sindekiHata Filtreleme bölümüne bakın.

Özet

ELMAH, ASP.NET bir web uygulamasında hataları günlüğe kaydetmek için basit ama güçlü bir mekanizma sağlar. Microsoft'un sistem durumu izleme sistemi gibi ELMAH da hataları bir veritabanına kaydedebilir ve hata ayrıntılarını e-posta yoluyla bir geliştiriciye gönderebilir. Sistem durumu izleme sisteminden farklı olarak ELMAH; Microsoft SQL Server, Microsoft Access, Oracle, XML dosyaları ve diğerleri gibi daha geniş bir hata günlüğü veri depoları için hazır destek içerir. Ayrıca, ELMAH bir web sayfasından elmah.axdhata günlüğünü ve belirli bir hatayla ilgili ayrıntıları görüntülemek için yerleşik bir mekanizma sunar. Sayfa elmah.axd ayrıca hata bilgilerini RSS akışı olarak veya Microsoft Excel kullanarak okuyabileceğiniz virgülle ayrılmış değer dosyası (CSV) olarak da işleyebilir. ElmaH'a bildirim temelli veya programlı onayları kullanarak günlükteki hataları filtrelemesini de bildirebilirsiniz. ELMAH, ASP.NET sürüm 1.x uygulamalarıyla kullanılabilir.

Dağıtılan her uygulamanın, işlenmeyen özel durumları otomatik olarak günlüğe kaydetmeye ve geliştirme ekibine bildirim göndermeye yönelik bir mekanizması olmalıdır. Bunun sistem durumu izleme kullanılarak mı yoksa ELMAH mı ikincil olarak gerçekleştirilmesidir. Başka bir deyişle, sağlık izleme veya ELMAH kullanmanız önemli değildir; her iki sistemi de değerlendirin ve ardından ihtiyaçlarınıza en uygun olanı seçin. Temel olarak önemli olan, üretim ortamında işlenmeyen özel durumları günlüğe kaydetmek için bir mekanizmanın devreye alınmasıdır.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: