Yazılım Mimarileri ve Tasarım Desenleri Üzerine

C# EventLog Sınıfının Kullanımı

Bu yazımda C#’ta EventLog sınıfının kullanımını göreceğiz.Bazen programın işleyişini veya hatalarını bilgi olarak loglamak isteriz.Bu gibi durumlar yazılımcı için önem arz etmektedir.Hataların sebeplerini logladığı veriler sayesinde daha rahat anlayabilir.Programın işleyiş biçimini loglardan rahatlıkla takip edebilir.İstediğimiz şekilde loglama yapabiliriz.İsterseniz veritabanına anlık durumları ve hataları loglayabilirsiniz.Bir çok yolu olduğu halde bu yazımda EventLog sınıfıyla loglamayı göstereceğim.

Bu sınıf sayesinde Windows işletim sisteminin içindeki programdan faydalanmış olacağız.
Denetim Masası – Yönetimsel Araçlar – Olay Görüntüleyicisi ile, Windows işletim sisteminin uygulama bazlı loglarına erişilebilir.Biz de uygulamamızda oluşacak hataları veya bilgi loglarını burada saklayacağız.
Bu sınıfı kullanabilmek için aşağıdaki kütüphaneyi projenize eklemeniz gerekiyor.

using System.Diagnostics;

İlk olarak logun kaynağı oluşturulmalıdır.(Olay Görüntüleyicinsindeki kategori içindeki Uygulama ve Hizmet Günlükleri sekmesinde görünecek isim)

if (!EventLog.SourceExists("Gençay"))
            {
                EventLog.CreateEventSource("Gençay","Gençay");
            }

Yukardaki kod bloğunu tanımlayalım.
EventLog.SourceExists(“Gençay”) : “Gençay” isminde kaynak varsa True, yoksa False gönderir.
EventLog.CreateEventSource(“Gençay”,”Gençay”) : “Gençay” isminde ki kaynağı, “Gençay” kategorisinde oluştur.
Sonuç olarak benim bilgisayarımda “Gençay” diye bir kayıt olmadığından !EventLog.SourceExists(“Gençay”) true dönecektir ve if scope’u çalışıp “Gençay” adında bir kaynak oluşturulacaktır.

if (!EventLog.SourceExists("Gençay"))
            {
                EventLog.CreateEventSource("Gençay","Gençay");
            }

Şimdi ise oluşturduğum kaynağa loglama yapma zamanı..

            EventLog log = new EventLog();
//EventLog nesnesi oluşturuyoruz.
            log.Source = "Gençay";
//Loglama yapacağımız kaynağı gösteriyoruz.Yukarda oluşturduğum kaynağı yazdım ben.
            log.WriteEntry("Hata Var", EventLogEntryType.Error);
Ve WriteEntry metoduyla Hata mesajı tipinden logumuzu kayıt ediyoruz.

Yukarda ki kodları her çalıştırdığınız da hata mesajı yazılacaktır.

Şu ana kadar EventLog sınıfın da loglama nasıl yapıldığını öğrendik.Ancak bu şekilde loglama olmaz.Ben bazı durumları bilgi tipinde,hataları da hata tipinde loglama yapmak istiyorum.Yani program hata verdiğinde loglaması gerekiyor.Buna benzer bir uygulama 2. sayfada görebilirsiniz.

Burada loglamayla ilgili ufak bir uygulama yapacağız.
Öncelikle Logger.cs sayfasını oluşturalım.

