log4net ile Loglamaya Hızlı Bir Giriş

Uygulamalarımızda loglama ihtiyacını sürekli duymaktayız. Uygulamanın çalışması sırasında ortaya çıkan hataları veya bir olayın olduğu zamanla ilgili verileri loglayıp daha sonra incelemek isteyebiliriz. Bu şekilde geliştirme yaparken gözden kaçırdığımız veya çalışma zamanına özgü olarak ortaya çıkan problemleri görüp çözüm üretebiliriz. Dotnet projelerinde log4net aracını loglama ihtiyacımız için kullanabiliriz.

Loglamanın bazı dezavantajları da olabilir. Uygulamayı yavaşlatabilir veya gerekli gereksiz pek çok şeyin logunu tutarak sistemi şişirebilir. Bu tür faktörler gözönüne alınarak, kütüphane hızlı, güvenilir ve genişletilebilir şekilde tasarlandı.

log4net

log4net, java dünyasında kullanılan log4j kütüphanesinin dotnet’e uyarlanmasıyla ortaya çıkarılmıştır. Açık kaynak kodlu bir kütüphanedir. Desteklediği platformları sıralamak gerekirse:

  • .NET Standard 1.3 via .NET Core 1.0
  • Microsoft® .NET Framework 1.0
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 3.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 3.5 Client Profile
  • Microsoft .NET Framework 4.0 Client Profile
  • Microsoft .NET Compact Framework 1.0
  • Microsoft .NET Compact Framework 2.0
  • Mono 1.0
  • Mono 2.0
  • Mono 3.5
  • Mono 4.0
  • Microsoft Shared Source CLI 1.0
  • CLI 1.0 Compatible

Kütüphanede hiyerarşik olarak dağılmış farklı loglama seviyeleri bulunmaktadır.

  • ALL
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF

Yukardan aşağıya seviyeler diğerlerini içermektedir. Örneğin ALL seviyesini seçerseniz debug, info, warn, error ve fatal  seviyelerindeki logları toplar. Benzer şekilde seviyeyi warn olarak seçersek, warn, error ve fatal seviyesindeki logları toplar.

Bir dotnet konsol uygulaması oluşturup üzerinde loglamanın çalışmasını görelim.

nuget ile kütüphaneyi kuralım:

Install-Package log4net

Öncelikle AssemblyInfo.cs dosyasına [assembly: log4net.Config.XmlConfigurator(Watch = true)] ifadesini ekleyelim.

App.config dosyasında değişiklikler yapalım. configSections içerisine log4net bölümünü ekleyelim.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

log4net kütüphanesinde dinamik bir appender mantığı var. Farklı hedeflere loglama yapmak için kütüphane ile birlikte hazır gelen pek çok appender var.

Appender’lerdan bazılarına değinmek gerekirse:

  • log4net.Appender.FileAppender: dosyaya loglamak içi
  • log4net.Appender.SmtpAppender: log’u email adresine gönderir
  • log4net.Appender.RollingFileAppender: log’u tarihlere farklı dosyalara yazmaya yarar

Bunların dışında da pek çok appender var. Log yönetim aracı olan graylog servisinin da örneğin bir appender’ı var.

Uygulamaya FileAppender ekleyelim

App.config dosyasına log4net bölümü ekliyoruz.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>  
  
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
      <file value="mylog.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="FileAppender"/>
    </root>
  </log4net>
  
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

Program.cs dosyasını değiştirelim:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            log4net.Config.BasicConfigurator.Configure();
            var log = log4net.LogManager.GetLogger(typeof(Program));

            log.Debug("debug mesaj");
            log.Warn("uyarı (warn) mesaj");

            Console.ReadKey();
        }
    }
}

Programı çalıştırınca, exe’nin olduğu yerde mylog.txt dosyasının oluşmuş olduğunu görürüz.

Kısa kısa notlar

Not 1

Kütüphane ile ilgili sorun yaşadığımız zaman, app.config dosyasına aşağıdaki ifadeyi yazabiliriz. Böylece daha detaylı debug mesajlarını görürüz.

<appSettings>
  <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

Not 2

App.config dosyasındaki bazı değerlerin parametrik olmasını istiyorsak, %property{xxx} ifadesini kullanabiliriz. Örneğin log dosyasını parametrik olarak belirlemek istiyorsak, file parametresini aşağıdaki gibi tanımlayabiliriz.

<file type="log4net.Util.PatternString" value="c:\\%property{LogFile}"/>

program.cs içerisinden de LogFile değerini belirtebiliriz.

log4net.GlobalContext.Properties["LogFile"] = "yenidosyam";
log4net.Config.BasicConfigurator.Configure();

 

 

 

 

 

 

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top