ASP.NET Durum İzleme ile Hata Ayrıntılarını Günlüğe Kaydetme (C#)
tarafından Scott Mitchell
Microsoft'un sistem durumu izleme sistemi, işlenmeyen özel durumlar da dahil olmak üzere çeşitli web olaylarını günlüğe kaydetmek için kolay ve özelleştirilebilir bir yol sağlar. Bu öğreticide, veritabanında işlenmeyen özel durumları günlüğe kaydetmek ve geliştiricileri e-posta iletisiyle bilgilendirmek için sistem durumu izleme sisteminin ayarlanmasında yol gösterilir.
Giriş
Günlüğe kaydetme, dağıtılan bir uygulamanın durumunu izlemek ve ortaya çıkabilecek sorunları tanılamak için kullanışlı bir araçtır. Özellikle dağıtılan bir uygulamada oluşan hataların düzeltilebilmeleri için günlüğe kaydedilmesi önemlidir. bir Error
ASP.NET uygulamasında işlenmeyen bir özel durum oluştuğunda olay oluşturulur; yukarıdaki öğreticide bir geliştiriciye hata bildiriminde bulunup olay için bir olay işleyicisi oluşturarak ayrıntılarının nasıl günlüğe kaydedildiği Error
gösterilir. Ancak, hatanın ayrıntılarını günlüğe kaydetmek ve bir geliştiriciyi bilgilendirmek için olay işleyicisi oluşturmak Error
gereksizdir, çünkü bu görev ASP tarafından gerçekleştirilebilir. NET'in sistem durumu izleme sistemi.
Sistem durumu izleme sistemi ASP.NET 2.0'da kullanıma sunulmuştur ve uygulamanın veya isteğin ömrü boyunca gerçekleşen olayları günlüğe kaydederek dağıtılan bir ASP.NET uygulamasının durumunu izlemek için tasarlanmıştır. Sistem durumu izleme sistemi tarafından günlüğe kaydedilen olaylar, sistem durumu izleme olayları veya Web olayları olarak adlandırılır ve şunları içerir:
- Uygulama başlatıldığında veya durduğunda olduğu gibi uygulama ömrü olayları
- Başarısız oturum açma girişimleri ve başarısız URL yetkilendirme istekleri dahil olmak üzere güvenlik olayları
- İşlenmeyen özel durumlar, durum ayrıştırma özel durumlarını görüntüleme, istek doğrulama özel durumları ve derleme hataları gibi uygulama hataları ve diğer hata türleri.
Sistem durumu izleme olayı tetiklendiğinde, belirtilen herhangi bir sayıda günlük kaynağına günlüğe kaydedilebilir. Sistem durumu izleme sistemi, Web olaylarını bir Microsoft SQL Server veritabanına, Windows Olay Günlüğü'ne veya e-posta iletisiyle günlüğe kaydeden günlük kaynaklarıyla birlikte gönderilir. Ayrıca kendi günlük kaynaklarınızı da oluşturabilirsiniz.
Sistem durumu izleme sistemi günlüklerinin yanı sıra kullanılan günlük kaynaklarıyla birlikte olayları içinde Web.config
tanımlanır. Birkaç yapılandırma işaretleme satırıyla, işlenmeyen tüm özel durumları bir veritabanına kaydetmek ve özel durumu e-posta yoluyla size bildirmek için sistem durumu izlemeyi kullanabilirsiniz.
Sistem Durumu İzleyicisi Sistemi Yapılandırmasını Keşfetme
Sistem durumu izleme sisteminin davranışı, öğesinde <healthMonitoring>
Web.config
bulunan yapılandırma bilgileriyle tanımlanır. Bu yapılandırma bölümü, diğer şeylerin dışında aşağıdaki üç önemli bilgi parçasını tanımlar:
- Tetiklendiğinde günlüğe kaydedilmesi gereken sistem durumu izleme olayları,
- Günlük kaynakları ve
- (1) içinde tanımlanan her sistem durumu izleme olayının (2) içinde tanımlanan günlük kaynaklarıyla nasıl eşlendiği.
Bu bilgiler üç alt yapılandırma öğesiyle belirtilir: <eventMappings>
sırasıyla , <providers>
ve <rules>
.
Varsayılan sistem durumu izleme sistemi yapılandırma bilgileri klasöründeki Web.config
dosyada %WINDIR%\Microsoft.NET\Framework\version\CONFIG
bulunabilir. Kısa bir süre için bazı işaretlemelerin kaldırıldığı bu varsayılan yapılandırma bilgileri aşağıda gösterilmiştir:
<configuration>
<system.web>
<healthMonitoring>
<eventMappings>
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
<add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
</eventMappings>
<providers>
<add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
<add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
<rules>
<add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
<add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
</rules>
</healthMonitoring>
</system.web>
</configuration>
İlgilenilen sistem durumu izleme olayları, bir sistem durumu izleme olayları sınıfına insan dostu bir ad veren öğesinde <eventMappings>
tanımlanır. Yukarıdaki işaretlemede, <eventMappings>
öğesi türündeki sistem durumu izleme olaylarına insan dostu "Tüm Hatalar" adını ve türündeki WebBaseErrorEvent
sistem durumu izleme olaylarına WebFailureAuditEvent
"Hata Denetimleri" adını atar.
<providers>
öğesi, günlük kaynaklarını tanımlayarak onlara insan dostu bir ad verir ve günlük kaynağına özgü yapılandırma bilgilerini belirtir. İlk <add>
öğe, sınıfını kullanarak belirtilen sistem durumu izleme olaylarını günlüğe kaydeden "EventLogProvider" sağlayıcısını EventLogWebEventProvider
tanımlar. sınıfı, EventLogWebEventProvider
olayı Windows Olay Günlüğü'ne günlüğe kaydeder. İkinci <add>
öğe, olayları sınıfı aracılığıyla bir Microsoft SQL Server veritabanına günlüğe kaydeden "SqlWebEventProvider" sağlayıcısını SqlWebEventProvider
tanımlar. "SqlWebEventProvider" yapılandırması, diğer yapılandırma seçenekleri arasında veritabanının bağlantı dizesi (connectionStringName
) belirtir.
<rules>
öğesi öğesinde belirtilen olayları öğesindeki <eventMappings>
günlük kaynaklarıyla <providers>
eşler. Varsayılan olarak, ASP.NET web uygulamaları tüm işlenmeyen özel durumları ve denetim hatalarını Windows Olay Günlüğü'ne kaydeder.
Olayları Veritabanına Günlüğe Kaydetme
Sistem durumu izleme sisteminin varsayılan yapılandırması, uygulamanın dosyasına bir <healthMonitoring>
bölüm eklenerek web uygulaması tarafından web uygulaması Web.config
temelinde özelleştirilebilir. öğesini kullanarak , ve bölümlerine <add>
ek öğeler <eventMappings>
ekleyebilirsiniz.<rules>
<providers>
Varsayılan yapılandırmadan bir ayarı kaldırmak için öğesini kullanın <remove>
veya öğesini kullanarak <clear />
bu bölümlerden birinden tüm varsayılan değerleri kaldırın. Şimdi Book Reviews web uygulamasını sınıfını kullanarak SqlWebEventProvider
işlenmeyen tüm özel durumları bir Microsoft SQL Server veritabanına kaydedecek şekilde yapılandıralım.
SqlWebEventProvider
sınıfı sistem durumu izleme sisteminin bir parçasıdır ve sistem durumu izleme olayını belirtilen SQL Server veritabanına kaydeder. sınıfı, SqlWebEventProvider
belirtilen veritabanının adlı aspnet_WebEvent_LogEvent
bir saklı yordam içermesini bekler. Bu saklı yordama olayın ayrıntıları geçirilir ve olay ayrıntılarını depolamakla görevlendirilir. İyi haber, olay ayrıntılarını depolamak için bu saklı yordamı veya tabloyu oluşturmanıza gerek olmamasıdır. Bu nesneleri aracı kullanarak aspnet_regsql.exe
veritabanınıza ekleyebilirsiniz.
Not
Araç, aspnet_regsql.exe
ASP desteği eklediğimizde Application Services Kullanan Bir Web Sitesi Yapılandırma öğreticisinde yeniden ele alınmıştı. NET'in uygulama hizmetleri. Sonuç olarak, Book Reviews web sitesinin veritabanı zaten olay bilgilerini adlı aspnet_WebEvent_Events
bir tabloda depolayan saklı yordamı içeriraspnet_WebEvent_LogEvent
.
Gerekli saklı yordamı ve tabloyu veritabanınıza ekledikten sonra geriye kalan tek şey, sistem durumu izlemenin tüm işlenmeyen özel durumları veritabanına kaydetmesini bildirmektir. Web sitenizin dosyasına aşağıdaki işaretlemeyi ekleyerek bunu gerçekleştirin Web.config
:
<configuration>
...
<system.web>
...
<healthMonitoring enabled="true">
<eventMappings>
<clear />
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
startEventCode="0" endEventCode="2147483647" />
</eventMappings>
<providers>
<clear />
<add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
buffer="false" name="SqlWebEventProvider"
type="System.Web.Management.SqlWebEventProvider" />
</providers>
<rules>
<clear />
<add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
</healthMonitoring>
</system.web>
</configuration>
Yukarıdaki sistem durumu izleme yapılandırma işaretlemesi, , <providers>
ve bölümlerinden önceden tanımlanmış sistem durumu izleme yapılandırma bilgilerini <eventMappings>
silmek için öğeleri kullanır <clear />
<rules>
. Ardından bu bölümlerin her birine tek bir giriş ekler.
<eventMappings>
öğesi, işlenmeyen bir özel durum oluştuğunda tetiklenen "Tüm Hatalar" adlı tek bir durum izleme olayı tanımlar.- öğesi,
<providers>
sınıfını kullananSqlWebEventProvider
"SqlWebEventProvider" adlı tek bir günlük kaynağını tanımlar.connectionStringName
özniteliği, bölümünde tanımlanan<connectionStrings>
bağlantı dizesi adı olan "ReviewsConnectionString" olarak ayarlanmıştır. - Son olarak, <rules> öğesi bir "Tüm Hatalar" olayının "SqlWebEventProvider" sağlayıcısı kullanılarak günlüğe kaydedilmesi gerektiğini gösterir.
Bu yapılandırma bilgileri sistem durumu izleme sistemine, işlenmeyen tüm özel durumları Kitap Gözden Geçirmeleri veritabanına kaydetmesini sağlar.
Not
Olay WebBaseErrorEvent
yalnızca sunucu hataları için oluşturulur; bulunmayan bir ASP.NET kaynağı isteği gibi HTTP hataları için tetiklenmez. Bu, hem sunucu hem de HTTP hataları için tetiklenen sınıfın Error
olayının davranışından HttpApplication
farklıdır.
Sistem durumu izleme sistemini çalışır durumda görmek için web sitesini ziyaret edin ve ziyaret ederek Genre.aspx?ID=foo
bir çalışma zamanı hatası oluşturun. Uygun hata sayfasını görmeniz gerekir: Özel Durum Ayrıntıları Sarı Ölüm Ekranı (yerel olarak ziyaret ederken) veya özel hata sayfası (üretimde siteyi ziyaret ederken). Arka planda sistem durumu izleme sistemi hata bilgilerini veritabanına kaydetmiş. Tabloda bir kayıt aspnet_WebEvent_Events
olmalıdır (bkz . Şekil 1); bu kayıt az önce oluşan çalışma zamanı hatası hakkında bilgi içerir.
Şekil 1: Hata Ayrıntıları Tabloya aspnet_WebEvent_Events
Kaydedildi
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Web Sayfasında Hata Günlüğünü Görüntüleme
Web sitesinin geçerli yapılandırmasıyla sistem durumu izleme sistemi, işlenmeyen tüm özel durumları veritabanına kaydeder. Ancak sistem durumu izleme, bir web sayfası üzerinden hata günlüğünü görüntülemek için herhangi bir mekanizma sağlamaz. Ancak, veritabanındaki bu bilgileri görüntüleyen bir ASP.NET sayfası oluşturabilirsiniz. (Birazdan göreceğimiz gibi, hata ayrıntılarının size bir e-posta iletisinde gönderilmesini tercih edebilirsiniz.)
Böyle bir sayfa oluşturursanız, yalnızca yetkili kullanıcıların hata ayrıntılarını görüntülemesine izin vermek için gereken adımları uyguladığınıza emin olun. Sitenizde zaten kullanıcı hesapları kullanılıyorsa, sayfaya erişimi belirli kullanıcılar veya rollerle kısıtlamak için URL yetkilendirme kurallarını kullanabilirsiniz. Oturum açmış kullanıcıya göre web sayfalarına erişim verme veya bu sayfalara erişimi kısıtlama hakkında daha fazla bilgi için Web Sitesi Güvenliği Öğreticilerim'e bakın.
Not
Sonraki öğreticide ELMAH adlı alternatif bir hata günlüğü ve bildirim sistemi keşfedildi. ELMAH, hem web sayfasından hem de RSS akışı olarak hata günlüğünü görüntülemek için yerleşik bir mekanizma içerir.
Olayları E-postaya Günlüğe Kaydetme
Sistem durumu izleme sistemi, bir olayı e-posta iletisine "günlüğe kaydeden" bir günlük kaynağı sağlayıcısı içerir. Günlük kaynağı, e-posta iletisi gövdesinde veritabanına kaydedilen bilgilerin aynısını içerir. Belirli bir sistem durumu izleme olayı gerçekleştiğinde bir geliştiriciyi bilgilendirmek için bu günlük kaynağını kullanabilirsiniz.
Bir özel durum oluştuğunda e-posta alabilmemiz için Kitap İncelemeleri web sitesinin yapılandırmasını güncelleştirelim. Bunu başarmak için üç görev gerçekleştirmemiz gerekir:
- ASP.NET web uygulamasını e-posta gönderecek şekilde yapılandırın. Bu, e-posta iletilerinin yapılandırma öğesi aracılığıyla
<system.net>
nasıl gönderileceğini belirterek gerçekleştirilir. ASP.NET bir uygulamada e-posta iletileri gönderme hakkında daha fazla bilgi için bkz. ASP.NET ve System.Net.Mail'de E-posta Gönderme. - e-posta günlüğü kaynak sağlayıcısını
<providers>
öğesine kaydedin ve - "Tüm Hatalar" olayını (2) adımda eklenen günlük kaynağı sağlayıcısıyla eşleyen öğesine bir girdi
<rules>
ekleyin.
Sistem durumu izleme sistemi iki e-posta günlüğü kaynak sağlayıcısı sınıfı içerir: SimpleMailWebEventProvider
ve TemplatedMailWebEventProvider
. sınıfı, SimpleMailWebEventProvider
olay ayrıntılarını içeren bir düz metin e-posta iletisi gönderir ve e-posta gövdesinin çok az özelleştirmesini sağlar. sınıfıyla, e-posta iletisinin TemplatedMailWebEventProvider
gövdesi olarak işlenmiş işaretlemesi kullanılan bir ASP.NET sayfası belirtirsiniz. TemplatedMailWebEventProvider
sınıfı, e-posta iletisinin içeriği ve biçimi üzerinde çok daha fazla denetim sağlar, ancak e-posta iletisinin gövdesini oluşturan ASP.NET sayfasını oluşturmak için biraz daha ön iş gerektirir. Bu öğretici, sınıfını SimpleMailWebEventProvider
kullanmaya odaklanır.
Sistem durumu izleme sisteminin <providers>
dosyasındaki Web.config
öğesini, sınıfı için bir günlük kaynağı içerecek şekilde güncelleştirin SimpleMailWebEventProvider
:
<providers>
<clear />
<add type="System.Web.Management.SimpleMailWebEventProvider"
name="EmailWebEventProvider" buffer="false"
from="support@example.com" to="support@example.com"
subjectPrefix="Book Reviews Runtime Error: " />
<add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
buffer="false" name="SqlWebEventProvider"
type="System.Web.Management.SqlWebEventProvider" />
</providers>
Yukarıdaki işaretleme, günlük kaynağı sağlayıcısı olarak sınıfını kullanır SimpleMailWebEventProvider
ve "EmailWebEventProvider" kolay adını atar. Ayrıca, özniteliği e-posta <add>
iletisinin To ve From adresleri gibi ek yapılandırma seçeneklerini içerir.
E-posta günlük kaynağı tanımlandığında, geriye kalan tek şey sistem durumu izleme sistemine işlenmeyen özel durumları "günlüğe kaydetmek" için bu kaynağı kullanmasını bildirmektir. Bu, bölümüne yeni bir kural <rules>
eklenerek gerçekleştirilir:
<rules>
<clear />
<add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
<add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
Bölümü <rules>
artık iki kural içerir. "E-postaya Tüm Hatalar" adlı ilk hata, işlenmeyen tüm özel durumları "EmailWebEventProvider" günlük kaynağına gönderir. Bu kural, web sitesindeki hatalarla ilgili ayrıntıları belirtilen Son adresine gönderme etkisine sahiptir. "Veritabanına Yönelik Tüm Hatalar" kuralı, hata ayrıntılarını sitenin veritabanına günlüğe kaydeder. Sonuç olarak, sitede işlenmeyen bir özel durum oluştuğunda ayrıntıları hem veritabanına kaydedilir hem de belirtilen e-posta adresine gönderilir.
Şekil 2'de ziyaret ederken sınıfı tarafından SimpleMailWebEventProvider
oluşturulan e-posta gösterilmektedir Genre.aspx?ID=foo
.
Şekil 2: Hata Ayrıntıları E-posta İletisinde Gönderiliyor
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Özet
ASP.NET sistem durumu izleme sistemi, yöneticilerin dağıtılan bir web uygulamasının durumunu izlemesine izin verecek şekilde tasarlanmıştır. Uygulama durduğunda, bir kullanıcı sitede başarıyla oturum açtığında veya işlenmeyen bir özel durum oluştuğunda gibi bazı eylemler açıldığında sistem durumu izleme olayları tetiklenir. Bu olaylar herhangi bir sayıda günlük kaynağına kaydedilebilir. Bu öğreticide, bir veritabanına ve e-posta iletisi aracılığıyla işlenmeyen özel durumların ayrıntılarının nasıl günlüğe kaydedilecekleri gösterildi.
Bu öğretici, işlenmeyen özel durumları günlüğe kaydetmek için sistem durumu izlemeyi kullanmaya odaklanmıştır, ancak sistem durumu izlemenin dağıtılan bir ASP.NET uygulamasının genel durumunu ölçmek için tasarlandığını ve burada keşfedilmeyen çok sayıda sistem durumu izleme olayı ve günlük kaynağı içerdiğini unutmayın. Dahası, ihtiyaç ortaya çıktığında kendi sistem durumu izleme olaylarınızı ve günlük kaynaklarınızı oluşturabilirsiniz. Sağlık izleme hakkında daha fazla bilgi edinmek istiyorsanız, erik Reitan'ın sistem durumu izleme hakkında SSS bölümünü okumak iyi bir ilk adımdır. Bundan sonra, Nasıl Yapılır: ASP.NET 2.0'da Sistem Durumu İzleyicisi'yi kullanma bölümüne bakın.
Mutlu Programlama!
Daha Fazla Bilgi
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- ASP.NET Sistem Durumu İzleyicisi Genel Bakış
- ASP.NET Sistem Durumu İzleyicisi Sistemini Yapılandırma ve Özelleştirme
- SSS - ASP.NET 2.0'da Sistem Durumu İzleyicisi
- Nasıl yapılır: Sistem Durumu İzleyicisi Bildirimleri için E-posta Gönderme
- Nasıl yapılır: ASP.NET'da Sistem Durumu İzleyicisi kullanma
- ASP.NET'da Sistem Durumu İzleyicisi