{"id":8572,"date":"2010-12-28T21:58:28","date_gmt":"2010-12-28T19:58:28","guid":{"rendered":"https:\/\/fatihboy.com\/post\/log4net-ile-hata-ayiklama"},"modified":"2010-12-28T21:58:28","modified_gmt":"2010-12-28T19:58:28","slug":"log4net-ile-hata-ayiklama","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/log4net-ile-hata-ayiklama\/","title":{"rendered":"Log4Net ile Hata Ay\u0131klama"},"content":{"rendered":"<p>&nbsp;&nbsp; Yaz\u0131l\u0131m geli\u015ftiricilerin en b\u00fcy\u00fck derdidir sahaya g\u00f6nderilen uygulamada olu\u015fan hatalar\u0131 \u00e7\u00f6zmek, \u00f6zellikle de son kullan\u0131c\u0131dan ald\u0131\u011f\u0131 &#8220;<em>hata oldu<\/em>&#8220;, &#8220;<em>uygulama dondu<\/em>&#8220;, &#8220;<em>program kendini kapatt\u0131<\/em>&#8221; gibi ucu a\u00e7\u0131k geri bildirimleri d\u00fc\u015f\u00fcnecek olursak. Kimi zaman uygulamada olu\u015fan \u00f6yle hatalar olabilir ki bunlar\u0131 yaz\u0131l\u0131m geli\u015ftirici kendi bilgisayar\u0131nda dahi debug ederken \u00e7\u00f6zmekte\/g\u00f6rmekte zorlanabilir. Bir de hi\u00e7 bir aray\u00fcz\u00fc olmayan windows hizmeti uygulamalar\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcn, m\u00fcdahale edebilece\u011finiz noktay\u0131 bulmak bile zaman zaman ba\u015fl\u0131 ba\u015f\u0131na bir sorun olabilir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; B\u00f6ylesi durumlarda yaz\u0131l\u0131m geli\u015ftiricinin en b\u00fcy\u00fck dostu hi\u00e7 s\u00fcphesiz ki bir dosyaya ya da event loglara at\u0131lan mesajlard\u0131r. Kodun i\u00e7inde hata olabilecek noktalara yerle\u015ftirilen a\u015fa\u011f\u0131dakine benzer k\u00fc\u00e7\u00fck kod par\u00e7ac\u0131klar\u0131 ile bir dosyada ya da event log&#8217;unda&nbsp; tutulan uygulama g\u00fcnl\u00fckleri, olu\u015fan exception&#8217;larda detay bilgiye ula\u015fabilmenizi sa\u011flayacakt\u0131r.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ Hata al\u0131nabilecek olan uygulama\n\/\/ i\u015f mant\u0131\u011f\u0131 kodu bu alana\n}\ncatch (Exception ex) {\n    using (var gunlukDosyas\u0131 = System.IO.File.AppendText(\"UygulamaGunlugu.txt\")) {\n        gunlukDosyas\u0131.WriteLine(\"Uygulama hatas\u0131 olu\u015ftu : \" + ex);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131da payla\u015ft\u0131\u011f\u0131m y\u00f6ntemle, uygulama g\u00fcnl\u00fcklerini tutarak hatay\u0131 yakalamada ba\u015flad\u0131\u011f\u0131m\u0131z noktadan \u00e7ok daha iyi bir noktaya gelmi\u015f oluruz; fakat bu durumda tahmin edilebilecek hatalar\u0131n sadece bir k\u0131sm\u0131nda i\u015fe yarayacakt\u0131r. Bunun bir ka\u00e7 nedeni var;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> Hatan\u0131n kayna\u011f\u0131 her zaman i\u00e7im exception nesnesi i\u00e7inde bulunmayabilir <\/li><li> Hata mesaj\u0131 \u00e7ok genel ge\u00e7er olabilir <\/li><li> Exception ba\u015fka bir noktada yakalan\u0131p \u00fczerinden i\u015flem yap\u0131ld\u0131ktan sonra yeniden f\u0131rlat\u0131l\u0131r, bu da stack trace&#8217;in kaybolmas\u0131na ve as\u0131l hataya ula\u015f\u0131lamamas\u0131na neden olabilir <\/li><li> Uygulaman\u0131z thread&#8217;ler ile \u00e7al\u0131\u015f\u0131yorsa g\u00fcnl\u00fck dosyas\u0131na ayn\u0131 anda yaz\u0131lmaya \u00e7al\u0131\u015f\u0131labilir <\/li><li> Hatan\u0131n temelinde exception nesnesinde olmayan bir bilgi yatabilir; \u00f6rne\u011fin uygulaman\u0131n ba\u015f\u0131nda kullan\u0131c\u0131n\u0131n say\u0131 girmesi gereken bir alana karakter girmesi. <\/li><\/ul>\n\n\n\n<p>&nbsp;&nbsp; S\u0131ralad\u0131\u011f\u0131m bu ve benzer nedenler zaman zaman hatan\u0131n temeline gitmeyi engelleyebilir. Sahada aktif kullan\u0131lan bir \u00fcr\u00fcn\u00fcn\u00fcz var ise riski g\u00f6ze alamayaca\u011f\u0131n\u0131z i\u00e7in daha detayl\u0131 g\u00fcnl\u00fck tutmaya ba\u015flamak bir alternatif olacakt\u0131r. &#8220;<em>Kullan\u0131c\u0131dan veri al\u0131n\u0131yor<\/em>&#8220;, &#8220;<em>Kullan\u0131c\u0131 abc de\u011ferini girmi\u015ftir<\/em>&#8220;, &#8220;<em>hesaplama i\u015fi ba\u015flat\u0131l\u0131yor<\/em>&#8220;, &#8220;<em>veri g\u00f6nderiliyor<\/em>&#8221; v.s. v.s. D\u00f6n\u00fcp uygulaman\u0131za ve uygulama g\u00fcnl\u00fcklerine bakt\u0131\u011f\u0131n\u0131zda bu defa da \u00e7ok fazla girdi ile doldu\u011funu g\u00f6rmeye ba\u015flars\u0131n\u0131z. Ald\u0131\u011f\u0131n\u0131z hata, uygulaman\u0131n bir mod\u00fcl\u00fcnden gelmesine kar\u015f\u0131n g\u00fcnl\u00fck dosyas\u0131nda uygulamaya ait t\u00fcm girdileri g\u00f6rmeye ba\u015flars\u0131n\u0131z. Bu defa kod i\u00e7erisinde de\u011fil; ama g\u00fcnl\u00fck dosyas\u0131n\u0131n i\u00e7erisinde hatan\u0131n nedenini ararken kaybolmaya ba\u015flars\u0131n\u0131z. Uygulaman\u0131z g\u00fcnl\u00fck dosyas\u0131na kay\u0131t yapmaya \u00e7al\u0131\u015f\u0131rken \u00e7ok fazla yazma\/okuma i\u015flemi yapaca\u011f\u0131ndan yava\u015flamaya ba\u015flar. \u0130\u015fte bu noktadan sonra i\u015fler iyice \u00e7\u0131\u011fr\u0131ndan \u00e7\u0131kacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ne g\u00fcnl\u00fck tutmadan oluyor, ne de g\u00fcnl\u00fck tutunca oluyor. Peki bu durumda yaz\u0131l\u0131m geli\u015ftiricilerin nas\u0131l haraket etmesi gerekiyor? \u015eansl\u0131y\u0131z ki bu konuda yukar\u0131da sayd\u0131\u011f\u0131m s\u0131k\u0131nt\u0131lar ve daha fazlas\u0131n\u0131 ya\u015fayan tek yaz\u0131l\u0131m geli\u015ftiriciler bizler de\u011filiz. Bu s\u0131k\u0131nt\u0131dan yak\u0131nan ve bu alandaki eksikli\u011fi farkeden bir gurup yaz\u0131l\u0131m geli\u015ftirici \u00e7oktan bizim yerimize g\u00fcnl\u00fck tutma i\u015flemlerini y\u00f6neten olduk\u00e7a g\u00fczel bir k\u00fct\u00fcphane geli\u015ftirmi\u015f, <strong>Log4Net<\/strong>.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Log4Net, olduk\u00e7a esnek tasar\u0131m\u0131yla g\u00fcnl\u00fck tutmak i\u00e7in gerek duyaca\u011f\u0131n\u0131z neredeyse t\u00fcm ihtiya\u00e7lar\u0131m\u0131z\u0131 kar\u015f\u0131lar bir k\u00fct\u00fcphanedir. Apache Foundation taraf\u0131ndan desteklenmekte olan bu k\u00fct\u00fcphane ve ilgili dok\u00fcmantasyona <a href=\"http:\/\/logging.apache.org\/log4net\/index.html\">http:\/\/logging.apache.org\/log4net\/index.html<\/a> adresinden&nbsp; ula\u015f\u0131labilir. Dosya sisteminde, event log&#8217;larda g\u00fcnl\u00fck tutmaktan Ado.Net veri kaynaklar\u0131nda, SMTP ile mail adreslerinde, UDP ile a\u011f \u00fczerinde g\u00fcnl\u00fck tutmaktaya kadar pek \u00e7ok farkl\u0131 y\u00f6ntemi destekleyen Log4Net, ayn\u0131 zamanda bu g\u00fcnl\u00fckte yer alan girdileri Debug, Info, Warn, Error, and Fatal gibi farkl\u0131 d\u00fczeylerde tutarak mesaj\u0131n\u0131z\u0131n \u00f6nemini belirtmenizi de sa\u011flamakta. Do\u011fru bir yap\u0131land\u0131rma ile \u00f6rne\u011fi sadece A.B.C namespace&#8217;i alt\u0131ndaki s\u0131n\u0131flar i\u00e7in Error ve Fatal seviyesinde g\u00fcnl\u00fck tutulmas\u0131n\u0131 ve bunlar\u0131nda event loglar i\u00e7erisinde toplanmas\u0131n\u0131 sa\u011flayabilirsiniz. \u00dcstelik bunu yaparken, paralelde di\u011fer verilerinden bir g\u00fcnl\u00fck dosyas\u0131nda toplanmas\u0131n\u0131 sa\u011flaman\u0131z da m\u00fcmk\u00fcn. T\u00fcm bu yap\u0131land\u0131rma i\u015flemleri uygulama yap\u0131land\u0131rma dosyalar\u0131nda (<em>app.config, web.config<\/em>) tutulmas\u0131 sayesinde koda dokunmadan yeni g\u00fcnl\u00fckler eklemeyi, g\u00fcnl\u00fck tutma seviyesini de\u011fi\u015ftirerek g\u00f6rmek istedi\u011finiz detaya ula\u015fmay\u0131 ya da g\u00fcnl\u00fck tutmay\u0131 tamamen kapatmay\u0131 rahatl\u0131kla yapabilirsiniz.<\/p>\n\n\n\n<p>&nbsp;&nbsp; B\u00f6ylesi uzun bir tan\u0131t\u0131m ve giri\u015f sonras\u0131nda isterseniz biraz da koda dokunarak, Log4Net&#8217;i geli\u015ftirdi\u011fimiz uygulamalar i\u00e7erisinde nas\u0131l kullanabilece\u011fimizi g\u00f6relim. Tan\u0131mam\u0131z gereken ilk aray\u00fcz\u00fcm\u00fcz <strong>ILog<\/strong> olmal\u0131. uygulamam\u0131z\u0131n g\u00fcnl\u00fck k\u00fct\u00fcphanesinde bir k\u00f6pr\u00fc olan ILog aray\u00fcz\u00fcn\u00fc uygulayan s\u0131n\u0131flar sayesinde g\u00fcnl\u00fck tutabilmekteyiz. ILog aray\u00fcz\u00fc a\u015fa\u011f\u0131daki yap\u0131dad\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace log4net\n{\n    public interface ILog\n    {\n        bool IsDebugEnabled { get; }\n        bool IsInfoEnabled { get; }\n        bool IsWarnEnabled { get; }\n        bool IsErrorEnabled { get; }\n        bool IsFatalEnabled { get; }\n\n        void Debug(object message);\n        void Info(object message);\n        void Warn(object message);\n        void Error(object message);\n        void Fatal(object message);\n\n        void Debug(object message, Exception t);\n        void Info(object message, Exception t);\n        void Warn(object message, Exception t);\n        void Error(object message, Exception t);\n        void Fatal(object message, Exception t);\n\n        void DebugFormat(string format, params object[] args);\n        void InfoFormat(string format, params object[] args);\n        void WarnFormat(string format, params object[] args);\n        void ErrorFormat(string format, params object[] args);\n        void FatalFormat(string format, params object[] args);\n\n        void DebugFormat(IFormatProvider provider, string format, params object[] args);\n        void InfoFormat(IFormatProvider provider, string format, params object[] args);\n        void WarnFormat(IFormatProvider provider, string format, params object[] args);\n        void ErrorFormat(IFormatProvider provider, string format, params object[] args);\n        void FatalFormat(IFormatProvider provider, string format, params object[] args);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Aray\u00fcz\u00fcn ilk grubu ilgili log seviyesinin aktif olup olmad\u0131\u011f\u0131n\u0131n programsal olarak kontrol edilmesine olanak vermekte. Bu sayede aktif olmayan bir log seviyesi i\u00e7in gereksiz i\u015flemler yap\u0131lmas\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ilerek uygulaman\u0131n performans\u0131n\u0131n etkilenmemesi sa\u011flanmakta. \u0130kinci grupta yer alan fonksiyonlar basit d\u00fczeyde g\u00fcnl\u00fck tutulabilmesini sa\u011flamay\u0131 ama\u00e7 edinerek sadece g\u00fcnl\u00fc\u011fe kaydedilmesi istenen nesneyi parametre kabul etmektedir. Genel kullan\u0131m olarak string t\u00fcr\u00fcnden g\u00fcnl\u00fc\u011fe kaydedilecek mesajlar verilmektedir. \u00dc\u00e7\u00fcnc\u00fc ve d\u00f6rd\u00fcnc\u00fc grupta yer alan fonksiyonlar belirli bir format ile g\u00fcnl\u00fck tutulmas\u0131na olanak verilmi\u015ftir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u0130kinci grupta yer alan fonksiyonlar kullan\u0131larak formatlanan\n\/\/ bir g\u00fcnl\u00fck girdisi\nlogger.Info(string.Format(\"Kullan\u0131c\u0131 {0} de\u011ferini girmi\u015ftir\", girilenDeger));\n\n\/\/ Ayn\u0131 girdinin \u00fc\u00e7\u00fcnc\u00fc grupta yer alan fonksiyonlar kullan\u0131larak\n\/\/ yaz\u0131lm\u0131\u015f hali\nlogger.InfoFormat(\"Kullan\u0131c\u0131 {0} de\u011ferini girmi\u015ftir\", girilenDeger);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki \u00f6rnekte de g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi g\u00fcnl\u00fc\u011fe kaydedilecek mesaj\u0131n\u0131z\u0131 belirli bir formatta vermek istemeniz durumunda kullanabilece\u011finiz iki y\u00f6ntem bulunmakta. Benim size tavsiyem bu iki y\u00f6ntemde ikincisi se\u00e7erek \u00fc\u00e7\u00fcnc\u00fc grupta yer alan fonksiyonlar\u0131 kullanman\u0131z. \u0130kinci grup fonksiyonlar\u0131 kullanarak yap\u0131lan bir g\u00fcnl\u00fck kayd\u0131 i\u015fleminde ilgili seviye aktif olmasa dahi string \u00fczerinde bir format i\u015flemi yap\u0131lmakta. String i\u015flemlerinin maliyetinin y\u00fcksek olmas\u0131 ve m\u00fcmk\u00fcn oldu\u011funca ka\u00e7\u0131n\u0131lmas\u0131 gerekti\u011fini hat\u0131rlayacak olursak \u00fc\u00e7\u00fcnc\u00fc grup fonksiyonlarda ilgili seviyenin aktif olmamas\u0131 durumunda herhangi bir string i\u015flemi yap\u0131lmamas\u0131 nedeniyle daha performansl\u0131 \u00e7al\u0131\u015faca\u011f\u0131n\u0131 rahatl\u0131kla g\u00f6rebiliriz.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131da \u00f6rnekledi\u011fim ve ILog aray\u00fcz\u00fcn\u00fc uygulayan logger de\u011fi\u015fkeni, Log4Net ile birlikte gelen, <strong>LogManager<\/strong> s\u0131n\u0131f\u0131 yard\u0131m\u0131yla programsal olarak olu\u015fturulabilir.&nbsp; LogManager i\u00e7erisinde yer alan static <strong>GetLogger<\/strong> metodu bize ihtiyac\u0131m\u0131z olan de\u011fi\u015fkeni verecektir. Log4Net i\u00e7erisinde istedi\u011fimiz kadar logger kullanabiliyor olmam\u0131z nedeniyle GetLogger fonksiyonuna bunlardan hangisi istedi\u011fimizi belirtmeliyiz. Bunun i\u00e7in do\u011frudan istedi\u011fimiz logger&#8217;\u0131n ad\u0131n\u0131 verebilece\u011fimiz gibi logger&#8217;\u0131 kullanaca\u011f\u0131m\u0131z s\u0131n\u0131f\u0131m\u0131z\u0131 belirterek bir logger almakta m\u00fcmk\u00fcn.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private static readonly ILog logger = LogManager.GetLogger(typeof(IsSinifi));<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ILog logger = LogManager.GetLogger(this.GetType());<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private static readonly ILog logger = LogManager.GetLogger(\"IOIslemleri\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Burada dikkat edilmesi gereken nokta iki y\u00f6ntemin birbirinden farkl\u0131 sonu\u00e7lar\u0131 olaca\u011f\u0131d\u0131r. Kullanaca\u011f\u0131m\u0131z s\u0131n\u0131f\u0131 vererek olu\u015fturulacak bir logger, hiyerar\u015fik olarak do\u011frudan bu s\u0131n\u0131f i\u00e7in do\u011fru bir \u015fekilde konumlan\u0131r. Bu sayede \u00f6rne\u011fin yap\u0131land\u0131rma dosyam\u0131zda s\u0131n\u0131f\u0131n bulundu\u011fu namespace i\u00e7in verece\u011fimiz bir filterede (<em>bu namespace i\u00e7in sadece Error ve \u00fczeri seviyeler ge\u00e7erli olsun gibi<\/em>) bu s\u0131n\u0131f i\u00e7erisinde tuttu\u011fumuz g\u00fcnl\u00fckler de etkilenecektir. Do\u011frudan logger ad\u0131 verilmesi durumunda bir \u00f6nce belirtti\u011fim hiyerar\u015fi s\u00f6z konusu olmad\u0131\u011f\u0131 i\u00e7in filtreleme i\u00e7in daha farkl\u0131 i\u015flemler yap\u0131lmas\u0131 gerekecektir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bir k\u0131s\u0131tlama ya da zorunluluk olmamas\u0131na kar\u015f\u0131n, kullan\u0131m olarak g\u00fcnl\u00fcklerinize a\u015fa\u011f\u0131daki \u015fekilde veri kaydetmenizi tavsiye ederim. Bu \u015fekilde uygulaman\u0131z daha performansl\u0131 \u00e7al\u0131\u015facakt\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class IsSinifi {\n    private static readonly ILog logger = LogManager.GetLogger(typeof(IsSinifi));\n\n    public void KullanicidanVeriOku() {\n        if (logger.IsDebugEnabled) {\n            logger.Debug(\"Kullan\u0131c\u0131dan veri al\u0131n\u0131yor\");\n        }\n\n\/\/ ...\n        \/\/ \u0130\u015f mant\u0131\u011f\u0131 kodlar\u0131\n        \/\/ ...\n\n        if (logger.IsInfoEnabled) {\n            logger.InfoFormat(\"Kullan\u0131c\u0131 {0} de\u011ferini girmi\u015ftir\",  girilenDeger);\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Uygulamam\u0131zda g\u00fcnl\u00fck tutmak istedi\u011fimiz yerlerde LogManager sn\u0131f\u0131 GetLogger fonksiyonu yard\u0131m\u0131yla ald\u0131\u011f\u0131m\u0131z logger de\u011fi\u015fkenimizi olu\u015fturup yukar\u0131da s\u0131ralad\u0131\u011f\u0131m y\u00f6ntemleri kullanarak uygulamam\u0131zda g\u00fcnl\u00fck tutmaya ba\u015flam\u0131\u015f olmakla birlikte hen\u00fcz yapmam\u0131z gerekenler bitmi\u015f de\u011fil. Son olarak uygulama yap\u0131land\u0131rma dosyas\u0131nda gerekli ayarlamalar\u0131 yaparak loglamay\u0131 aktif hale getirmemiz gerekmekte.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Log4Net, ihtiyac\u0131 olan yap\u0131land\u0131rma bilgisine app.config\/web.config dosyas\u0131nda bulunan <strong>log4net<\/strong> b\u00f6l\u00fcm\u00fcnden ula\u015fmaktad\u0131r. Bu sebeple \u00f6ncelikle bu b\u00f6l\u00fcm\u00fc tan\u0131tmam\u0131z gerekmekte. Tan\u0131mlama i\u00e7in yap\u0131lmas\u0131 gereken yap\u0131land\u0131rma dosyas\u0131 i\u00e7erisinde configSections elementi alt\u0131na <em>log4net<\/em> ad\u0131 ve &#8220;<em>log4net.Config.Log4NetConfigurationSectionHandler, log4net<\/em>&#8221; t\u00fcr\u00fcyle a\u015fa\u011f\u0131da \u00f6rneklendi\u011fi \u015fekilde bir girdi eklemektir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;configuration>\n&lt;configSections>\n&lt;section name=\"log4net\" type=\"log4net.Config.Log4NetConfigurationSectionHandler, log4net\" \/>\n&lt;!-- di\u011fer yap\u0131land\u0131rma b\u00f6l\u00fcmleri-->\n&lt;\/configSections>\n\n&lt;log4net>\n&lt;!-- Log4Net yap\u0131land\u0131rmas\u0131-->\n&lt;\/log4net>\n\n&lt;!-- di\u011fer yap\u0131land\u0131rma bilgileri-->\n&lt;\/configuration><\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu ad\u0131m sonras\u0131, t\u00fcm yap\u0131land\u0131rma bilgisi log4net elementi alt\u0131nda toplanmal\u0131d\u0131r. Log4Net yap\u0131land\u0131rmas\u0131 konusu ba\u015fl\u0131 ba\u015f\u0131na anlat\u0131lmas\u0131 gereken bir konu olmas\u0131 nedeniyle bu makale i\u00e7erisinde de\u011finmemekle birlikte, Log4Net&#8217;\u0131 h\u0131zl\u0131ca kullanmaya ba\u015flayabilmeniz\/pratik kazanabilmeniz ad\u0131na a\u015fa\u011f\u0131da basit yap\u0131land\u0131rma bilgisini payla\u015f\u0131yorum;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;log4net>\n  &lt;appender name=\"DosyaAppender\" type=\"log4net.Appender.FileAppender,log4net\">\n    &lt;param name=\"File\" value=\"GunlukDosyasi.txt\"\/>\n    &lt;param name=\"AppendToFile\" value=\"true\"\/>\n    &lt;layout type=\"log4net.Layout.PatternLayout,log4net\">\n      &lt;param name=\"ConversionPattern\" value=\"%d [%t] %-5p %c [%x] - %m%n\"\/>\n    &lt;\/layout>\n  &lt;\/appender>\n\n  &lt;root>\n    &lt;level value=\"ALL\" \/>\n\n    &lt;appender-ref ref=\"DosyaAppender\" \/>\n  &lt;\/root>\n&lt;\/log4net><\/pre>\n\n\n\n<p>&nbsp;&nbsp; \u00d6rnek yap\u0131land\u0131rmam\u0131zda \u00f6ncelikle DosyaAppender ad\u0131yla bir appender tan\u0131mlanmakta. G\u00fcnl\u00fc\u011f\u00fcn <em>GunlukDosyasi.txt<\/em> ad\u0131nda bir text dosyada tutulmas\u0131n\u0131 sa\u011flayan bu appender root elementi i\u00e7erisine eklenerek t\u00fcm hiyerar\u015filerde tan\u0131ml\u0131 olmas\u0131 sa\u011flanmakta. root elementi i\u00e7erisinde yer alan level elementinde value \u00f6zniteli\u011fine ALL verilerek t\u00fcm seviyeler i\u00e7in loglama yap\u0131lmas\u0131 sa\u011flanmakta. G\u00fcnl\u00fck tutma seviyesinin belirtildi\u011fi leve elementi value \u00f6znitelinde a\u015fa\u011f\u0131daki de\u011ferler kullan\u0131labilir;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>ALL<\/li><li>DEBUG<\/li><li>INFO<\/li><li>WARN<\/li><li>ERROR<\/li><li>FATAL<\/li><li>OFF<\/li><\/ul>\n\n\n\n<p>&nbsp;&nbsp; Bu seviyeler ile ilgili olarak d\u00fc\u015f\u00fclmesi gereken \u00f6nemli bir not; yukar\u0131da s\u0131ralanan seviyeler a\u015fa\u011f\u0131dan yukar\u0131 do\u011fru bir birini kapsamaktad\u0131r. Konuyu biraz daha a\u00e7arsak; \u00f6rne\u011fin seviye olarak WARN belirtilmesi durumunda sadece uyar\u0131 (Warn) seviyesi de\u011fil daha \u00fcst seviyeler olarak ERROR ve FATAL seviyesindeki g\u00fcnl\u00fck girdileri de kay\u0131t edilecektir. ALL ve DEBUG seviyerleri ise t\u00fcm g\u00fcnl\u00fck girdilerinin kaydedilmesini sa\u011flayaca\u011f\u0131ndan \u00fcretim ortam\u0131nda bulunan uygulamalarda gerekmedik\u00e7e verilmemesini tavsiye ederim.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Her ne kadar \u00f6rnek yap\u0131land\u0131rmam\u0131zda tek bir hiyerar\u015fi i\u00e7in tan\u0131mlamalar bulunsa da, birden fazla hiyerar\u015fi i\u00e7in farkl\u0131 seviyelerde ve farkl\u0131 logger\u2019larda g\u00fcnl\u00fck tutulmas\u0131n\u0131 sa\u011flamakta m\u00fcmk\u00fcnd\u00fcr.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Herhangi bir sebeple bir hiyerar\u015fi ve alt\u0131ndaki t\u00fcm loglamay\u0131 iptal etmek istememiz durumunda kodumunuza dokunmaya gerek kalmadan yap\u0131land\u0131rma dosyas\u0131na a\u015fa\u011f\u0131daki girdiyi ekleyerek ilgili hiyerar\u015fi i\u00e7in loglamay\u0131 kapatmam\u0131z m\u00fcmk\u00fcnd\u00fcr;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;log4net threshold=\"OFF\" \/><\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu ad\u0131mlar sonras\u0131nda her \u015fey haz\u0131r durumda, son yap\u0131lacak i\u015flem log4net yap\u0131land\u0131rmas\u0131n\u0131n yap\u0131lmas\u0131d\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">XmlConfigurator.Configure(new System.IO.FileInfo(\"yapilandirmaDosyasi.xml\"));<\/pre>\n\n\n\n<p>&nbsp;&nbsp; app.config ya da web.config gibi bir uygulama config dosyas\u0131 \u00fczerinden yap\u0131labilecek olan log4net yap\u0131land\u0131rmas\u0131 istenirse ayn\u0131 y\u00f6ntemle normal bir xml dosyas\u0131ndan da yap\u0131labilir. Bu durumda loglama ba\u015flamadan \u00f6nce, genellikle uygulaman\u0131n ilk sat\u0131r\u0131nda, a\u015fa\u011f\u0131daki kod par\u00e7as\u0131yla harici yap\u0131land\u0131rma dosyas\u0131n\u0131n belirtilerek yap\u0131land\u0131rman\u0131n tamamlanmas\u0131 gereklidir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">XmlConfigurator.Configure(new System.IO.FileInfo(\"yapilandirmaDosyasi.xml\"));<\/pre>\n\n\n\n<p>&nbsp;&nbsp; XmlConfigurator s\u0131n\u0131f\u0131 Configure metodu pek \u00e7ok parametre almas\u0131 nedeniyle yap\u0131land\u0131rma bildileri \u00e7ok farkl\u0131 kaynaklarda tutulabilir. \u00d6rne\u011fin uygulamada g\u00f6m\u00fcl\u00fc bi Bir ba\u015fka y\u00f6ntem de <strong>XmlConfiguratorAttribute<\/strong> \u00f6zniteli\u011fini kullanarak yap\u0131land\u0131rman\u0131n tamamlanmas\u0131d\u0131r. Bu y\u00f6ntemde assembly seviyesindeki XmlConfiguratorAttribute \u00f6zniteli\u011fi kullan\u0131larak yap\u0131land\u0131rma bilgileri verilmektedir. Zorunlu olmamakla birlikte bu y\u00f6ntemde XmlConfiguratorAttribute \u00f6zniteli\u011fini <strong>AssemblyInfo.cs <\/strong>dosyas\u0131na eklemek kodunuzun daha derli toplu olmas\u0131n\u0131 sa\u011flayacakt\u0131r. XmlConfiguratorAttribute \u00f6zniteli\u011fi a\u015fa\u011f\u0131daki 3 parametreyi kabul etmektedir;<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li> <strong>ConfigFile<\/strong> : Yap\u0131land\u0131rma bilgilerinin okunaca\u011f\u0131 dosyay\u0131 belirtir. Zorunlu olmayan bu parametrede verilen de\u011fer uygulaman\u0131n ana dizinine ba\u011fl\u0131 g\u00f6receli bir yol tan\u0131mlamad\u0131r. <\/li><li> <strong>ConfigFileExtension<\/strong> : Yap\u0131land\u0131rma dosyas\u0131n\u0131 uzant\u0131s\u0131n\u0131 belirtmekte kullan\u0131l\u0131r. ConfigFile parametresiyle birlikte kullan\u0131lamayan ve zorunlu olmayan bu parametrede verilecek de\u011fere g\u00f6re aranacak olan yap\u0131land\u0131rma dosyas\u0131 belirlenir. Yap\u0131land\u0131rma dosyas\u0131 aran\u0131rken uygulaman\u0131n ba\u015flat\u0131ld\u0131\u011f\u0131 assembly ad\u0131n\u0131n sonuna bu parametrede verilen de\u011fer eklenerek olu\u015fan dosya ad\u0131yla bir yap\u0131land\u0131rma dosyas\u0131 olup olmad\u0131\u011f\u0131na bak\u0131l\u0131r, bulunmas\u0131 durumunda y\u00fcklenir. <\/li><li> <strong>Watch<\/strong> : true ve false de\u011ferlerini alan ve zorunlu olmayan bu parametrede yap\u0131land\u0131rma dosyas\u0131ndaki de\u011fi\u015fikliklerin takip edilip edilmeyece\u011fi belirlenir. Parametrenin true de\u011feri almas\u0131 durumunda yap\u0131land\u0131rma dosyas\u0131n\u0131n her de\u011fi\u015fimde yeniden Log4Net yap\u0131land\u0131rmas\u0131 yap\u0131lacakt\u0131r. <\/li><\/ol>\n\n\n\n<p>&nbsp; A\u015fa\u011f\u0131da XmlConfiguratorAttribute \u00f6zeniteli\u011finin kullan\u0131m\u0131na dair iki \u00f6rnek bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Yap\u0131land\u0131rma dosyas\u0131 de\u011fi\u015fiklikler i\u00e7in izlenecektir\n[assembly: log4net.Config.XmlConfigurator(Watch=true)]\n\n\/\/ Uygulamay\u0131 ba\u015flatan assembly'nin abc.exe olmas\u0131 durumunda\n\/\/ abc.exe.log4net ad\u0131yla bir yap\u0131land\u0131rma dosyas\u0131 aranacakt\u0131r\n[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension=\"log4net\",Watch=true)]<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Her ne kadar yap\u0131land\u0131rma dosyas\u0131 d\u0131\u015f\u0131nda programsal olarak loglamay\u0131 aktif hale getirmek hatta yeni appender\u2019lar tan\u0131mlamak m\u00fcmk\u00fcnse de, bu y\u00f6nteme Log4Net giri\u015f makalesinde yer vermek yerine ayr\u0131 bir makalede incelemek daha do\u011fru olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; T\u00fcm bu ad\u0131mlar\u0131 takip ederekn uygulamam\u0131zda da gerekli g\u00fcnl\u00fck kay\u0131tlar\u0131n\u0131 yazd\u0131ysak art\u0131k i\u015fler bizim i\u00e7in \u00e7ok daha kolay olacakt\u0131r. \u0130lk kullan\u0131mlar\u0131n\u0131zda gere\u011finden az ya da fazla log at\u0131yor olman\u0131z muhtemeldir. Zaman i\u00e7erisinde nerede, hangi d\u00fczeyde&nbsp; ve ne \u015fekilde log atman\u0131z gerekti\u011fi konusu oturacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Log4Net ve loglama i\u015flemleri i\u00e7in anlat\u0131labilecekler bu makaleye s\u0131\u011fmayacakt\u0131r. Loglama ve Log4Net ile h\u0131zl\u0131 bir tan\u0131\u015fma ve kolayl\u0131kla uygulamalar\u0131n\u0131zda kullanmaya ba\u015flaman\u0131z\u0131 ama\u00e7lad\u0131\u011f\u0131m bu makalemde umar\u0131m sizler i\u00e7in yararl\u0131 bilgiler verebilmi\u015fimdir.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; Yaz\u0131l\u0131m geli\u015ftiricilerin en b\u00fcy\u00fck derdidir sahaya g\u00f6nderilen uygulamada olu\u015fan hatalar\u0131 \u00e7\u00f6zmek, \u00f6zellikle de son kullan\u0131c\u0131dan ald\u0131\u011f\u0131 &#8220;hata oldu&#8220;, &#8220;uygulama dondu&#8220;, &#8220;program kendini kapatt\u0131&#8221; gibi ucu a\u00e7\u0131k geri bildirimleri d\u00fc\u015f\u00fcnecek olursak. Kimi zaman uygulamada olu\u015fan \u00f6yle hatalar olabilir ki bunlar\u0131 yaz\u0131l\u0131m geli\u015ftirici kendi bilgisayar\u0131nda dahi debug ederken \u00e7\u00f6zmekte\/g\u00f6rmekte zorlanabilir. Bir de hi\u00e7 bir aray\u00fcz\u00fc olmayan&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/log4net-ile-hata-ayiklama\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":8573,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[118,87],"class_list":["post-8572","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-turkce","tag-hata-ayiklama","tag-log4net"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Log4Net ile Hata Ay\u0131klama - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/log4net-ile-hata-ayiklama\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Log4Net ile Hata Ay\u0131klama - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp; Yaz\u0131l\u0131m geli\u015ftiricilerin en b\u00fcy\u00fck derdidir sahaya g\u00f6nderilen uygulamada olu\u015fan hatalar\u0131 \u00e7\u00f6zmek, \u00f6zellikle de son kullan\u0131c\u0131dan ald\u0131\u011f\u0131 &#8220;hata oldu&#8220;, &#8220;uygulama dondu&#8220;, &#8220;program kendini kapatt\u0131&#8221; gibi ucu a\u00e7\u0131k geri bildirimleri d\u00fc\u015f\u00fcnecek olursak. Kimi zaman uygulamada olu\u015fan \u00f6yle hatalar olabilir ki bunlar\u0131 yaz\u0131l\u0131m geli\u015ftirici kendi bilgisayar\u0131nda dahi debug ederken \u00e7\u00f6zmekte\/g\u00f6rmekte zorlanabilir. Bir de hi\u00e7 bir aray\u00fcz\u00fc olmayan...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/log4net-ile-hata-ayiklama\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2010-12-28T19:58:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png\" \/>\n\t<meta property=\"og:image:width\" content=\"209\" \/>\n\t<meta property=\"og:image:height\" content=\"208\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"Log4Net ile Hata Ay\u0131klama\",\"datePublished\":\"2010-12-28T19:58:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/\"},\"wordCount\":2427,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png\",\"keywords\":[\"Hata Ayiklama\",\"Log4Net\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/\",\"url\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/\",\"name\":\"Log4Net ile Hata Ay\u0131klama - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png\",\"datePublished\":\"2010-12-28T19:58:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png\",\"width\":209,\"height\":208},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Log4Net ile Hata Ay\u0131klama\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Log4Net ile Hata Ay\u0131klama - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/log4net-ile-hata-ayiklama\/","og_locale":"en_US","og_type":"article","og_title":"Log4Net ile Hata Ay\u0131klama - Fatih Boy","og_description":"&nbsp;&nbsp; Yaz\u0131l\u0131m geli\u015ftiricilerin en b\u00fcy\u00fck derdidir sahaya g\u00f6nderilen uygulamada olu\u015fan hatalar\u0131 \u00e7\u00f6zmek, \u00f6zellikle de son kullan\u0131c\u0131dan ald\u0131\u011f\u0131 &#8220;hata oldu&#8220;, &#8220;uygulama dondu&#8220;, &#8220;program kendini kapatt\u0131&#8221; gibi ucu a\u00e7\u0131k geri bildirimleri d\u00fc\u015f\u00fcnecek olursak. Kimi zaman uygulamada olu\u015fan \u00f6yle hatalar olabilir ki bunlar\u0131 yaz\u0131l\u0131m geli\u015ftirici kendi bilgisayar\u0131nda dahi debug ederken \u00e7\u00f6zmekte\/g\u00f6rmekte zorlanabilir. Bir de hi\u00e7 bir aray\u00fcz\u00fc olmayan...Read More","og_url":"https:\/\/fatihboy.com\/en\/log4net-ile-hata-ayiklama\/","og_site_name":"Fatih Boy","article_published_time":"2010-12-28T19:58:28+00:00","og_image":[{"width":209,"height":208,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png","type":"image\/png"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"Log4Net ile Hata Ay\u0131klama","datePublished":"2010-12-28T19:58:28+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/"},"wordCount":2427,"commentCount":3,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png","keywords":["Hata Ayiklama","Log4Net"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/","url":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/","name":"Log4Net ile Hata Ay\u0131klama - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png","datePublished":"2010-12-28T19:58:28+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/debug_thumb.png","width":209,"height":208},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/log4net-ile-hata-ayiklama\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"Log4Net ile Hata Ay\u0131klama"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=8572"}],"version-history":[{"count":0,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8572\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/8573"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=8572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=8572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=8572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}