Merhaba arkadaşlar,uygulama geliştirirken hata yönetimi konusunun önemi bir hayli fazla. Kullanıcının karşılaştığı hataların saklanması bize bu hataların çözümünde büyük bir kolaylık sağlayacaktır. Ben projelerimde kullandığım bir framework olan NLog’tan bahsetmek istiyorum.Bu arada free olması da bir hayli cezbedici. Ayrıca kullanışlı ve kurulumu da bir o kadar kolay. NLog ile bir hata oluştuğu durumda yapabileceklerinizden bahsetmek gerekirse; mail atabilirsiniz,dosyaya yazabilirsiniz, veritabanına ekleyebilirsiniz , console’a çıktı alabilirsiniz ve daha bir çok sağlayıcı ile kullanabilirsiniz. Ben bu makalemde dosyaya saklama işleminden bahsetmek istiyorum. Örnek uygulama için bir konsol projesi oluşturup bu projede genel hata yönetimi entegrasyonunu yapacağız. Şimdi bir örnek ile başlayalım…

Boş bir proje oluşturalım.

Nuget paket yöneticisine

Install-Package NLog

yazarak eklentiyi yükleyelim.

Daha sonra proje klasorüne nlog için gerekli olan NLog.config dosyasını ekleyelim ve içine aşağıdaki kodları yapıştıralım.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true" >

  <variable name="logDirectory"  value="${basedir}/logs/${shortdate}" />
  <targets async="true"> 
    
      <target name="FileManager"
              xsi:type="File"
              layout="${longdate} ${threadid:padding=4} ${level:uppercase=true:padding=5} ${logger} ${message} ${exception:format=tostring}"
              fileName="${logDirectory}/log.txt"
              archiveFileName="${logDirectory}/log.{#}.txt"
              archiveEvery="Day"
              archiveNumbering="Rolling"
              maxArchiveFiles="7"
              concurrentWrites="true"
              createDirs="true"
              autoFlush="true" />
     <target name="FileManager2"
              xsi:type="File"
              layout="${longdate} ${threadid:padding=4} ${level:uppercase=true:padding=5} ${logger} ${message} ${exception:format=tostring}"
              fileName="${logDirectory}/log2.txt"
              archiveFileName="${logDirectory}/log.{#}.txt"
              archiveEvery="Day"
              archiveNumbering="Rolling"
              maxArchiveFiles="7"
              concurrentWrites="true"
              createDirs="true"
              autoFlush="true" />

     
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" maxlevel="Warn" writeTo="FileManager" />
  <logger name="*" minlevel="Error" writeTo="FileManager2" />
  </rules>
</nlog>

Burada config dosyasında değinmek istediğim bazı noktalar var. Rules bölümünde kurallar oluşturabiliyoruz. Bu kurallar içerisinde “minlevel” loglama işleminin hangi seviyeden sonra gerçekleşeceğini tanımlıyor.Aynı şekilde “maxlevel” özelliğinide tanımlayabiliriz. Bu seviyeler aşağıdaki gibi :

SeviyeAçıklama
FatalÜst Seviye : Sistem çökmeleri
ErrorUygulama hataları ( Exceptions )
WarnUyarılar, yinede uygulama çalışmaya devam edebilir.
InfoBilgilendirme herhangi bir amaçlı olabilir. Kullanıcı bilgileri güncellendi vs.
DebugÇalıştırılan sorgular, oturum süresinin bitmesi vs.
TraceBir eylem başladı diğeri bitti gibi. Örn : Fonksiyon başlangıcı ve bitişi durumları( En Alt Seviye )

 

İkinci bir önemli özellik ise “writeTo”. Bununla loglama kuralı için hangi target sistemini kullanacağını belirtiyoruz. Biz target olarak dosyalamaya uygun ayarları kullanacağız.Bu ayarları yaptıktan sonra config dosyasındaki tanımlamada throwExceptions=”true” olması olası config hatalarını görmemizde bize yardımcı olacaktır. Program bitişinde bunun false yapılmasında fayda var.Çünkü uygulama çalışırken hata yada bilgilendirme için kullandığımız eklentinin de hata vermesini istemeyiz. Şimdi örnek bir program ile çıktıları kontrol edelim.

static void Main(string[] args)
        {
            var logger = NLog.LogManager.GetCurrentClassLogger();
            // Trace - Warn levelları arasında FileManager2'yi kullanacak.
            logger.Log(LogLevel.Info, "Sample Info error message");
            logger.Log(LogLevel.Debug, "Sample Debug");
            logger.Log(LogLevel.Warn, "Sample Warn");
            logger.Log(LogLevel.Trace, "Sample Trace");
            //Error ve yukarısı için FileManager'ı kullanacak.
            logger.Log(LogLevel.Error, new Exception("Hata1"));
            logger.Log(LogLevel.Error, new Exception("Hata2"));
            
        }

Programı çalıştırdıktan sonra. Dosyaları kontrol ettiğimizde çıktı aşağıdaki gibi olacaktır.

logresult

 

Gördüğünüz gibi farklı seviye hatalar için farlı dosyalar tuttuk. Burada biz target olarak dosya seçtik eğer mail seçmiş olsaydık aynı çıktıları mail olarak alabilirdik. Detaylı target configrasyonlarını framework sitesinde bulabilirsiniz. Başka bir makalede görüşmek üzere. Hoşçakalın.