- Published on
Asp.Net MVC projesinde Log4Net ile nasıl loglama yapılır?
- Authors
- Name
- Oğuzhan Kırçalı
Log4Net, geliştirmekte olduğun yazılımına entegre edebileceğin, adımları, hataları loglama imkanı sağlayan üçüncü parti bir eklentidir. Bu sayede uygulama çalışırken yakalayamadığın hataları senin yerine yakalayabilir, bunları veritabanına veya bir dosyaya kaydedebilir. Üstelik bunları arkaplanda belirli aralıklarla (isteğe bağlı ayarlanan sıklıkla) kaydeder. Uygulama log4net’den dolayı herhangi bir hata görüntülemez. İstersen belirli aşamaları bilgi amaçlı kaydedebilirsin. Hesaplama algoritması başladı.
, Bütün şubeler işlendi
gibi hareket logları da kaydetmesini sağlayabilirsin. Log4Net’in ASP.NET MVC projesine entegrasyonun anlatacağım. İlk olarak tabii ki Nuget’ten Log4Net’i Nuget'ten projeme ekliyorum.
Projeme Log4Net.config
isimli bir ayar dosyası ekliyorum. Bu dosyada veritabanı erişimi ve insert sorgumu belirtiyorum. Bu config dosyasının içi şu şekilde olabilir.
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<log4net>
<appender name=”DbAppender” type=”log4net.Appender.ADONetAppender”>
<bufferSize value=”0″ />
<connectionType value=”System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″ />
<connectionString value=”data source=IPAdres;Initial Catalog=VeritabaniAdi;user id=KullaniciAdi;password =Sifre;” />
<commandText value=”INSERT INTO Log4Net ([date],[thread],[level],[logger],[message],[exception], [CurrentUsername],[IPAddress], [CurrentUrl], [UserAgent]) VALUES
(@log_date, @thread , @log_level , @logger , @message , @exception , @CurrentUser , @IPAddress , @CurrentUrl , @UserAgent )” />
<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=”%t” />
</layout>
</parameter>
<parameter>
<parameterName value=”@log_level” />
<dbType value=”String” />
<size value=”10″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%p” />
</layout>
</parameter>
<parameter>
<parameterName value=”@logger” />
<dbType value=”String” />
<size value=”1000″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%c” />
</layout>
</parameter>
<parameter>
<parameterName value=”@message” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%m” />
</layout>
</parameter>
<parameter>
<parameterName value=”@exception” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”log4net.Layout.ExceptionLayout” />
</parameter>
<parameter>
<parameterName value=”@CurrentUser” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%property{CurrentUser}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@IPAddress” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%property{IPAddress}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@CurrentUrl” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%property{CurrentUrl}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@UserAgent” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%property{UserAgent}” />
</layout>
</parameter>
</appender>
<root>
<level value=”INFO” />
<appender-ref ref=”RollingFileAppender” />
<appender-ref ref=”DbAppender” />
</root>
</log4net>
</configuration>
Eklediğim bu dosyayı Log4Net’in config dosyası olduğunu uygulamama belirtmem lazım. Onun için Global.asax
dosyasındaki Application_Start
metoduna aşağıdaki satırları eklemem gerekiyor.
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath(“~/log4net.config")));
log4net.Config.XmlConfigurator.Configure();
```cs
Log4Net’i istediğim zaman çağırabilmem için de şuraya küçük bir manager atasam hiç fena olmaz.
```cs
ILog logManager = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Yukarıdaki logManager sınıfımı istediğim yerde manuel olarak log atamak için kullanabilirim. Örnek olarak;
log.Debug("Veritabanı context nesnesi oluşturuldu.");
log.Info("Önbelleğe şubeler yüklendi.");
log.Error("Şubeler getirilirken bir hata ile karşılaşıldı.");
Otomatik Hata Yakalama
Manuel loglama dışında otomatik olarak hataları yakalamak için de aşağıdaki kodu Global.asax
dosyasındaki Application_Error
metoduna ekleyebilirim.
var ex = Server.GetLastError();
log.Error("Uygulama_Hata", ex.GetBaseException());
Yukarıda tanımlamış olduğum hata loglama işlemi arkaplanda çalışacaktır. Log4Net tablosunda bir değişiklik yaptığınızda kaydedemese bile uygulamanıza herhangi bir hata yansımayacaktır.
Ek bilgiler kaydetmek istiyorum?
Log4Net.config dosyasındaki tabloya dikkat ettiğimde birçok parametre görüyorum. Bunlardan bazılarını Log4Net şablonuna göre oluşturdum, bazılarını da kendi isteğime göre. Hata alındığında kimin oturum açtı benim için önemliydi bu yüzden Log4Net.config dosyasına
<parameter>
<parameterName value="@CurrentUser" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{CurrentUser}" />
</layout>
</parameter>
satırlarını ekledim. Tabii ki yukarıdaki Insert sorgumu da ona göre güncelliyorum. Log4Net’e diyorum ki “Arkadaş, CurrentUser diye bir değer var. Kaydederken onu da al." Bu değerin atamasını nasıl yapıyorum peki. Application_Error
metoduna eklediğim otomatik hata yakalamanın öncesinde istediğim parametreyi Log4Net’in global context’ine atıyorum.
log4net.GlobalContext.Properties["CurrentUser"] = OIAuth.LogonManager.User.KullaniciAdi;
log4net.GlobalContext.Properties["CurrentUrl"] = Request.Url.OriginalString;
log4net.GlobalContext.Properties["IPAddress"] = HttpContext.Current.Request.UserHostAddress.ToString();
log4net.GlobalContext.Properties["UserAgent"] = HttpContext.Current.Request.UserAgent;
Veritabanında tablonuzu oluşturduysanız, buna uygun bir config dosyanız varsa, uygulama başlarken bu config dosyasını belirttiyseniz, hata durumunda metodu çağırdıysanız Log4Net sizin için çalışacaktır.
Eğer hata olduğunda “Hemen veritabanına yazıp performansı düşürmesin, doldukça ara ara kaydetsin" diyorsanız bu da mümkün. config dosyasındaki buffersize değişkenini artırdıkça yazma sıklığı azalacaktır.
Log4Net dışında da logging yöntemleri var. Esnekliği, sorun çıkarmayışı ve araştırmalarım sonucu diğerlerinde geçmek için sebep bulamayışımdan dolayı Log4Net’e devam…
Sağlıklı Günler…