Log4Net Kullanımı

1 Ağustos 2013
Posted by Çağatay Yıldız
7170 Views

Bu yazımızda hata ve kimi işlemleri loglama aracı olarak .net tabanlı geliştirilen log4net teknolojisini kullanarak bir örnek vereceğiz. Log4net konusunda teorik bilgi ve bir console uygulaması için Burak Selim Şenyurt’un yazısına bakabilirsiniz. (http://www.buraksenyurt.com/post/Log4Nete28099-i-Tanc4b1yalc4b1m.aspx)
Öncelikle yapmamız gereken projemize log4net i referans olarak eklemek. Bunun için projemizin manage nuget packages bölümünüden online seçeneğini seçerek search bölümüne log4net yazıp dll imizi yüklüyoruz.
log4netdll

Log4net dll imizi başarıyla yüklekten sonra. Loglarımız database e kaydedeceğimiz için Log adında bir tablo oluşturuyoruz. Tablomuzun kolonları resimde belirttiğimiz gibi

log4nettableŞimdi ise web.config satırımızı düzenlememiz gerekmekte. Burada connection belirtip log tablolarımızın parametrelerini tanımayalacağız. Bu konuda ayrıntılı dökümantasyonu Apache nin kendi sitesinde bulabilirsiniz. (http://logging.apache.org/log4net/release/manual/configuration.html).

Webconfig de ilk olarak log4net in section ekliyoruz.  Configuration tag içinde bulunan canfigsections tagi içerisine eklediğimiz section şu şekilde

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

<section></section>

Ekledikten sonra bağlantı ayarlarımızın, parametrelerimizin bulunduğu log4net tag ini <configuration> tagi içerisine ekliyoruz.

<log4net>
 <root>
 <level value="ALL" />
 <appender-ref ref="AdoNetAppender" />
 </root>
 <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
 <bufferSize value="1" />
 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
 <connectionString value="Data Source=Server;Initial Catalog=DatabaseAdı;Persist Security Info=True;User ID=kullanıcıadı;Password=şifre" />
 <commandText value="INSERT INTO Log ([Date], [Thread], [Level], [Logger], [Message], [Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
 <parameter>
 <parameterName value="@log_date" />
 <dbType value="DateTime" />
 <layout type="log4net.Layout.RawTimeStampLayout" />
 </parameter>
 <parameter>
 <parameterName value="@thread" />
 <dbType value="String" />
 <size value="255" />
 <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="%thread ip=%property{ip}" />
 </layout>
 </parameter>
 <parameter>
 <parameterName value="@log_level" />
 <dbType value="String" />
 <size value="50" />
 <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="%level" />
 </layout>
 </parameter>
 <parameter>
 <parameterName value="@logger" />
 <dbType value="String" />
 <size value="255" />
 <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="%logger" />
 </layout>
 </parameter>
 <parameter>
 <parameterName value="@message" />
 <dbType value="String" />
 <size value="4000" />
 <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="%message" />
 </layout>
 </parameter>
 <parameter>
 <parameterName value="@exception" />
 <dbType value="String" />
 <size value="2000" />
 <layout type="log4net.Layout.ExceptionLayout" />
 </parameter>
 </appender>
 </log4net>

Eklediğimiz satırların connection string bölümünde bulunan server adı db adı gibi isimleri yazıyoruz. Daha sonra log4net in ayağ kalkması için global.asax dosyasına Configure metodunu ekliyoruz. Yapmamız gereken global.asax dosyasımızın ApplicationStart metoduna aşağıdaki satırı eklemek


log4net.Config.XmlConfigurator.Configure();

Log4net kullanılmaya hazır. Gelelim herhangi bir insert uygulamasına. Örneğin kullanıcı her login olduğunda o logu tutmak istiyoruz. Böylelikle hangi kullanıcının ne zaman login olduğunu görebiliriz. LogServices isminde bir class oluşturuyoruz. Bu class da loglarımızı ekleyeceğimz metot ve protected static tipinde bir logger değişkeni bulunmakta. Class şu şekilde


protected static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 public static void AddLog(string user, string loggertype, string logprocess, string mesaj, string data , Exception ex)
 {
 LoggerKeep.LoggerAdd(logger, loggertype, logprocess,user,data,mesaj,ex);
 }

Dediğimiz gibi login işleminde log eklemek istediğimizde bu AddLog metodunu kullanıyoruz.
LoggerKeep classımızdak’ LoggerAdd metodu şu şekildedir

        public static void LoggerAdd(log4net.ILog logger, string LoggerType, string LogProcess, string User, string Data, string LogMessage, System.Exception Ex)
        {
            if (LoggerType == "InfoFormat")
            {
                object[] args = new object[4];

                if (Data != null)
                {
                    args[0] = LogProcess;
                    args[1] = User;
                    args[2] = Data;
                    args[3] = LogMessage;
                    logger.InfoFormat("[{0}] [{1}] [{2}] [{3}]", args);
                }
                else
                {
                    args[0] = LogProcess;
                    args[1] = User;
                    args[2] = LogMessage;
                    logger.InfoFormat("[{0}] [{1}] [{2}] ", args);
                }
            }
            else if (LoggerType == "Fatal")
            {
                if (Data != null)
                {
                    object[] args = new object[4];
                    args[0] = LogProcess;
                    args[1] = User;
                    args[2] = Data;
                    args[3] = LogMessage;
                    string ermes = string.Format("[{0}] [{1}] [{2}] [{3}]", args);
                    logger.Fatal(ermes, Ex);
                }
                else
                {
                    object[] args = new object[4];
                    args[0] = LogProcess;
                    args[1] = User;
                    args[2] = LogMessage;
                    string ermes = string.Format("[{0}] [{1}] [{2}] ", args);
                    logger.Fatal(ermes, Ex);
                }
            }
        }

Burada hangi kullanıcı olduğunu log tipimizi(hata mı genel mi?) mesajımızı data ve hatamızı tanımlıyoruz. Örnek şu şekilde

LogServices.AddLog("Çağatay YILDIZ", InfoFormat, "KullanıcıIslem", "Kullanıcı sisteme giriş yaptı", null, null);

Bu metot içerisindeki kimi yerleri enum tanımlamak sizi her seferindeki bu kod yükünden kurtaracaktır. Dilersek aynı şekilde hatalarımızı da loglayabiliriz.