Log4Net bizim yerimize kayitlarimizi loglayan bir dll dir. Ilk zamanlar log4j adi altinda java için çikmistir. Daha sonra .net in populer olmasi ile bu dll in .net versiyonuda yazilmistir. Önceden loglama islemlerini biz kendimiz yapardik. Kendi classlarimizi yazardik, daha sonrada bu loglarimizi textfile a, xml e, ya da veri tabanina yazariz. Tabi bu islemleri yaparken her bir islem için yeni classlar yazmamiz gerekecekti.
Biz bu isleri log4net dll ine yaptiriyoruz. Biraz Log4net yapisinda bahsedelim, ILog diye bir log interfacemiz var yapisi
Kod:
public interface ILog : ILoggerWrapper
{
bool IsDebugEnabled { get; }
bool IsErrorEnabled { get; }
bool IsFatalEnabled { get; }
bool IsInfoEnabled { get; }
bool IsWarnEnabled { get; }
void Debug(object message);
void Debug(object message, Exception exception);
void DebugFormat(string format, object arg0);
void DebugFormat(string format, params object[] args);
void DebugFormat(IFormatProvider provider, string format, params object[] args);
void DebugFormat(string format, object arg0, object arg1);
void DebugFormat(string format, object arg0, object arg1, object arg2);
void Error(object message);
void Error(object message, Exception exception);
void ErrorFormat(string format, object arg0);
void ErrorFormat(string format, params object[] args);
void ErrorFormat(IFormatProvider provider, string format, params object[] args);
void ErrorFormat(string format, object arg0, object arg1);
void ErrorFormat(string format, object arg0, object arg1, object arg2);
void Fatal(object message);
void Fatal(object message, Exception exception);
void FatalFormat(string format, object arg0);
void FatalFormat(string format, params object[] args);
void FatalFormat(IFormatProvider provider, string format, params object[] args);
void FatalFormat(string format, object arg0, object arg1);
void FatalFormat(string format, object arg0, object arg1, object arg2);
void Info(object message);
void Info(object message, Exception exception);
void InfoFormat(string format, object arg0);
void InfoFormat(string format, params object[] args);
void InfoFormat(IFormatProvider provider, string format, params object[] args);
void InfoFormat(string format, object arg0, object arg1);
void InfoFormat(string format, object arg0, object arg1, object arg2);
void Warn(object message);
void Warn(object message, Exception exception);
void WarnFormat(string format, object arg0);
void WarnFormat(string format, params object[] args);
void WarnFormat(IFormatProvider provider, string format, params object[] args);
void WarnFormat(string format, object arg0, object arg1);
void WarnFormat(string format, object arg0, object arg1, object arg2);
}
Interfacemiz yukaridaki formatlarda hatalari yakalayabilmekte uyarilari belirtmekte ve kullanicilarin her yaptigi islemi kaydedebilmektedir.
Biraz bunlari açiklamak gerekirse
bool IsDebugEnabled { get; } -- Burada debug mod açik ise islem yapar. True dönerse kaydi yakalar.
bool IsErrorEnabled { get; } -- Burada error modu açik ise islem yapar. True dönerse kaydi yakalar
bool IsFatalEnabled { get; } -- Burada Fatal error modu açiktir. True dönerse kaydi yakalar.
bool IsInfoEnabled { get; } -- Burada Info modu açiktir. True dönerse kaydi yakalar böylece kullanicinin yaptigi her isi kaydeder.
bool IsWarnEnabled { get; } ?- Burada Warn modu açiktir. True dönerse uyariyi yakalar.
Bu Property enable oldugu zaman bu kayitlari yakalama metodlari vardir. Metodlar overload edilmis bir sekilde yukaridadir.
Hatalari yakaladigimiz levellerimiz vardir. Bu leveller asagidaki gibidir.
ALL, DEBUG, INFO, WARM, ERROR, FATAL, OFF
Levellerimiz öncelik siralamalari vardir, bunlar
DEBUG < INFO < WARN < ERROR < FATAL
Log4nette çikis hedeflerine Appender denir. Log4net birden çok yere ayni anda log alabilir. Ve bunlari IAppernder Interface inden türeltilen Appender namespace i altindaki farkli yetenek ve isimlerdeki Appender Classlari ile yapariz.
log4net.Appender.AdoNetAppender: :Log kayitrlari databasede tutulur.
log4net.Appender.AnsiColorTerminalAppender : Log Kayitlari renklendirilmis bir halde ansi terminal ekraninda görüntülenir.
log4net.Appender.AspNetTraceAppender: Log kayitlari asp.net in trace penceresinde görüntülenir.
log4net.Appender.ColoredConsoleAppender: Console ekrani renklendirilmis halde loglari bize gösterir.
log4net.Appender.ConsoleAppender: Console ekraninda log kayitlarini görürüz
log4net.Appender.DebugAppender: Log kayitlarini .net eventlerine gönderir.
log4net.Appender.EventLogAppender: Loglari windows event loguna yazar
log4net.Appender.FileAppender: Log kayitlarini file a yazar
log4net.Appender.LocalSyslogAppender:Log kayitlarini syslog a yazar ( sadece UNIX).
log4net.Appender.MemoryAppender: Log kayitlarini memedow buffer a yazar
log4net.Appender.NetSendAppender: Windows Messenger Service deki loglarin kayitlarini tutar, Bu mesajlar sadece user terminalde görünür.
log4net.Appender.RollingFileAppender: Log kayitlarini birden fazla dosyaya yazdirabilirsiniz ve ayni zamanda dosya ayarlarinida yapabiliriz.
log4net.Appender.SmtpAppender: Log kayitlarini email olarak gönderir.
log4net.Appender.TelnetAppender: Kullanici Log kayitlarini TELNET den alir.
Simdi 1 tane log4net uygulamasi yapalim,
Log4net uygulamasi için öncellikle
http://logging.apache.org/log4net/ adresine giderek log4net.dll i indiriniz.
Sonra bir adet web uygulamasi açalim, sonra indirdigimiz log4net.dll yi projeye referans olarak ekeliyelim.
Web uygulamamizin içine bir adet global.asax dosyasi ekleyelim ve bu dosyayi açalim, Application Start?in içine
log4net.Config.DOMConfigurator.Configure(); Bu satiri ekleyin
Görünüm asagidaki gibidir.
Kod:
protected void Application_Start(object sender, EventArgs e)
{
log4net.Config.DOMConfigurator.Configure();
}
Sonra projemizin App.Config dosyasini açalim. Dosyamizi asagidaki sekildeki gibi yapilandiralim
Kod:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="Loglar.txt"/>
<param name="AppendToFile" value="true"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!-- Dosyanin kapanmasi -->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-2p %c [%x] - %m%n"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="FileAppender"/>
</root>
</log4net>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>
<param name="File" value="Loglar.txt"/>
Bu tag ile dosya açilis formati belirlenir. AppendtoFile eger dosya yoksa olustur demektir. Eger var ise mevcut dosyadan kayit eklemeye devam et demektir.
<param name="AppendToFile" value="true"/>
Asagidaki kod sayesinde dosya ile isimiz bittiginde dosyayi açmamiza yaramaktadir.
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
Bu kodda yazilicak olan logun formati tutulmaktadir. Bu konu baska bir makalede genisçe anlatilacaktir.
<param name="ConversionPattern" value="%d [%t] %-2p %c [%x] - %m%n"/>
Asagidaki kodda kaydedilecek loglarin modu tutulmustur. Modlar yukarida belirtilmistir.
<level value="ALL"/>
Söyle bir ekran tasarladik
Kod Kismi;
Kod:
using log4net;
namespace LogForNetTestWebProject
{
public partial class WebForm1 : System.Web.UI.Page
{
log4net.ILog logger = log4net.LogManager.GetLogger(typeof(WebForm1));
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
createSession();
logger.Info("Sisteme ilk kez giris yapildi from" + Session["User"].ToString());
lblUserName.Text = Session["User"].ToString();
}
else
{
}
}
protected void btnSeeIp_Click(object sender, EventArgs e)
{
logger.Info("Sisteme " + Request.Browser.Browser + " ile giris yapildi" );
}
void createSession()
{
Session["User"] = "Memedow";
}
protected void btnConnectDb_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection();
con.Open();
}
catch(Exception ex)
{
lblIp.Text = "Database'e baglanamadik";
logger.Error("DataBase e " +Session["User"].ToString()+ " tarafindan baglanilmaya calisilmistir ama " +ex.Message.ToString()+ " hatasi yakalanmistir" );
}
}
}
}
Burada Ilog interface inden logger türetiyoruz GetLogger ile kontrol edecegimiz Webformu seçiyoruz.
log4net.ILog logger = log4net.LogManager.GetLogger(typeof(WebForm1));
Bu kodda sisteme giris yapildigi için bir adet info belirttik.
Kod:
logger.Info("Sisteme ilk kez giris yapildi from" + Session["User"].ToString());
Asagidaki kodda bir adet exception yakaldik
Kod:
try
{
SqlConnection con = new SqlConnection();
con.Open();
}
catch(Exception ex)
{
lblIp.Text = "Database'e baglanamadik";
logger.Error("DataBase e " +Session["User"].ToString()+ " tarafindan baglanilmaya calisilmistir ama " +ex.Message.ToString()+ " hatasi yakalanmistir" );
}
Uygulamayi derledigimiz zaman Loglar.txt dosyasina bir bakalim
2011-12-15 09:41:21,024 [5] INFO LogForNetTestWebProject.WebForm1 [(null)] - Sisteme ilk kez giris yapildi from Memedow,
2011-12-15 09:41:23,466 [18] ERROR LogForNetTestWebProject.WebForm1 [(null)] - DataBase e Memedow tarafindan baglanilmaya calisilmistir ama The ConnectionString property has not been initialized. hatasi yakalanmistir