29 Oca 2008 Hata Mesajlarının Event Log’a Yazılması Kategori: .NET Framework Etiketler: C#.NET Framework 3 Yorum Merhaba arkadaşlar bu makalemiz de benim hemen hemen her proje kullandığım hata mesajlarının event loga yazdırılmasından bahsedeceğim. Bir proje de bir hata olduğun da bunun nedenini bulmak için projeyi açar debug eder uzunca bir müddet o hatayı ararız (Bu arama bazen çok kısa da sürebilir J ). Bu proje asamasında çok sorun olmasa da proje yayına girdiginde programın hata verip vermedigini ancak kullanıcıların geri bildirimleriyle anlayabiliriz. Her ne kadar testerlar projeyi çok çok iyi test etseler de zamanla beklenmedik sorunlarla karsılasabiliriz. Bu sorunlardan aklıma ilk gelen sey Data tarafında kaynaklanan sorunlar olabilecegidir. (SQL Server'in Timeout'a düsmesi vb.gibi sorunlar). Yazdıgımız programın hata verip vermedigini kullanıcıların anlayamadıgı baska sorunlar var mı? Yok mu? Gibi sorunları takip etmek için try-catch blogunda hata mesajlarını Event Log'a yazdırıp oradan takip edebiliyor olacagız. Niye Böyle bir sey Yapalım ki? Isimizi sansa ve kullanıcıya bırakmadan projemizdeki bugları bulabilecegız. (Ne demisler koyundan post userdan dost olmaz J) Bu da kötü niyetli kullanıcıların programdaki bugları degerlendirmesine engel olacaktır. Buda projemizin daha saglıklı ilerlemesini saglayacaktır. ÖRNEK: Konuyla ilgili bir örnek yapalım. Ilk olarak hata mesajını event loga nasıl yazacagız ona bakalım. Bunun için Bos bir Class açalım. HataMesajiYaz Adında Static bir metod yazacagız.Ilk olarak using System.Diagnostics; Namespaceni projemize dahil etmeliyiz. C# .NET EventLogaYaz.cs public static void HataMesajiYaz(Exception HataMesaji) { string strLogMessage = "\nMessage : " + HataMesaji.Message + "\nSource : " + HataMesaji.Source + "\nTarget Site : " + HataMesaji.TargetSite + "\nStack Trace : " + HataMesaji.StackTrace; string logName = "BenimProjem"; // EventLogda Hata Mesajının Nereye yazılacagını Belirliyoruz. BenimProjem adında bir Log adı olmadıgı için açmamız gerekiyor. Bunu da asagıda anlatacagım. if (!EventLog.SourceExists(logName)) { EventLog.CreateEventSource(logName, logName); } EventLog log = new EventLog(); log.Source = logName; //Nereye yazılacak? Event Logda BenimProjem Event log dosyasına yazılacak. strLogMessage += "\r\n\r\n--------------------------\r\n\r\n" + HataMesaji.ToString(); // Hata Mesajını alıyoruz. log.WriteEntry(strLogMessage, EventLogEntryType.Error, 65534); // Hata mesajını log dosyasına yazdırıyoruz. } Simdi aynı islemin VB.NET ile nasıl yapıldıgına bakalım. VB .NET EventLogaYaz.vb Public Shared Sub HataMesajiYaz(ByVal HataMesaji As Exception) Dim strLogMessage As String = "" & Chr(10) & "Message : " + HataMesaji.Message + "" & Chr(10) & "Source : " + HataMesaji.Source + "" & Chr(10) & "Target Site : " + HataMesaji.TargetSite + "" & Chr(10) & "Stack Trace : " + HataMesaji.StackTrace Dim logName As String = " BenimProjem " If Not EventLog.SourceExists(logName) Then EventLog.CreateEventSource(logName, logName) End If Dim log As New EventLog() log.Source = logName strLogMessage += "" & Chr(13) & "" & Chr(10) & "" & Chr(13) & "" & Chr(10) & "--------------------------" & Chr(13) & "" & Chr(10) & "" & Chr(13) & "" & Chr(10) & "" + HataMesaji.ToString() log.WriteEntry(strLogMessage, EventLogEntryType.[Error], 65534) End Sub Yukarıda da bahsettigim gibi projemiz için EventLog da yeni bir Log adı açmamız gerekiyor. Bunun için Kayıt Defterine girip yeni bir Dosya Adı açmalıyız. Bu dosya Adı da yukarıda belirttigimiz BenimProjem olacak J Kayıt Defterini açıp HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog Gelip, EventLog üzerinde sag tus diyelim. Yeni Sekmesinden Anahtarı seçelim ve BenimProjem Yazalım J Evet artık hata mesajlarımız artık loga yazılmaya hazır J Simdi bir proje de hata ve hatalar yapalım J public HaberKolleksiyonu HaberleriGetir(int KategoriID, int AktifSayfa) { try { SqlParameter[] parameters = new SqlParameter[] { new SqlParameter("@KategoriID",KategoriID), new SqlParameter("@AktifSayfa", AktifSayfa) }; Ds = SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, "HaberleriGetir",parameters); if (Ds != null && Ds.Tables.Count > 0&& Ds.Tables[0].Rows.Count>0) { kHaberKolleksiyonu = new HaberKolleksiyonu(); for (int i = 0; i < Ds.Tables[0].Rows.Count; i++) { nHaberNesnesi = new HaberNesnesi(); Ds.Tables[0].Rows[i]["werwerwe"].ToString(); > Burada Hata yaptık J Böyle Bir field yok kHaberKolleksiyonu.Add(nHaberNesnesi); nHaberNesnesi = null; } } return kHaberKolleksiyonu; } catch (Exception HataMesaji) { LogYonetimi.HataMesajiYaz(HataMesaji); // Burada hata MesajınıEventloga yazdırıyoruz return null; } Simdi event loga gidelim. Hatayı loga yazdık bakalım hata mesajı olarak ne yazıyor. Message : Column 'werwerwe' does not belong to table Table. > Bu tabloda böyle field bulunamadı ! Geçmis olsun J Bu makalenin de sonunda geldik. Baska bir makale de görüsmek üzere. Sem Göksusem.goksu@yazilimgunlugu.com www.semgoksu.com | www.yazilimgunlugu.com Kaynaklar www.msdn.com ww.aspalliance.com Yorum (3) hakan / 8.6.2014 02:28:34 ‘System.Security.SecurityException’ türünde bir yakalanamayan özel durum, System.dll öğesinde oluştu Ek bilgi: Kaynak bulunamadı; ancak olay günlüklerinin bazılarında veya hiçbirinde arama yapılamadı. Erişilemeyen günlükler: Security. Hatasını nasıl düzeltebilirim. gerekli log dosyasını oluşturdum ama böyle bir hata alıyorum Erdem / 9.1.2015 23:21:41 Hakan, Sorunun üzerinden çok geçmiş ama cevabını yazayım. Başka arkadaşlarda benzer hataya düşmesin. Security günlüğüne erişemiyorsun yani gerekli izinleri açmamışsın. Bunun için regedit te Eventlog Security üzerinde sağ tıklayıp izinleri aç. Kaynak kısmına gelince yazma iznin yoksa oluşturamazsın. Onun için eventlog u sağ tıkla ve izinleri aç. Fatih Erol / 12.12.2016 23:03:57 Vs yi sağ tıkla ve yönetici olarak çalıştır de.sorun düzelecektir. Yorum Yaz * Ad Soyad: * Email: * Message:
Yorum (3) hakan / 8.6.2014 02:28:34 ‘System.Security.SecurityException’ türünde bir yakalanamayan özel durum, System.dll öğesinde oluştu Ek bilgi: Kaynak bulunamadı; ancak olay günlüklerinin bazılarında veya hiçbirinde arama yapılamadı. Erişilemeyen günlükler: Security. Hatasını nasıl düzeltebilirim. gerekli log dosyasını oluşturdum ama böyle bir hata alıyorum Erdem / 9.1.2015 23:21:41 Hakan, Sorunun üzerinden çok geçmiş ama cevabını yazayım. Başka arkadaşlarda benzer hataya düşmesin. Security günlüğüne erişemiyorsun yani gerekli izinleri açmamışsın. Bunun için regedit te Eventlog Security üzerinde sağ tıklayıp izinleri aç. Kaynak kısmına gelince yazma iznin yoksa oluşturamazsın. Onun için eventlog u sağ tıkla ve izinleri aç. Fatih Erol / 12.12.2016 23:03:57 Vs yi sağ tıkla ve yönetici olarak çalıştır de.sorun düzelecektir.
hakan / 8.6.2014 02:28:34 ‘System.Security.SecurityException’ türünde bir yakalanamayan özel durum, System.dll öğesinde oluştu Ek bilgi: Kaynak bulunamadı; ancak olay günlüklerinin bazılarında veya hiçbirinde arama yapılamadı. Erişilemeyen günlükler: Security. Hatasını nasıl düzeltebilirim. gerekli log dosyasını oluşturdum ama böyle bir hata alıyorum
Erdem / 9.1.2015 23:21:41 Hakan, Sorunun üzerinden çok geçmiş ama cevabını yazayım. Başka arkadaşlarda benzer hataya düşmesin. Security günlüğüne erişemiyorsun yani gerekli izinleri açmamışsın. Bunun için regedit te Eventlog Security üzerinde sağ tıklayıp izinleri aç. Kaynak kısmına gelince yazma iznin yoksa oluşturamazsın. Onun için eventlog u sağ tıkla ve izinleri aç.