--Logger.cs--
 class Logger
    {
        private void Logla(string LogMesaji,bool HataMi)
        {
            if (!EventLog.SourceExists("Gençay"))
            {
                EventLog.CreateEventSource("Gençay","Gençay");
            }
            EventLog loglama = new EventLog();
            loglama.Source = "Gençay";
            if (HataMi)//Eğer HataMi değişkeni True ise hata olarak loglayacak,False ise Bilgi olarak.
            {
                loglama.WriteEntry(LogMesaji, EventLogEntryType.Error);
            }
            else
            {
                loglama.WriteEntry(LogMesaji, EventLogEntryType.Information);
            }
        }
        /*Yukardaki metod private olarak tanımlanmıştır.Dışardan Logger classının nesnesinden
bu metoda ulaşılamaz.Bu metod log kayıt etme işlemini gerçekleştirmektedir.*/
        private void SqlHatalariKodla(string LogMesaji,SqlErrorCollection SqlHatalari)
        {
            StringBuilder sb = new StringBuilder();
            foreach (SqlError hata in SqlHatalari)
            {
                sb.AppendLine("Hata Tarihi :");
                sb.Append(DateTime.Now);
                sb.Append(Environment.NewLine);
                sb.AppendLine("Satır Numarası :");
                sb.Append(hata.LineNumber);
                sb.Append(Environment.NewLine);
                sb.AppendLine("Mesaj :");
                sb.Append(hata.Message);
                sb.Append(Environment.NewLine);
                sb.AppendLine("No :");
                sb.Append(hata.Number);
                sb.Append(Environment.NewLine);
                sb.AppendLine("Prosedür :");
                sb.Append(hata.Procedure);
                sb.Append(Environment.NewLine);
                sb.AppendLine("Kaynak");
                sb.Append(hata.Source);
                sb.Append(Environment.NewLine);
                sb.AppendLine("Sever");
                sb.Append(hata.Server);
                sb.Append(Environment.NewLine);
                sb.Append(Environment.NewLine);
                sb.Append(Environment.NewLine);
                sb.Append("----------------------------------");
                sb.Append(LogMesaji);
            }
            Logla(sb.ToString(), true);
        }
        /*Bu metod ise sadece SqlException hatalarını yakalar.SqlException dan gelen
hatalar SqlError tipindedir ve bu hatalar SqlErrorCollection koleksiyonuda tutulur.
SqlError tipini kullanarak biz bir sql hatasının tüm detay bilgilerine erişebiliriz.
Bu detay bilgileriyle hatanın oluşma zamanı, tipi, mesajı, satır nosu gibi bilgilere
erişebiliriz.StringBuilder sınıfını kullanarak bu bilgileri belirli bir düzende toplayarak
,en son Logla metodunu çağırıp kayıt ediyoruz.Ancak dikkat ederseniz bu metodumuzda private.
Yani bunada dışardan erişim sağlayamıyoruz.Peki bu metodları nasıl devreye sokacağız?*/

        /*Bir tane public metod oluşturacağım.Bu metod Exception tipinden parametre alacak.
Biliyoruz ki hataların en geneli Exception tiptir.Diğer hatalar bunun içindedir.Eğer bir hata
 geldiğinde SqlException tipine çevirebiliyorsak eğer SqlHatalariKodla() metodu çalıştırılacak.
Eğer çevrilmiyorsa demek ki başka bir hata var(SqlException tipinden olmayan ama Exception tipinin kapsadığı)
 o zamanda o hatayı alıp direkt olarak Logla() metodunu çalıştıracağız.*/
        public void Loglayalım(Exception hata)
        {
            SqlException hatam = hata as SqlException;
            /* as operatörü sayesinde Exception tipindeki hata referansı SqlExeption
 tipine dönebiliyorsa o tipe çevirecektir.Eğer dönmüyorsa null değerini verecektir.*/
            if (hatam==null)
            {
                Logla(hatam.Message, true);
            }
            else
            {
                SqlHatalariKodla(hata.Message, hatam.Errors);
            }
        }
        //Gördüğünüz gibi yukardaki metod anlattığımız işlemi gerçekleştirmektedir.
    }

Yukardaki Logger.cs classını çalıştıracağımız hatalı kodlarımız da Form1.cs sayfasında mevcut olacaktır.

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                SqlConnection baglanti = new SqlConnection("Server=GENCAY-GENCAY;database=northwind;trusted_connection=true;");
                SqlCommand cmd = new SqlCommand("Select * ffrom Personeller", baglanti);
                SqlDataAdapter dap = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                dap.Fill(dt);
                dataGridView1.DataSource = dt;
            }
            catch (Exception hata)
            {
                Logger calistir = new Logger();
                calistir.Loglayalım(hata);

            }
        }

Dikkat ederseniz sorguda from yerine ffrom yazdım.Bu kodları çalıştırırsanız loglama işlemi başarıyla gerçekleştiğini göreceksiniz.

Exit mobile version