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:
- ELMAH'yi indirin ve derlemeyi
Elmah.dll
web uygulamanıza ekleyin, - ELMAH'ın HTTP Modüllerini ve İşleyicisini'ne
Web.config
kaydedin. - ELMAH'ın yapılandırma seçeneklerini belirtin ve
- 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ırError
. 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 HttpApplication
abone 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.axd
unutmayı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.config
ekleyin<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_GetErrorXml
ve ELMAH_LogError
. ELMAH indirmesi, bu tabloyu ve bu saklı yordamları oluşturmak için T-SQL'i içeren klasörde adlı SQLServer.sql
db
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.
Şekil 1: Sağlayıcı Hataları SqlErrorLog
Tabloya ELMAH_Error
Kaydeder
Ş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.config
belirttik 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=foo
bir çalışma zamanı hatası veya gibi mevcut olmayan bir sayfa oluşturan bir sayfayı NoSuchPage.aspx
ziyaret 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.TestException
tü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.
Ş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.
Ş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)
Ş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ındakiBin
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.
Ş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.
Ş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.
Ş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.axd
hata 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: