Makale Özeti

Merhaba arkadaşlar bu makalemiz de benim hemen hemen her proje kullandığım hata mesajlarının event loga yazdırılmasından bahsediyor olacağım.

Makale

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 aşamasında çok sorun olmasa da proje yayına girdiğinde programın hata verip vermediğini ancak kullanıcıların geri bildirimleriyle anlayabiliriz.  Her ne kadar testerlar projeyi çok çok iyi test etseler de zamanla beklenmedik sorunlarla karşılaşabiliriz. Bu sorunlardan aklıma ilk gelen şey Data tarafında kaynaklanan sorunlar olabileceğidir. (SQL Server’in Timeout’a düşmesi vb.gibi sorunlar).

Yazdığımız programın hata verip vermediğini kullanıcıların anlayamadığı başka sorunlar var mı? Yok mu? Gibi sorunları takip etmek için try-catch bloğunda hata mesajlarını Event Log’a yazdırıp oradan takip edebiliyor olacağız.

Niye Böyle bir şey Yapalım ki?

İşimizi şansa ve kullanıcıya bırakmadan projemizdeki bugları bulabileceğız. (Ne demişler koyundan post userdan dost olmaz J) Bu da kötü niyetli kullanıcıların programdaki bugları  değerlendirmesine engel olacaktır. Buda projemizin daha sağlıklı ilerlemesini sağlayacaktır.

ÖRNEK:

Konuyla ilgili bir örnek yapalım. İlk olarak hata mesajını event loga nasıl yazacağız ona bakalım… Bunun için Boş bir Class açalım. HataMesajiYaz  Adında Static bir metod yazacağız.

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ılacağını Belirliyoruz… BenimProjem adında bir Log adı olmadığı için açmamız gerekiyor. Bunu da aşağıda anlatacağı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…

        } 

 

Şimdi aynı işlemin VB.NET ile nasıl yapıldığı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 bahsettiğim 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 belirttiğimiz BenimProjem olacak J

Kayıt Defterini açıp

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog Gelip, EventLog üzerinde sağ tuş 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

Şimdi 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);
                return null;
            }

Şimdi 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çmiş olsun J

Bu makalenin de sonunda geldik. Başka bir makale de görüşmek üzere.

Sem Göksu
sem.goksu@yazilimgunlugu.com
www.semgoksu.com | www.yazilimgunlugu.com

Kaynaklar

www.msdn.com
ww.aspalliance.com