{"id":35807,"date":"2025-12-04T02:01:16","date_gmt":"2025-12-03T23:01:16","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/"},"modified":"2025-12-04T02:01:16","modified_gmt":"2025-12-03T23:01:16","slug":"java-uygulamalarinda-loglama-neden-bu-kadar-onemli","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/","title":{"rendered":"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?"},"content":{"rendered":"<div class=\"article-content\">\n<p>Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler<\/p>\n<p>Java uygulamalar\u0131n\u0131zdaki g\u00f6r\u00fcnmez hatalar\u0131 bulmak, performans\u0131 izlemek ve sistem sa\u011fl\u0131\u011f\u0131n\u0131 anlamak i\u00e7in loglama hayati \u00f6neme sahiptir. Temel prensiplerden ileri tekniklere her \u015feyi ke\u015ffedin.<\/p>\n<p>Bir yaz\u0131l\u0131m geli\u015ftiricisi olarak, yazd\u0131\u011f\u0131n\u0131z kodun sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 istersiniz. Ancak ger\u00e7ek d\u00fcnya, \u00f6ng\u00f6r\u00fclemeyen hatalar, beklenmedik kullan\u0131c\u0131 davran\u0131\u015flar\u0131 ve karma\u015f\u0131k sistem entegrasyonlar\u0131yla doludur. Bir Java uygulamas\u0131n\u0131n canl\u0131ya al\u0131nd\u0131ktan sonra kar\u015f\u0131la\u015fabilece\u011fi sorunlar\u0131 elle izlemek veya debug etmek neredeyse imkans\u0131zd\u0131r. \u0130\u015fte tam bu noktada, <strong>Java uygulama loglar\u0131<\/strong> devreye giriyor ve adeta uygulaman\u0131z\u0131n kalbinin at\u0131\u015flar\u0131n\u0131 dinlemenizi sa\u011flayan bir steteskop g\u00f6revi g\u00f6r\u00fcyor.<\/p>\n<p>Loglama, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131nda belirli olaylar\u0131, durumlar\u0131 ve hatalar\u0131 kaydetme s\u00fcrecidir. Bu kay\u0131tlar, sistem y\u00f6neticileri ve geli\u015ftiriciler i\u00e7in paha bi\u00e7ilmez birer bilgi kayna\u011f\u0131d\u0131r. Peki, loglama sadece hata ay\u0131klama (debugging) i\u00e7in mi kullan\u0131l\u0131r? Kesinlikle hay\u0131r! Loglar\u0131n faydalar\u0131 \u00e7ok daha geni\u015ftir ve bir\u00e7ok farkl\u0131 senaryoda kritik rol oynar. \u00d6rne\u011fin, uygulaman\u0131z\u0131n performans darbo\u011fazlar\u0131n\u0131 tespit etmek, yetkisiz eri\u015fim denemelerini veya g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 izlemek, kullan\u0131c\u0131 davran\u0131\u015flar\u0131n\u0131 analiz etmek ya da hatta i\u015f s\u00fcre\u00e7lerinin do\u011fru i\u015fleyip i\u015flemedi\u011fini do\u011frulamak i\u00e7in loglar vazge\u00e7ilmezdir. Log kay\u0131tlar\u0131 sayesinde, bir problem ortaya \u00e7\u0131kt\u0131\u011f\u0131nda &#8220;Nerede?&#8221;, &#8220;Ne zaman?&#8221;, &#8220;Nas\u0131l?&#8221; ve &#8220;Kim taraf\u0131ndan?&#8221; sorular\u0131na h\u0131zl\u0131ca yan\u0131t bulabilirsiniz. Bu, sorun giderme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. G\u00f6z ard\u0131 edilmi\u015f bir loglama stratejisi, k\u00fc\u00e7\u00fck bir hatan\u0131n b\u00fcy\u00fck bir felakete d\u00f6n\u00fc\u015fmesine zemin haz\u0131rlayabilirken, iyi tasarlanm\u0131\u015f bir loglama mekanizmas\u0131, proaktif olarak sorunlar\u0131 tespit etmenize ve gidermenize olanak tan\u0131r. K\u0131sacas\u0131, loglar sadece bir &#8220;hatalar g\u00fcnl\u00fc\u011f\u00fc&#8221; de\u011fil, ayn\u0131 zamanda uygulaman\u0131z\u0131n genel sa\u011fl\u0131\u011f\u0131n\u0131, g\u00fcvenli\u011fini ve performans\u0131n\u0131 izleyen kapsaml\u0131 bir &#8220;operasyon g\u00fcnl\u00fc\u011f\u00fc&#8221;d\u00fcr.<\/p>\n<p>Bir uygulaman\u0131n b\u00fcy\u00fckl\u00fc\u011f\u00fc ve karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a, loglaman\u0131n \u00f6nemi de katlanarak artar. Mikroservis mimarilerinde veya da\u011f\u0131t\u0131k sistemlerde, tek bir i\u015flemin birden fazla servisi tetikledi\u011fi durumlarda, loglar olmadan bu servisler aras\u0131ndaki etkile\u015fimleri ve olas\u0131 sorunlar\u0131 takip etmek tam anlam\u0131yla bir kabusa d\u00f6n\u00fc\u015febilir. Her servisin kendi i\u00e7inde ne yapt\u0131\u011f\u0131n\u0131, hangi verilerle \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve di\u011fer servislerle nas\u0131l ileti\u015fim kurdu\u011funu loglamak, t\u00fcm sistemin \u015feffafl\u0131\u011f\u0131n\u0131 ve izlenebilirli\u011fini art\u0131r\u0131r. Bu durum, hem geli\u015ftirme hem de \u00fcretim ortamlar\u0131nda kar\u015f\u0131la\u015f\u0131lan sorunlar\u0131n \u00e7\u00f6z\u00fcm\u00fcnde kritik bir kolayl\u0131k sa\u011flar. Uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca, geli\u015ftirme a\u015famas\u0131ndan ba\u015flayarak \u00fcretim ortam\u0131na kadar her a\u015famada loglar aktif olarak kullan\u0131lmal\u0131d\u0131r. Geli\u015ftirme a\u015famas\u0131nda anl\u0131k geri bildirim sa\u011flarken, \u00fcretimde ise sistemin kalp at\u0131\u015flar\u0131n\u0131 izleyerek olas\u0131 anormalliklere kar\u015f\u0131 erken uyar\u0131 mekanizmas\u0131 g\u00f6revi g\u00f6r\u00fcr. Bu motivasyonlarla yola \u00e7\u0131karak, Java&#8217;da etkili loglama stratejileri geli\u015ftirmek, her geli\u015ftiricinin ve tak\u0131m\u0131n \u00f6ncelikleri aras\u0131nda yer almal\u0131d\u0131r. Loglama, modern yaz\u0131l\u0131m geli\u015ftirmenin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve do\u011fru uyguland\u0131\u011f\u0131nda size zaman, maliyet ve stres tasarrufu sa\u011flar.<\/p>\n<h2>Loglaman\u0131n Temel Ta\u015flar\u0131: Nedir Bu Log Seviyeleri ve Bile\u015fenleri?<\/h2>\n<p>Loglaman\u0131n d\u00fcnyas\u0131na ad\u0131m att\u0131\u011f\u0131m\u0131zda, kar\u015f\u0131m\u0131za \u00e7\u0131kan ilk kavramlardan biri <strong>log seviyeleri<\/strong>dir. Bu seviyeler, bir log mesaj\u0131n\u0131n \u00f6nem derecesini veya ciddiyetini kategorize etmemizi sa\u011flar. Do\u011fru seviyeyi se\u00e7mek, loglar\u0131n\u0131z\u0131 daha anlaml\u0131 ve y\u00f6netilebilir hale getirir. Yayg\u0131n olarak kullan\u0131lan log seviyeleri, genellikle en az \u00f6nemliden en \u00f6nemliye do\u011fru \u015fu \u015fekilde s\u0131ralanabilir:<\/p>\n<ul>\n<li><strong>TRACE:<\/strong> En ayr\u0131nt\u0131l\u0131 log seviyesidir. Uygulaman\u0131n i\u00e7 i\u015fleyi\u015findeki her ad\u0131m\u0131, metod \u00e7a\u011fr\u0131lar\u0131n\u0131, de\u011fi\u015fken de\u011ferlerini ve \u00e7ok ince detaylar\u0131 kaydetmek i\u00e7in kullan\u0131l\u0131r. Genellikle sadece \u00e7ok spesifik bir hata ay\u0131klama senaryosunda veya geli\u015ftirme a\u015famas\u0131nda aktif edilir. \u00dcretim ortam\u0131nda genellikle kapal\u0131 tutulur \u00e7\u00fcnk\u00fc \u00e7ok fazla veri \u00fcretir.<\/li>\n<li><strong>DEBUG:<\/strong> Geli\u015ftiricilerin hata ay\u0131klama yaparken ihtiya\u00e7 duydu\u011fu detaylar\u0131 i\u00e7erir. Uygulaman\u0131n ak\u0131\u015f\u0131n\u0131 takip etmek, belirli bir mod\u00fcl\u00fcn veya fonksiyonun nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak i\u00e7in kullan\u0131l\u0131r. Yine, \u00fcretimde genellikle kapat\u0131l\u0131r veya \u00e7ok k\u0131s\u0131tl\u0131 bir \u015fekilde kullan\u0131l\u0131r.<\/li>\n<li><strong>INFO:<\/strong> Uygulaman\u0131n genel ak\u0131\u015f\u0131n\u0131 ve \u00f6nemli olaylar\u0131n\u0131 bildiren mesajlar i\u00e7in kullan\u0131l\u0131r. Kullan\u0131c\u0131 giri\u015fi, servisin ba\u015flat\u0131lmas\u0131\/durdurulmas\u0131, ba\u015far\u0131l\u0131 i\u015flemler gibi, uygulaman\u0131n normal i\u015fleyi\u015fini g\u00f6steren bilgiler bu seviyede loglan\u0131r. \u00dcretim ortam\u0131nda genellikle aktif olan en d\u00fc\u015f\u00fck seviyedir.<\/li>\n<li><strong>WARN:<\/strong> Potansiyel olarak sorun yaratabilecek durumlar\u0131 veya beklenmedik ama uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 engellemeyen olaylar\u0131 belirtir. \u00d6rne\u011fin, bir konfig\u00fcrasyon dosyas\u0131n\u0131n bulunamamas\u0131 ve varsay\u0131lan de\u011ferlerin kullan\u0131lmas\u0131, veritaban\u0131 ba\u011flant\u0131 havuzunun dolmaya ba\u015flamas\u0131 gibi durumlar bu seviyede loglanabilir. Bunlar hen\u00fcz bir hata de\u011fildir ancak dikkat edilmesi gereken uyar\u0131 sinyalleridir.<\/li>\n<li><strong>ERROR:<\/strong> Uygulaman\u0131n bir k\u0131sm\u0131n\u0131n i\u015flevselli\u011fini bozan ciddi hatalar\u0131 veya istisnalar\u0131 g\u00f6sterir. Bir i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131, veri i\u015fleme hatas\u0131 gibi durumlar bu seviyede loglan\u0131r. Bu loglar genellikle h\u0131zl\u0131 m\u00fcdahale gerektiren sorunlara i\u015faret eder.<\/li>\n<li><strong>FATAL:<\/strong> En kritik log seviyesidir. Uygulaman\u0131n tamamen durmas\u0131na veya kararl\u0131 bir \u015fekilde \u00e7al\u0131\u015famamas\u0131na neden olan \u00e7ok ciddi ve onar\u0131lamaz hatalar\u0131 belirtir. Genellikle uygulaman\u0131n kendisini kapatmas\u0131 gerekti\u011fi durumlarda kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Bu seviyeleri ak\u0131ll\u0131ca kullanmak, log dosyalar\u0131n\u0131z\u0131n okunabilirli\u011fini art\u0131r\u0131r ve \u00f6nemli bilgileri gereksiz g\u00fcr\u00fclt\u00fcden ay\u0131rman\u0131za yard\u0131mc\u0131 olur. Bir di\u011fer \u00f6nemli konu ise <strong>loglama bile\u015fenleri<\/strong>dir. Modern Java loglama \u00e7er\u00e7eveleri (Log4j2, Logback gibi) genellikle benzer temel bile\u015fenleri kullan\u0131r:<\/p>\n<ul>\n<li><strong>Logger (Kaydedici):<\/strong> Uygulama kodunuzdan log mesajlar\u0131n\u0131 g\u00f6nderdi\u011finiz ana aray\u00fczd\u00fcr. Her bir logger, bir isimle (genellikle s\u0131n\u0131f\u0131n tam nitelikli ismi) tan\u0131mlan\u0131r ve belirli bir log seviyesine ayarlanabilir. Logger&#8217;lar hiyerar\u015fik bir yap\u0131ya sahiptir; \u00f6rne\u011fin, <code>com.example.MyApp<\/code> logger&#8217;\u0131, <code>com.example<\/code> logger&#8217;\u0131n\u0131n ayarlar\u0131n\u0131 devralabilir.<\/li>\n<li><strong>Appender (Ekleyici):<\/strong> Log mesajlar\u0131n\u0131n nereye yaz\u0131laca\u011f\u0131n\u0131 (konsol, dosya, veritaban\u0131, uzak sunucu vb.) belirleyen bile\u015fendir. Bir logger birden fazla appender&#8217;a ba\u011fl\u0131 olabilir. \u00d6rne\u011fin, ERROR seviyesindeki loglar\u0131 hem bir dosyaya hem de bir e-posta adresine g\u00f6nderebilirsiniz. Yayg\u0131n appender t\u00fcrleri aras\u0131nda ConsoleAppender, FileAppender, RollingFileAppender, SMTPAppender say\u0131labilir.<\/li>\n<li><strong>Layout\/Encoder (D\u00fczenleyici\/Kodlay\u0131c\u0131):<\/strong> Log mesajlar\u0131n\u0131n format\u0131n\u0131 belirler. Log mesajlar\u0131n\u0131n nas\u0131l g\u00f6r\u00fcnece\u011fini (tarih, saat, seviye, logger ad\u0131, mesaj\u0131n kendisi, thread bilgisi vb. gibi hangi bilgilerin hangi s\u0131rada yer alaca\u011f\u0131) kontrol eder. Desen tabanl\u0131 formatlar (PatternLayout) veya JSON, XML gibi yap\u0131land\u0131r\u0131lm\u0131\u015f formatlar kullan\u0131labilir.<\/li>\n<\/ul>\n<p>Bu bile\u015fenler bir araya gelerek, Java uygulaman\u0131z\u0131n loglama davran\u0131\u015f\u0131n\u0131 tamamen \u00f6zelle\u015ftirmenize olanak tan\u0131r. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda konsola DEBUG seviyesinde loglar yazd\u0131r\u0131rken, \u00fcretimde bir dosyaya INFO seviyesinde loglar yazd\u0131r\u0131p, ERROR ve FATAL seviyesindeki loglar\u0131 merkezi bir log toplama sistemine g\u00f6nderebilirsiniz. Bu esneklik, her ortam\u0131n ihtiya\u00e7lar\u0131na g\u00f6re loglama stratejisini optimize etmenin anahtar\u0131d\u0131r. Loglama bile\u015fenlerini anlamak, k\u00fct\u00fcphane se\u00e7imi ve konfig\u00fcrasyon s\u00fcre\u00e7lerinde size yol g\u00f6sterecektir.<\/p>\n<h2>Hangi Java Loglama K\u00fct\u00fcphanesini Se\u00e7meliyim? Log4j2, Logback ve java.util.logging Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h2>\n<p>Java ekosisteminde birden fazla loglama k\u00fct\u00fcphanesi bulunmaktad\u0131r ve her birinin kendine g\u00f6re avantajlar\u0131 ve kullan\u0131m alanlar\u0131 mevcuttur. En pop\u00fcler \u00fc\u00e7 tanesi \u015funlard\u0131r: <strong>Log4j2<\/strong>, <strong>Logback<\/strong> ve <strong>java.util.logging (JUL)<\/strong>. Do\u011fru k\u00fct\u00fcphaneyi se\u00e7mek, projenizin ihtiya\u00e7lar\u0131na, performans beklentilerine ve y\u00f6netim kolayl\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<h3>java.util.logging (JUL): Yerle\u015fik \u00c7\u00f6z\u00fcm\u00fcn S\u0131n\u0131rlar\u0131<\/h3>\n<p>Java Development Kit (JDK) ile birlikte gelen <code>java.util.logging<\/code>, herhangi bir \u00fc\u00e7\u00fcnc\u00fc taraf ba\u011f\u0131ml\u0131l\u0131k gerektirmeyen yerle\u015fik bir loglama \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. Basit projeler veya d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131k eklemek istemedi\u011finiz durumlar i\u00e7in yeterli olabilir. Ancak, di\u011fer k\u00fct\u00fcphanelere k\u0131yasla genellikle daha az esneklik ve performans sunar. Konfig\u00fcrasyonu genellikle <code>logging.properties<\/code> dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r ve dinamik konfig\u00fcrasyon de\u011fi\u015fiklikleri daha k\u0131s\u0131tl\u0131d\u0131r. \u00d6zellikleri aras\u0131nda Logger, Handler (Appender kar\u015f\u0131l\u0131\u011f\u0131), Formatter (Layout kar\u015f\u0131l\u0131\u011f\u0131) bulunur. \u00d6zellikle mikroservisler veya y\u00fcksek performans gerektiren kurumsal uygulamalar i\u00e7in yetersiz kalabilir.<\/p>\n<pre><code class=\"language-java\">\nimport java.util.logging.Logger;\nimport java.util.logging.Level;\n\npublic class MyJulApp {\n    private static final Logger logger = Logger.getLogger(MyJulApp.class.getName());\n\n    public static void main(String[] args) {\n        logger.log(Level.INFO, \"Uygulama ba\u015flat\u0131l\u0131yor...\");\n        try {\n            int result = 10 \/ 0; \/\/ Hata sim\u00fclasyonu\n        } catch (ArithmeticException e) {\n            logger.log(Level.SEVERE, \"S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu: \" + e.getMessage(), e);\n        }\n        logger.log(Level.INFO, \"Uygulama sonland\u0131r\u0131l\u0131yor.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Logback: Modern ve Esnek Loglama \u00c7\u00f6z\u00fcm\u00fc<\/h3>\n<p>Logback, pop\u00fcler Log4j projesinin yarat\u0131c\u0131s\u0131 Ceki G\u00fclc\u00fc taraf\u0131ndan geli\u015ftirilmi\u015ftir ve Log4j'nin halefi olarak g\u00f6r\u00fcl\u00fcr. Performans, esneklik ve zengin \u00f6zellik seti sunar. \u00d6zellikle Log4j'ye g\u00f6re daha h\u0131zl\u0131 oldu\u011fu ve daha az bellek t\u00fcketti\u011fi iddia edilir. XML veya Groovy tabanl\u0131 konfig\u00fcrasyonu sayesinde dinamik konfig\u00fcrasyon de\u011fi\u015fikliklerini uygulama yeniden ba\u015flat\u0131lmadan yapmaya olanak tan\u0131r. Otomatik dosya ar\u015fivleme (rolling files), filtreleme ve e\u015fzamans\u0131z (asynchronous) loglama gibi geli\u015fmi\u015f \u00f6zelliklere sahiptir. Spring Boot gibi modern framework'ler varsay\u0131lan olarak Logback'i tercih eder.<\/p>\n<pre><code class=\"language-xml\">\n<!-- logback.xml \u00f6rne\u011fi -->\n<configuration>\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>logs\/myapp.log<\/file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!-- G\u00fcnl\u00fck log dosyalar\u0131 olu\u015fturulacak ve 30 g\u00fcn boyunca saklanacak -->\n            <fileNamePattern>logs\/myapp.%d{yyyy-MM-dd}.log<\/fileNamePattern>\n            <maxHistory>30<\/maxHistory>\n        <\/rollingPolicy>\n        <encoder>\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <root level=\"info\">\n        <appender-ref ref=\"CONSOLE\" \/>\n        <appender-ref ref=\"FILE\" \/>\n    <\/root>\n<\/configuration>\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-java\"><\/pre>\n<p><\/code><br \/>\nimport org.slf4j.Logger;<br \/>\nimport org.slf4j.LoggerFactory;<\/p>\n<p>public class MyLogbackApp {<br \/>\n    private static final Logger logger = LoggerFactory.getLogger(MyLogbackApp.class);<\/p>\n<p>    public static void main(String[] args) {<br \/>\n        logger.info(\"Uygulama ba\u015flat\u0131l\u0131yor Logback ile...\");<br \/>\n        try {<br \/>\n            int result = 10 \/ 0;<br \/>\n        } catch (ArithmeticException e) {<br \/>\n            logger.error(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu: {}\", e.getMessage(), e);<br \/>\n        }<br \/>\n        logger.info(\"Uygulama sonland\u0131r\u0131l\u0131yor.\");<br \/>\n    }<br \/>\n}<br \/>\n<\/code><\/p>\n<h3>Log4j2: Y\u00fcksek Performansl\u0131 ve Geni\u015fletilebilir Loglama<\/h3>\n<p>Log4j2, Log4j'nin tamamen yeniden tasarlanm\u0131\u015f ve geli\u015ftirilmi\u015f bir versiyonudur. \u00d6nceki versiyonu Log4j 1.x'in (veya Logback'in bile) kar\u015f\u0131la\u015ft\u0131\u011f\u0131 baz\u0131 performans ve esneklik sorunlar\u0131n\u0131 gidermek \u00fczere tasarlanm\u0131\u015ft\u0131r. \u00d6zellikle e\u015fzamans\u0131z loglama (asynchronous logging) konusunda \u00fcst\u00fcn performans sunar ve kilitlenmeyen (lock-free) mimarisi sayesinde y\u00fcksek y\u00fck alt\u0131ndaki uygulamalarda bile \u00e7ok d\u00fc\u015f\u00fck gecikmeyle \u00e7al\u0131\u015fabilir. Mod\u00fcler yap\u0131s\u0131, eklentilerle kolayca geni\u015fletilebilir olmas\u0131 ve XML, JSON, YAML gibi farkl\u0131 konfig\u00fcrasyon formatlar\u0131n\u0131 desteklemesi onu cazip k\u0131lar. Geni\u015fletilebilir filter sistemi, Property Substitution gibi g\u00fc\u00e7l\u00fc \u00f6zelliklere sahiptir. Kurumsal d\u00fczeydeki b\u00fcy\u00fck \u00f6l\u00e7ekli ve y\u00fcksek performans gerektiren uygulamalar i\u00e7in s\u0131k\u00e7a tercih edilir.<\/p>\n<pre><code class=\"language-xml\">\n<!-- log4j2.xml \u00f6rne\u011fi -->\n<Configuration status=\"WARN\">\n    <Appenders>\n        <Console name=\"ConsoleAppender\" target=\"SYSTEM_OUT\">\n            <PatternLayout pattern=\"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n\"\/>\n        <\/Console>\n        <RollingFile name=\"FileAppender\" fileName=\"logs\/myapp.log\"\n                     filePattern=\"logs\/myapp-%d{yyyy-MM-dd}.log\">\n            <PatternLayout pattern=\"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n\"\/>\n            <Policies>\n                <TimeBasedTriggeringPolicy interval=\"1\" modulate=\"true\"\/>\n            <\/Policies>\n            <DefaultRolloverStrategy max=\"30\"\/>\n        <\/RollingFile>\n    <\/Appenders>\n    <Loggers>\n        <Root level=\"info\">\n            <AppenderRef ref=\"ConsoleAppender\"\/>\n            <AppenderRef ref=\"FileAppender\"\/>\n        <\/Root>\n    <\/Loggers>\n<\/Configuration>\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-java\"><\/pre>\n<p><\/code><br \/>\nimport org.apache.logging.log4j.LogManager;<br \/>\nimport org.apache.logging.log4j.Logger;<\/p>\n<p>public class MyLog4j2App {<br \/>\n    private static final Logger logger = LogManager.getLogger(MyLog4j2App.class);<\/p>\n<p>    public static void main(String[] args) {<br \/>\n        logger.info(\"Uygulama ba\u015flat\u0131l\u0131yor Log4j2 ile...\");<br \/>\n        try {<br \/>\n            int result = 10 \/ 0;<br \/>\n        } catch (ArithmeticException e) {<br \/>\n            logger.error(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu: {}\", e.getMessage(), e);<br \/>\n        }<br \/>\n        logger.info(\"Uygulama sonland\u0131r\u0131l\u0131yor.\");<br \/>\n    }<br \/>\n}<br \/>\n<\/code><\/p>\n<p><strong>Peki, hangisini se\u00e7melisiniz?<\/strong><\/p>\n<ul>\n<li><strong>K\u00fc\u00e7\u00fck ve Basit Projeler:<\/strong> JUL yeterli olabilir, ancak esneklik ve \u00f6zellik a\u00e7\u0131s\u0131ndan k\u0131s\u0131tl\u0131d\u0131r.<\/li>\n<li><strong>Orta ve B\u00fcy\u00fck \u00d6l\u00e7ekli Projeler, Spring Boot Kullananlar:<\/strong> Logback genellikle iyi bir se\u00e7imdir. Performans\u0131 iyi, esnek ve geni\u015f topluluk deste\u011fi var.<\/li>\n<li><strong>Y\u00fcksek Performans, \u00c7ok Kanall\u0131 Loglama, Geni\u015fletilebilirlik Gerektiren Kurumsal Uygulamalar:<\/strong> Log4j2, sundu\u011fu geli\u015fmi\u015f \u00f6zellikler ve \u00fcst\u00fcn performans ile \u00f6ne \u00e7\u0131kar.<\/li>\n<\/ul>\n<p>Modern Java uygulamalar\u0131nda, genellikle <strong>SLF4J (Simple Logging Facade for Java)<\/strong> ad\u0131 verilen bir cephe (facade) k\u00fct\u00fcphanesi ile birlikte Logback veya Log4j2 kullan\u0131l\u0131r. SLF4J, kodunuzu belirli bir loglama k\u00fct\u00fcphanesine ba\u011f\u0131ml\u0131 k\u0131lmaktan kurtar\u0131r. Bu sayede, daha sonra altta yatan loglama implementasyonunu kolayca de\u011fi\u015ftirebilirsiniz. Bu da k\u00fct\u00fcphane se\u00e7iminizi daha esnek hale getirir.<\/p>\n<div class=\"interactive-tip\">\n  Uzman \u0130pucu: K\u00fct\u00fcphane se\u00e7iminiz ne olursa olsun, uygulama kodunuzda her zaman SLF4J gibi bir facade kullanarak altta yatan implementasyondan ba\u011f\u0131ms\u0131z olun. Bu, gelecekte k\u00fct\u00fcphane de\u011fi\u015ftirme esnekli\u011fi sa\u011flar ve kodunuzu daha mod\u00fcler hale getirir.\n<\/div>\n<h2>Etkili Loglama Nas\u0131l Yap\u0131l\u0131r? Uygulamal\u0131 \u00d6rnekler ve En \u0130yi Pratikler<\/h2>\n<p>Loglama k\u00fct\u00fcphanenizi se\u00e7tikten ve temel konfig\u00fcrasyonu yapt\u0131ktan sonra s\u0131ra, loglar\u0131 uygulaman\u0131za do\u011fru bir \u015fekilde entegre etmeye gelir. Etkili loglama sadece \"yazd\u0131r gitsin\" demek de\u011fildir; ayn\u0131 zamanda neyi, ne zaman ve nas\u0131l loglad\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcnmeyi gerektirir. Ama\u00e7, hem yeterli bilgi sa\u011flamak hem de log dosyalar\u0131n\u0131 gereksiz g\u00fcr\u00fclt\u00fcden ar\u0131nd\u0131rmakt\u0131r.<\/p>\n<h3>Ne Zaman Loglamal\u0131y\u0131z ve Ne T\u00fcr Bilgiler Kaydetmeliyiz?<\/h3>\n<p>Do\u011fru zamanda do\u011fru bilgiyi loglamak, sorun giderme s\u00fcrecini h\u0131zland\u0131ran ve sistem izlemeyi kolayla\u015ft\u0131ran kilit noktad\u0131r. \u0130\u015fte baz\u0131 senaryolar ve loglanmas\u0131 gereken bilgiler:<\/p>\n<ul>\n<li><strong>Uygulama Ba\u015flang\u0131\u00e7\/Biti\u015f Noktalar\u0131:<\/strong> Uygulaman\u0131n ne zaman ba\u015flat\u0131ld\u0131\u011f\u0131n\u0131 veya durduruldu\u011funu INFO seviyesinde loglay\u0131n. Versiyon bilgisi, kullan\u0131lan konfig\u00fcrasyon dosyalar\u0131 gibi genel bilgiler de eklenebilir.<\/li>\n<li><strong>\u00d6nemli \u0130\u015f Ak\u0131\u015f Ad\u0131mlar\u0131:<\/strong> Bir kullan\u0131c\u0131n\u0131n sipari\u015f vermesi, bir \u00f6demenin onaylanmas\u0131, bir raporun olu\u015fturulmas\u0131 gibi uygulaman\u0131n kritik i\u015f s\u00fcre\u00e7lerinin ba\u015flang\u0131\u00e7 ve biti\u015fini INFO seviyesinde kaydedin. Bu, i\u015f s\u00fcre\u00e7lerinin takibini sa\u011flar.<\/li>\n<li><strong>Harici Servis \u00c7a\u011fr\u0131lar\u0131:<\/strong> Veritaban\u0131, REST API'leri, mesaj kuyruklar\u0131 gibi harici sistemlere yap\u0131lan \u00e7a\u011fr\u0131lar\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131, gecikmelerini veya ba\u015far\u0131s\u0131zl\u0131klar\u0131n\u0131 DEBUG\/INFO seviyesinde loglay\u0131n. Giden ve gelen istek\/cevap payload'lar\u0131n\u0131n DEBUG seviyesinde loglanmas\u0131, entegrasyon sorunlar\u0131n\u0131 tespit etmede \u00e7ok yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong>Hata ve \u0130stisna Y\u00f6netimi:<\/strong> Uygulaman\u0131n beklenmedik durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda f\u0131rlatt\u0131\u011f\u0131 t\u00fcm istisnalar\u0131 ve hatalar\u0131 ERROR\/FATAL seviyesinde mutlaka loglay\u0131n. Stack trace bilgisini de eklemeyi unutmay\u0131n. Bu, hatan\u0131n nerede ve neden olu\u015ftu\u011funu anlamak i\u00e7in temel bilgidir.<\/li>\n<li><strong>G\u00fcvenlik Denetimi:<\/strong> Kullan\u0131c\u0131 giri\u015f denemeleri (ba\u015far\u0131l\u0131\/ba\u015far\u0131s\u0131z), yetkilendirme hatalar\u0131, hassas verilere eri\u015fim denemeleri gibi g\u00fcvenlik ile ilgili olaylar\u0131 INFO\/WARN seviyesinde kaydedin. Bu loglar, g\u00fcvenlik ihlallerini tespit etmek ve denetim izi olu\u015fturmak i\u00e7in gereklidir.<\/li>\n<li><strong>Performans \u0130zleme:<\/strong> Kritik kod bloklar\u0131n\u0131n veya metodlar\u0131n y\u00fcr\u00fctme s\u00fcrelerini DEBUG\/INFO seviyesinde loglayarak performans darbo\u011fazlar\u0131n\u0131 tespit edebilirsiniz. Bu genellikle belirli bir mod\u00fcl i\u00e7in performans testi yap\u0131ld\u0131\u011f\u0131nda etkinle\u015ftirilir.<\/li>\n<li><strong>Konfig\u00fcrasyon De\u011fi\u015fiklikleri:<\/strong> Uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 etkileyen konfig\u00fcrasyon de\u011fi\u015fikliklerinin ne zaman ve kim taraf\u0131ndan yap\u0131ld\u0131\u011f\u0131n\u0131 loglamak, potansiyel sorunlar\u0131n kayna\u011f\u0131n\u0131 bulmada yard\u0131mc\u0131 olabilir.<\/li>\n<\/ul>\n<p><strong>Ne T\u00fcr Bilgileri Kaydetmemelisiniz?<\/strong><\/p>\n<p>Hassas verileri (parolalar, kredi kart\u0131 numaralar\u0131, ki\u015fisel kimlik bilgileri vb.) asla loglamay\u0131n! Bu, ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir ve GDPR, KVKK gibi veri gizlili\u011fi d\u00fczenlemelerine ayk\u0131r\u0131d\u0131r. E\u011fer ger\u00e7ekten bir hata ay\u0131klama durumunda bu verilere ihtiyac\u0131n\u0131z varsa, loglama seviyesini ge\u00e7ici olarak y\u00fckseltin ve i\u015flemi tamamlad\u0131ktan sonra seviyeyi normale d\u00f6nd\u00fcr\u00fcn.<\/p>\n<h3>Log Formatlama: Okunabilir ve Anla\u015f\u0131l\u0131r Loglar Yaratmak<\/h3>\n<p>Log mesajlar\u0131n\u0131z\u0131n i\u00e7eri\u011fi kadar, onlar\u0131n okunabilir ve analiz edilebilir olmas\u0131 da \u00f6nemlidir. \u0130yi formatlanm\u0131\u015f loglar, sorun giderme ve izleme s\u00fcre\u00e7lerini \u00e7ok daha verimli hale getirir. Genellikle bir log mesaj\u0131nda bulunmas\u0131 gereken temel bilgiler \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Tarih ve Saat:<\/strong> Olay\u0131n ne zaman ger\u00e7ekle\u015fti\u011fini g\u00f6sterir (\u00f6rn: <code>2023-10-27 10:30:00.123<\/code>).<\/li>\n<li><strong>Log Seviyesi:<\/strong> Mesaj\u0131n \u00f6nem derecesi (\u00f6rn: <code>INFO<\/code>, <code>ERROR<\/code>).<\/li>\n<li><strong>Thread Ad\u0131:<\/strong> Hangi i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n bu logu \u00fcretti\u011fi (\u00f6rn: <code>[http-nio-8080-exec-5]<\/code>). \u00d6zellikle paralel \u00e7al\u0131\u015fan sistemlerde \u00e7ok \u00f6nemlidir.<\/li>\n<li><strong>Logger Ad\u0131:<\/strong> Logu \u00fcreten s\u0131n\u0131f\u0131n ad\u0131 (\u00f6rn: <code>com.example.UserService<\/code>).<\/li>\n<li><strong>Mesaj:<\/strong> Loglanan olay\u0131n a\u00e7\u0131klamas\u0131.<\/li>\n<li><strong>\u0130stisna Detaylar\u0131:<\/strong> E\u011fer bir hata loglan\u0131yorsa, stack trace bilgisi.<\/li>\n<\/ul>\n<p>Bir \u00f6rnek Log4j2 PatternLayout deseni \u015fu \u015fekilde olabilir:<\/p>\n<pre><code class=\"language-xml\">\n<PatternLayout pattern=\"%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%throwable\"\/>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu desen a\u015fa\u011f\u0131daki gibi bir \u00e7\u0131kt\u0131 \u00fcretebilir:<\/p>\n<pre><code>\n2023-10-27 10:30:00.123 [main] INFO  c.e.MyLog4j2App - Uygulama ba\u015flat\u0131l\u0131yor Log4j2 ile...\n2023-10-27 10:30:00.125 [main] ERROR c.e.MyLog4j2App - S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu: \/ by zero\njava.lang.ArithmeticException: \/ by zero\n\tat com.example.MyLog4j2App.main(MyLog4j2App.java:12)\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Yap\u0131land\u0131r\u0131lm\u0131\u015f Loglama (Structured Logging):<\/strong> Son y\u0131llarda pop\u00fclaritesi artan bir di\u011fer trend ise yap\u0131land\u0131r\u0131lm\u0131\u015f loglamad\u0131r. Bu yakla\u015f\u0131mda, log mesajlar\u0131 d\u00fcz metin yerine JSON veya XML gibi makine taraf\u0131ndan kolayca ayr\u0131\u015ft\u0131r\u0131labilen bir formatta \u00fcretilir. Bu, loglar\u0131 merkezi log y\u00f6netimi sistemlerinde (ELK Stack, Splunk vb.) daha kolay analiz etmeye, filtrelemeye ve g\u00f6rselle\u015ftirmeye olanak tan\u0131r. \u00d6rne\u011fin, bir i\u015flem ID'si, kullan\u0131c\u0131 ID'si, i\u015flem s\u00fcresi gibi anahtar-de\u011fer \u00e7iftlerini loga ekleyebilirsiniz.<\/p>\n<pre><code class=\"language-json\">\n{\"timestamp\": \"2023-10-27T10:30:00.123Z\", \"level\": \"INFO\", \"thread\": \"main\", \"logger\": \"com.example.MyService\", \"message\": \"Kullan\u0131c\u0131 kayd\u0131 ba\u015far\u0131l\u0131\", \"userId\": \"user123\", \"operationId\": \"op456\"}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve da\u011f\u0131t\u0131k sistemlerde log analizini \u00e7ok daha g\u00fc\u00e7l\u00fc hale getirir. Geli\u015fmi\u015f loglama k\u00fct\u00fcphaneleri (Log4j2, Logback) bu t\u00fcr formatlar\u0131 destekleyen layout veya encoder'lar sunar.<\/p>\n<p>Log mesajlar\u0131n\u0131 yazarken, anla\u015f\u0131l\u0131r ve a\u00e7\u0131klay\u0131c\u0131 ifadeler kullanmaya \u00f6zen g\u00f6sterin. \"Hata olu\u015ftu\" yerine \"Kullan\u0131c\u0131 kayd\u0131 s\u0131ras\u0131nda veritaban\u0131na eri\u015fim hatas\u0131 olu\u015ftu: ba\u011flant\u0131 zaman a\u015f\u0131m\u0131na u\u011frad\u0131\" gibi daha spesifik ifadeler kullanmak, sorunun k\u00f6k nedenini h\u0131zl\u0131ca bulman\u0131za yard\u0131mc\u0131 olur. Her zaman parametreli loglamay\u0131 tercih edin (\u00f6rn: <code>logger.info(\"Kullan\u0131c\u0131 {} ba\u015far\u0131yla giri\u015f yapt\u0131.\", userId);<\/code>) \u00e7\u00fcnk\u00fc bu, gereksiz String birle\u015ftirme i\u015flemlerini \u00f6nleyerek performans\u0131 art\u0131r\u0131r ve sadece log seviyesi aktifse parametrelerin de\u011ferlendirilmesini sa\u011flar.<\/p>\n<h2>\u0130leri D\u00fczey Loglama Teknikleri: Performans ve Geli\u015fmi\u015f Tan\u0131lama \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p>Loglama, sadece temel seviyede mesajlar\u0131 bir yere yazmaktan ibaret de\u011fildir. \u00d6zellikle y\u00fcksek performansl\u0131 veya karma\u015f\u0131k Java uygulamalar\u0131nda, loglama stratejilerinizi optimize etmek ve geli\u015fmi\u015f teknikler kullanmak b\u00fcy\u00fck fark yaratabilir. Bu b\u00f6l\u00fcmde, uygulaman\u0131z\u0131n performans\u0131n\u0131 etkilemeden daha zengin loglar elde etmenizi sa\u011flayacak baz\u0131 ileri d\u00fczey tekniklere de\u011finece\u011fiz.<\/p>\n<h3>Asenkron Loglama ile Performans Art\u0131\u015f\u0131 Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Geleneksel olarak, bir log mesaj\u0131 \u00fcretildi\u011finde, bu mesaj\u0131n bir dosyaya yaz\u0131lmas\u0131 veya konsola bas\u0131lmas\u0131 gibi I\/O i\u015flemleri senkron (e\u015fzamanl\u0131) olarak ger\u00e7ekle\u015fir. Bu, \u00f6zellikle yo\u011fun loglama yap\u0131lan veya disk I\/O'sunun yava\u015f oldu\u011fu durumlarda uygulaman\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (thread) bloklayarak performans darbo\u011fazlar\u0131na neden olabilir. \u0130\u015fte bu noktada <strong>asenkron loglama<\/strong> devreye girer.<\/p>\n<p>Asenkron loglama, log mesajlar\u0131n\u0131n ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131 veya bir kuyruk (queue) arac\u0131l\u0131\u011f\u0131yla i\u015flenmesini sa\u011flar. Uygulaman\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131, log mesaj\u0131n\u0131 kuyru\u011fa atar ve hemen bir sonraki i\u015fine devam eder. B\u00f6ylece, log yazma i\u015fleminin gecikmesi ana uygulama mant\u0131\u011f\u0131n\u0131 etkilemez. Log4j2, bu konuda \u00f6zellikle ba\u015far\u0131l\u0131d\u0131r ve kilitlenmeyen (lock-free) veri yap\u0131lar\u0131 kullanarak y\u00fcksek performansl\u0131 asenkron loglama sunar. Log4j2'de bunu yap\u0131land\u0131rmak i\u00e7in iki ana y\u00f6ntem vard\u0131r:<\/p>\n<ol>\n<li><strong>Async Loggers:<\/strong> T\u00fcm logger'lar\u0131 asenkron hale getirir. Bu, en y\u00fcksek performans\u0131 sa\u011flar ancak t\u00fcm loglama i\u015flemleri ayr\u0131 bir thread havuzunda ger\u00e7ekle\u015fir. Konfig\u00fcrasyon dosyan\u0131z\u0131n en \u00fcst\u00fcne <code><Configuration status=\"WARN\" packages=\"org.apache.logging.log4j.core.async\"><\/code> ekleyerek ve t\u00fcm logger'lar\u0131n\u0131z\u0131 async olarak tan\u0131mlayarak bunu yapabilirsiniz.<\/li>\n<li><strong>Async Appenders:<\/strong> Belirli appender'lar\u0131 asenkron yapar. Sadece se\u00e7ti\u011finiz appender'lar i\u00e7in asenkron davran\u0131\u015f isterseniz bu y\u00f6ntemi kullanabilirsiniz. Di\u011fer appender'lar senkron kal\u0131r.<\/li>\n<\/ol>\n<pre><code class=\"language-xml\">\n<!-- Log4j2 i\u00e7in Async Appender \u00f6rne\u011fi -->\n<Configuration status=\"WARN\">\n    <Appenders>\n        <Async name=\"AsyncFileAppender\">\n            <AppenderRef ref=\"FileAppender\"\/>\n            <!-- Kuyruk boyutu, varsay\u0131lan 1024 -->\n            <QueueSize>512<\/QueueSize>\n        <\/Async>\n        <RollingFile name=\"FileAppender\" fileName=\"logs\/myapp.log\"\n                     filePattern=\"logs\/myapp-%d{yyyy-MM-dd}.log\">\n            <PatternLayout pattern=\"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n\"\/>\n            <Policies>\n                <TimeBasedTriggeringPolicy interval=\"1\" modulate=\"true\"\/>\n            <\/Policies>\n        <\/RollingFile>\n    <\/Appenders>\n    <Loggers>\n        <Root level=\"info\">\n            <AppenderRef ref=\"AsyncFileAppender\"\/>\n        <\/Root>\n    <\/Loggers>\n<\/Configuration>\n<\/pre>\n<p><\/code><\/p>\n<p>Logback de asenkron loglama i\u00e7in <code>AsyncAppender<\/code> sunar. Bu, \u00f6zellikle yo\u011fun trafik alan uygulamalarda CPU ve I\/O kaynaklar\u0131n\u0131 daha verimli kullanman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Yap\u0131land\u0131r\u0131lm\u0131\u015f Loglama ve MDC Kullan\u0131m\u0131<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, <strong>yap\u0131land\u0131r\u0131lm\u0131\u015f loglama<\/strong>, loglar\u0131 makine taraf\u0131ndan okunabilir bir formatta (\u00f6rn: JSON) \u00fcretmek anlam\u0131na gelir. Bu, loglar\u0131 otomatik olarak ayr\u0131\u015ft\u0131rmak, filtrelemek ve analiz etmek i\u00e7in hayati \u00f6neme sahiptir. Log4j2 ve Logback gibi k\u00fct\u00fcphaneler, JSONLayout veya JsonEncoder gibi bile\u015fenlerle yap\u0131land\u0131r\u0131lm\u0131\u015f loglamay\u0131 kolayca destekler. Bu sayede, i\u015flem ID'si, kullan\u0131c\u0131 ID'si, oturum ID'si gibi \u00f6zel anahtar-de\u011fer \u00e7iftlerini loglar\u0131n\u0131za ekleyebilir ve log analiz ara\u00e7lar\u0131nda daha zengin sorgular \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-xml\">\n<!-- Log4j2 i\u00e7in JSONLayout \u00f6rne\u011fi -->\n<Appenders>\n    <Console name=\"JsonConsole\" target=\"SYSTEM_OUT\">\n        <JsonTemplateLayout eventTemplateUri=\"classpath:Log4j2JsonLayout.json\"\/>\n        <!-- Veya basit bir JsonLayout -->\n        <!-- <JsonLayout compact=\"true\" eventEol=\"true\" includeStacktrace=\"true\"\/> -->\n    <\/Console>\n<\/Appenders>\n<\/pre>\n<p><\/code><\/p>\n<p><strong>MDC (Mapped Diagnostic Context)<\/strong> ise, \u00f6zellikle \u00e7ok i\u015f par\u00e7ac\u0131kl\u0131 (multi-threaded) ve da\u011f\u0131t\u0131k sistemlerde loglar\u0131 daha anlaml\u0131 hale getiren g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. Bir web iste\u011fi veya bir arka plan g\u00f6revi gibi belirli bir i\u015flemin t\u00fcm log mesajlar\u0131n\u0131 birbiriyle ili\u015fkilendirmek istedi\u011finizde MDC kullan\u0131\u015fl\u0131d\u0131r. MDC, mevcut i\u015f par\u00e7ac\u0131\u011f\u0131na \u00f6zg\u00fc (thread-local) bir harita (Map) tutar ve bu haritaya koydu\u011funuz de\u011ferleri, o i\u015f par\u00e7ac\u0131\u011f\u0131 taraf\u0131ndan \u00fcretilen t\u00fcm log mesajlar\u0131na otomatik olarak eklenmesini sa\u011flar.<\/p>\n<pre><code class=\"language-java\">\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.slf4j.MDC;\n\npublic class MyMDCApp {\n    private static final Logger logger = LoggerFactory.getLogger(MyMDCApp.class);\n\n    public void processRequest(String userId, String transactionId) {\n        MDC.put(\"userId\", userId); \/\/ userId'yi MDC'ye ekle\n        MDC.put(\"transactionId\", transactionId); \/\/ transactionId'yi MDC'ye ekle\n\n        try {\n            logger.info(\"Kullan\u0131c\u0131 iste\u011fi i\u015fleniyor.\");\n            \/\/ ... i\u015f mant\u0131\u011f\u0131 ...\n            logger.debug(\"Veritaban\u0131 i\u015flemi tamamland\u0131.\");\n            \/\/ ...\n            logger.info(\"Kullan\u0131c\u0131 iste\u011fi ba\u015far\u0131yla tamamland\u0131.\");\n        } finally {\n            MDC.remove(\"userId\"); \/\/ \u0130\u015flem bitince MDC'den kald\u0131r\n            MDC.remove(\"transactionId\"); \/\/ \u0130\u015flem bitince MDC'den kald\u0131r\n        }\n    }\n\n    public static void main(String[] args) {\n        MyMDCApp app = new MyMDCApp();\n        app.processRequest(\"user123\", \"txnABC\");\n        \/\/ Farkl\u0131 bir thread veya ayn\u0131 thread'de ba\u015fka bir i\u015flem\n        app.processRequest(\"user456\", \"txnDEF\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Log format\u0131n\u0131za <code>%X{userId}<\/code> veya <code>%X{transactionId}<\/code> gibi MDC de\u011fi\u015fkenlerini ekleyerek bu de\u011ferleri log mesajlar\u0131n\u0131zda g\u00f6rebilirsiniz. Bu sayede, belirli bir kullan\u0131c\u0131n\u0131n veya i\u015flemin t\u00fcm ad\u0131mlar\u0131n\u0131 i\u00e7eren loglar\u0131 kolayca filtreleyebilir ve takip edebilirsiniz. \u00d6zellikle mikroservis mimarilerinde distributed tracing (da\u011f\u0131t\u0131k izleme) i\u00e7in \u00e7ok \u00f6nemli bir ara\u00e7t\u0131r.<\/p>\n<div class=\"interactive-tip\">\n  Uzman \u0130pucu: MDC kullan\u0131rken, her i\u015flemin sonunda (genellikle bir <code>finally<\/code> blo\u011funda) MDC'ye ekledi\u011finiz de\u011ferleri temizlemeyi unutmay\u0131n. Aksi takdirde, thread havuzlar\u0131 kullan\u0131l\u0131rken \u00f6nceki i\u015flemin MDC de\u011ferleri sonraki i\u015flemlere s\u0131zabilir ve yanl\u0131\u015f bilgilere yol a\u00e7abilir.\n<\/div>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Log Y\u00f6netimi ve Analizi: Vaka \u00c7al\u0131\u015fmalar\u0131<\/h2>\n<p>Loglama stratejinizin en \u00f6nemli par\u00e7alar\u0131ndan biri, \u00fcretilen loglar\u0131n nas\u0131l y\u00f6netilece\u011fi ve analiz edilece\u011fidir. Uygulaman\u0131z ne kadar iyi log \u00fcretirse \u00fcretsin, bu loglar\u0131 anlaml\u0131 bilgilere d\u00f6n\u00fc\u015ft\u00fcrecek bir sisteminiz yoksa, \u00e7aban\u0131z bo\u015fa gidebilir. \u00d6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve da\u011f\u0131t\u0131k sistemlerde, loglar\u0131 merkezi bir noktada toplamak ve analiz etmek kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, log y\u00f6netimi ve analizi i\u00e7in kullan\u0131lan yayg\u0131n yakla\u015f\u0131mlar\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>Merkezi Log Toplama ve ELK Stack\/Splunk Kullan\u0131m\u0131<\/h3>\n<p>Tek bir sunucuda \u00e7al\u0131\u015fan k\u00fc\u00e7\u00fck bir uygulama i\u00e7in log dosyalar\u0131n\u0131 SSH ile ba\u011flan\u0131p okumak yeterli olabilir. Ancak birden fazla sunucuya da\u011f\u0131lm\u0131\u015f, onlarca veya y\u00fczlerce servisten olu\u015fan bir sistemde her bir sunucunun loglar\u0131n\u0131 tek tek kontrol etmek imkans\u0131zd\u0131r. \u0130\u015fte bu noktada <strong>merkezi log toplama sistemleri<\/strong> devreye girer. Bu sistemler, farkl\u0131 kaynaklardan (sunucular, uygulamalar, a\u011f cihazlar\u0131 vb.) loglar\u0131 toplar, indeksler, depolalar ve analiz i\u00e7in uygun hale getirir.<\/p>\n<p>En pop\u00fcler a\u00e7\u0131k kaynakl\u0131 \u00e7\u00f6z\u00fcmlerden biri <strong>ELK Stack<\/strong>'tir. ELK, \u00fc\u00e7 ana bile\u015fenin ba\u015f harflerinden olu\u015fur:<\/p>\n<ol>\n<li><strong>Elasticsearch:<\/strong> Log verilerini depolayan, indeksleyen ve h\u0131zl\u0131 arama yap\u0131lmas\u0131n\u0131 sa\u011flayan da\u011f\u0131t\u0131k bir arama motorudur. Yap\u0131land\u0131r\u0131lm\u0131\u015f loglaman\u0131n burada ne kadar \u00f6nemli oldu\u011fu bir kez daha ortaya \u00e7\u0131kar, \u00e7\u00fcnk\u00fc JSON loglar Elasticsearch taraf\u0131ndan kolayca indekslenebilir.<\/li>\n<li><strong>Logstash:<\/strong> Farkl\u0131 kaynaklardan (dosyalar, veritabanlar\u0131, mesaj kuyruklar\u0131) loglar\u0131 toplayan, i\u015fleyen (parse eden, filtreleyen, d\u00f6n\u00fc\u015ft\u00fcren) ve Elasticsearch'e g\u00f6nderen bir veri i\u015fleme pipeline'\u0131d\u0131r.<\/li>\n<li><strong>Kibana:<\/strong> Elasticsearch'teki verileri g\u00f6rselle\u015ftirmek, grafikler, panolar (dashboards) olu\u015fturmak ve etkile\u015fimli olarak aramak i\u00e7in kullan\u0131lan bir aray\u00fczd\u00fcr.<\/li>\n<\/ol>\n<p>ELK Stack ile uygulaman\u0131zdan gelen t\u00fcm loglar\u0131 tek bir noktada toplayabilir, farkl\u0131 servislerin loglar\u0131n\u0131 birbiriyle ili\u015fkilendirebilir, hata oranlar\u0131n\u0131 izleyebilir, performans trendlerini analiz edebilir ve hatta belirli e\u015fik de\u011ferlere ula\u015f\u0131ld\u0131\u011f\u0131nda otomatik uyar\u0131lar (alerting) ayarlayabilirsiniz. \u00d6rne\u011fin, bir serviste 5 dakika i\u00e7inde 100'den fazla ERROR seviyesinde log geldi\u011finde ilgili ekibe e-posta g\u00f6nderilebilir veya Slack bildirimi yap\u0131labilir.<\/p>\n<p>Bir di\u011fer pop\u00fcler ve g\u00fc\u00e7l\u00fc ticari \u00e7\u00f6z\u00fcm ise <strong>Splunk<\/strong>'tur. Splunk, ELK Stack'in sundu\u011fu yeteneklere benzer \u015fekilde loglar\u0131 toplar, indeksler, arar, analiz eder ve g\u00f6rselle\u015ftirir. Geni\u015f bir entegrasyon yelpazesine ve geli\u015fmi\u015f g\u00fcvenlik \u00f6zelliklerine sahiptir. \u00d6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli kurumsal ortamlarda tercih edilir.<\/p>\n<h3>Vaka \u00c7al\u0131\u015fmas\u0131 1: \u00dcretim Ortam\u0131nda Bir Performans Sorununun Tespiti<\/h3>\n<p>Bir e-ticaret uygulamas\u0131n\u0131n \u00fcretim ortam\u0131nda, kullan\u0131c\u0131lar \u00f6deme sayfas\u0131nda anl\u0131k yava\u015flamalar ve zaman zaman i\u015flem hatalar\u0131 bildirmeye ba\u015fl\u0131yor. Geli\u015ftirme ekibi ba\u015flang\u0131\u00e7ta sorunun nerede oldu\u011funu belirleyemiyor, \u00e7\u00fcnk\u00fc CPU ve bellek kullan\u0131m\u0131 normal g\u00f6r\u00fcn\u00fcyor. \u0130\u015fte bu noktada merkezi log y\u00f6netimi sistemi ve iyi bir loglama stratejisi devreye giriyor:<\/p>\n<ol>\n<li><strong>Log Toplama:<\/strong> T\u00fcm servislerden (\u00fcr\u00fcn, sepet, \u00f6deme, envanter vb.) gelen loglar ELK Stack'e aktar\u0131l\u0131yor.<\/li>\n<li><strong>Performans Loglar\u0131:<\/strong> Uygulama, kritik i\u015f metodlar\u0131n\u0131n (\u00f6rn: <code>processPayment()<\/code>, <code>updateInventory()<\/code>) ba\u015flang\u0131\u00e7 ve biti\u015f zamanlar\u0131n\u0131 DEBUG seviyesinde ve i\u015flem s\u00fcrelerini (elapsed time) INFO seviyesinde logluyor. Ayr\u0131ca, harici \u00f6deme sa\u011flay\u0131c\u0131s\u0131na yap\u0131lan API \u00e7a\u011fr\u0131lar\u0131n\u0131n yan\u0131t s\u00fcreleri de loglan\u0131yor.<\/li>\n<li><strong>MDC Kullan\u0131m\u0131:<\/strong> Her \u00f6deme i\u015flemi i\u00e7in benzersiz bir <code>transactionId<\/code> MDC'ye ekleniyor, b\u00f6ylece ilgili t\u00fcm log mesajlar\u0131 birbiriyle ili\u015fkilendirilebiliyor.<\/li>\n<li><strong>Analiz ve G\u00f6rselle\u015ftirme:<\/strong> Kibana'da, \u00f6deme i\u015flemlerinin ortalama s\u00fcresini g\u00f6steren bir grafik olu\u015fturuluyor. Bu grafik, belirli saatlerde veya belirli \u00f6deme sa\u011flay\u0131c\u0131lar\u0131 kullan\u0131l\u0131rken i\u015flem s\u00fcrelerinin anormal derecede y\u00fckseldi\u011fini g\u00f6steriyor. Ayr\u0131ca, <code>transactionId<\/code> \u00fczerinden yap\u0131lan sorgular, yava\u015flayan i\u015flemlerin hangi a\u015famalarda tak\u0131ld\u0131\u011f\u0131n\u0131 ortaya koyuyor.<\/li>\n<li><strong>Sonu\u00e7:<\/strong> Loglar incelendi\u011finde, belirli bir \u00f6deme sa\u011flay\u0131c\u0131s\u0131na yap\u0131lan API \u00e7a\u011fr\u0131lar\u0131n\u0131n yan\u0131t s\u00fcrelerinin, \u00f6zellikle yo\u011fun saatlerde dramatik bir \u015fekilde artt\u0131\u011f\u0131 tespit ediliyor. Ayr\u0131ca, uygulaman\u0131n kendi i\u00e7inde bir veritaban\u0131 kilitlenme sorunu da loglarda ERROR seviyesinde belirginle\u015fiyor. Bu sayede ekip, sorunu izole ederek \u00f6ncelikle \u00f6deme sa\u011flay\u0131c\u0131 ile ileti\u015fime ge\u00e7iyor ve veritaban\u0131 ba\u011flant\u0131 havuzu ayarlar\u0131n\u0131 optimize ederek performans\u0131 geri kazand\u0131r\u0131yor. Loglar olmadan, bu karma\u015f\u0131k ve da\u011f\u0131t\u0131k sorunun tespiti \u00e7ok daha uzun s\u00fcrecek, hatta imkans\u0131z olacakt\u0131.<\/li>\n<\/ol>\n<p>Bu vaka \u00e7al\u0131\u015fmas\u0131, loglar\u0131n sadece hata ay\u0131klama arac\u0131 olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda proaktif izleme ve performans optimizasyonu i\u00e7in de ne kadar g\u00fc\u00e7l\u00fc bir ara\u00e7 oldu\u011funu g\u00f6zler \u00f6n\u00fcne seriyor. Do\u011fru loglama stratejisi ve merkezi bir log y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc, uygulaman\u0131z\u0131n operasyonel m\u00fckemmelli\u011fi i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<h2>Uygulama Loglar\u0131n\u0131 Mobil Uyumlu Hale Getirmek Neden Gereklidir?<\/h2>\n<p>Bu ba\u015fl\u0131k, do\u011frudan Java uygulama loglar\u0131n\u0131n kendisinin mobil uyumlu olmas\u0131 anlam\u0131na gelmez; zira Java uygulamalar\u0131 genellikle sunucu taraf\u0131nda \u00e7al\u0131\u015f\u0131r ve loglar\u0131 da sunucuda veya merkezi bir sistemde saklan\u0131r. Ancak, \"mobil uyumlu HTML \u00fcret\" kural\u0131na at\u0131fta bulunarak, olu\u015fturdu\u011fumuz bu teknik makalenin mobil cihazlarda da rahat\u00e7a okunabilir ve eri\u015filebilir olmas\u0131n\u0131n \u00f6nemini vurgulayabiliriz.<\/p>\n<p>G\u00fcn\u00fcm\u00fczde internet trafi\u011finin b\u00fcy\u00fck bir k\u0131sm\u0131 mobil cihazlardan gelmektedir. Bu nedenle, teknik makaleler, blog yaz\u0131lar\u0131 ve dok\u00fcmantasyonlar gibi i\u00e7eriklerin mobil uyumlu olmas\u0131, okuyucular\u0131n i\u00e7eri\u011fe her yerden ve her an rahat\u00e7a eri\u015febilmesi i\u00e7in kritik \u00f6neme sahiptir. Bir geli\u015ftirici veya sistem y\u00f6neticisi, mobil cihaz\u0131nda bir log analiz raporunu, bir uyar\u0131y\u0131 veya bir teknik makaleyi incelerken, i\u00e7eri\u011fin d\u00fczg\u00fcn bir \u015fekilde g\u00f6r\u00fcnt\u00fclenmesini ve kullan\u0131labilir olmas\u0131n\u0131 bekler.<\/p>\n<p><strong>Peki, bir HTML i\u00e7eri\u011fini mobil uyumlu hale getirmek ne anlama gelir?<\/strong><\/p>\n<ol>\n<li><strong>Duyarl\u0131 Tasar\u0131m (Responsive Design):<\/strong> \u0130\u00e7eri\u011fin (metin, g\u00f6rseller, kod bloklar\u0131, tablolar) farkl\u0131 ekran boyutlar\u0131na (telefon, tablet, masa\u00fcst\u00fc) otomatik olarak uyum sa\u011flamas\u0131 demektir. Bu, CSS Media Query'ler gibi tekniklerle sa\u011flan\u0131r.\n<pre><code class=\"language-css\">\n\/* \u00d6rnek bir mobil uyumlu CSS medya sorgusu *\/\n@media screen and (max-width: 768px) {\n  h2 {\n    font-size: 1.5em; \/* Mobil ekranlarda ba\u015fl\u0131k boyutunu k\u00fc\u00e7\u00fclt *\/\n  }\n  p {\n    font-size: 0.9em; \/* Metin boyutunu ayarla *\/\n  }\n  \/* Kod bloklar\u0131 i\u00e7in yatay kayd\u0131rma *\/\n  pre {\n    overflow-x: auto;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n  }\n}\n        <\/pre>\n<p><\/code><br \/>\n        Bu \u00f6rnekte, k\u00fc\u00e7\u00fck ekranlarda ba\u015fl\u0131k ve paragraf boyutlar\u0131 k\u00fc\u00e7\u00fclt\u00fcl\u00fcrken, kod bloklar\u0131n\u0131n yatayda kayd\u0131r\u0131labilir olmas\u0131 sa\u011flan\u0131r. Bu, uzun kod sat\u0131rlar\u0131n\u0131n ekran d\u0131\u015f\u0131na ta\u015fmas\u0131n\u0131 engeller ve okunabilirli\u011fi art\u0131r\u0131r.\n    <\/li>\n<li><strong>Okunabilirlik:<\/strong> Metin boyutlar\u0131, sat\u0131r y\u00fckseklikleri, paragraf aral\u0131klar\u0131 ve kontrast oranlar\u0131 mobil cihazlarda da rahat okunabilecek \u015fekilde ayarlanmal\u0131d\u0131r. \u00c7ok k\u00fc\u00e7\u00fck veya \u00e7ok b\u00fcy\u00fck fontlar, g\u00f6z yorgunlu\u011funa neden olabilir.<\/li>\n<li><strong>G\u00f6rsel ve Kod Bloklar\u0131n\u0131n Y\u00f6netimi:<\/strong> G\u00f6rsellerin ekran boyutuna g\u00f6re \u00f6l\u00e7eklenmesi (<code>max-width: 100%; height: auto;<\/code>) ve kod bloklar\u0131n\u0131n yatay kayd\u0131rma \u00e7ubuklar\u0131 ile g\u00f6r\u00fcnt\u00fclenebilmesi (yukar\u0131daki CSS \u00f6rne\u011fi) mobil uyumluluk i\u00e7in elzemdir. Uzun kod sat\u0131rlar\u0131 mobil cihazlarda okunamaz hale gelebilir.<\/li>\n<li><strong>Dokunmatik Dostu Etkile\u015fimler:<\/strong> E\u011fer makalede interaktif elementler (butonlar, linkler) varsa, bunlar\u0131n dokunmatik ekranlarda kolayca t\u0131klanabilir b\u00fcy\u00fckl\u00fckte olmas\u0131 \u00f6nemlidir.<\/li>\n<li><strong>H\u0131zl\u0131 Y\u00fckleme S\u00fcresi:<\/strong> Mobil a\u011flar her zaman h\u0131zl\u0131 olmayabilir. Bu nedenle, sayfan\u0131n h\u0131zl\u0131 y\u00fcklenmesi i\u00e7in g\u00f6rsellerin optimize edilmesi, gereksiz CSS\/JS kodlar\u0131n\u0131n temizlenmesi \u00f6nemlidir.<\/li>\n<\/ol>\n<p>Bu makale \u00f6zelinde, \u00fcretti\u011fimiz HTML i\u00e7eri\u011fi zaten taray\u0131c\u0131lar\u0131n varsay\u0131lan stil kurallar\u0131 ve yukar\u0131da bahsedilen responsive tasar\u0131m ilkeleri ile birlikte iyi bir kullan\u0131c\u0131 deneyimi sunmal\u0131d\u0131r. Amac\u0131m\u0131z, Java loglama \u00fczerine de\u011ferli bilgiler sunarken, bu bilgilerin her okuyucuya, kulland\u0131\u011f\u0131 cihazdan ba\u011f\u0131ms\u0131z olarak ula\u015fabilmesini sa\u011flamakt\u0131r. Mobil uyumluluk, bilginin eri\u015filebilirli\u011fi a\u00e7\u0131s\u0131ndan kritik bir fakt\u00f6rd\u00fcr ve teknik i\u00e7eriklerde de g\u00f6z ard\u0131 edilmemelidir.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Java uygulamalar\u0131nda loglama, sadece bir hata ay\u0131klama arac\u0131 olman\u0131n \u00f6tesinde, uygulaman\u0131n nabz\u0131n\u0131 tutan, sa\u011fl\u0131\u011f\u0131n\u0131 izleyen ve operasyonel m\u00fckemmelli\u011fi sa\u011flayan kritik bir s\u00fcre\u00e7tir. Bu makale boyunca, loglaman\u0131n temel motivasyonlar\u0131ndan ba\u015flad\u0131k, pop\u00fcler Java loglama k\u00fct\u00fcphanelerini (Log4j2, Logback, JUL) kar\u015f\u0131la\u015ft\u0131rd\u0131k, etkili loglama i\u00e7in en iyi pratikleri ve uygulanan teknikleri ele ald\u0131k. Asenkron loglama ile performans\u0131 nas\u0131l art\u0131rabilece\u011finizi, MDC ile da\u011f\u0131t\u0131k i\u015flemleri nas\u0131l izleyebilece\u011finizi ve yap\u0131land\u0131r\u0131lm\u0131\u015f loglaman\u0131n modern log analizi i\u00e7in neden bu kadar \u00f6nemli oldu\u011funu detayland\u0131rd\u0131k. Ayr\u0131ca, ELK Stack gibi merkezi log y\u00f6netimi \u00e7\u00f6z\u00fcmlerinin, b\u00fcy\u00fck \u00f6l\u00e7ekli sistemlerde loglar\u0131 anlaml\u0131 bilgilere d\u00f6n\u00fc\u015ft\u00fcrmedeki rol\u00fcn\u00fc bir vaka \u00e7al\u0131\u015fmas\u0131 \u00fczerinden g\u00f6sterdik.<\/p>\n<p>Unutmay\u0131n ki iyi bir loglama stratejisi, uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca size zaman, kaynak ve en \u00f6nemlisi i\u00e7 huzur kazand\u0131r\u0131r. Loglar\u0131 sadece sorun an\u0131nda ba\u015fvurulacak bir kaynak olarak de\u011fil, ayn\u0131 zamanda sisteminizin proaktif bir izleme ve analiz arac\u0131 olarak g\u00f6r\u00fcn. Do\u011fru k\u00fct\u00fcphaneyi se\u00e7mek, log seviyelerini ak\u0131ll\u0131ca kullanmak, okunabilir ve yap\u0131land\u0131r\u0131lm\u0131\u015f loglar \u00fcretmek, ve son olarak bu loglar\u0131 merkezi bir sistemde toplamak ve analiz etmek, Java uygulama geli\u015ftirme ve y\u00f6netiminin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Bu pratikleri uygulayarak, uygulaman\u0131z\u0131n her zaman kontrol alt\u0131nda oldu\u011fundan emin olabilir, olas\u0131 sorunlar\u0131 h\u0131zla tespit edip \u00e7\u00f6zebilir ve nihayetinde daha sa\u011flam ve g\u00fcvenilir sistemler in\u015fa edebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n        <strong>S: Hangi log seviyesini ne zaman kullanmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> <code>TRACE<\/code> ve <code>DEBUG<\/code> seviyeleri genellikle geli\u015ftirme ve detayl\u0131 hata ay\u0131klama i\u00e7in kullan\u0131l\u0131r. <code>INFO<\/code>, uygulaman\u0131n normal ak\u0131\u015f\u0131n\u0131 g\u00f6steren \u00f6nemli olaylar i\u00e7indir (\u00f6rn: kullan\u0131c\u0131 giri\u015fi, ba\u015far\u0131l\u0131 i\u015flem). <code>WARN<\/code>, potansiyel sorunlara i\u015faret eder (\u00f6rn: konfig\u00fcrasyon eksikli\u011fi, d\u00fc\u015f\u00fck disk alan\u0131). <code>ERROR<\/code>, uygulaman\u0131n bir k\u0131sm\u0131n\u0131 etkileyen hatalar i\u00e7indir (\u00f6rn: i\u015flem ba\u015far\u0131s\u0131zl\u0131\u011f\u0131). <code>FATAL<\/code> ise uygulaman\u0131n tamamen \u00e7\u00f6kmesine neden olan \u00e7ok kritik hatalar i\u00e7indir. \u00dcretim ortam\u0131nda genellikle <code>INFO<\/code> seviyesinden ba\u015flan\u0131r.\n    <\/li>\n<li>\n        <strong>S: Hassas verileri (\u015fifre, kredi kart\u0131 numaras\u0131) loglamal\u0131 m\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> Hay\u0131r, kesinlikle loglamamal\u0131s\u0131n\u0131z. Bu, ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7ar ve veri gizlili\u011fi d\u00fczenlemelerine (GDPR, KVKK) ayk\u0131r\u0131d\u0131r. E\u011fer hata ay\u0131klama i\u00e7in ge\u00e7ici olarak bu verilere ihtiyac\u0131n\u0131z olursa, log seviyesini dikkatlice y\u00fckseltin ve i\u015finiz bitti\u011finde hemen kapat\u0131n. Hassas verileri loglardan maskeleyecek veya \u00e7\u0131karacak filtreler kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.\n    <\/li>\n<li>\n        <strong>S: SLF4J kullanmak neden \u00f6nemlidir?<\/strong><br \/>\n        <strong>C:<\/strong> SLF4J (Simple Logging Facade for Java), uygulama kodunuzu altta yatan belirli bir loglama k\u00fct\u00fcphanesine (Log4j2, Logback, JUL) ba\u011f\u0131ml\u0131 k\u0131lmadan loglama yapman\u0131z\u0131 sa\u011flayan bir cephe (facade) k\u00fct\u00fcphanesidir. Bu, projenizin loglama implementasyonunu gelecekte kolayca de\u011fi\u015ftirebilme esnekli\u011fi sunar, kodunuzu daha mod\u00fcler ve ta\u015f\u0131nabilir hale getirir.\n    <\/li>\n<li>\n        <strong>S: Log dosyalar\u0131n\u0131n boyutu \u00e7ok b\u00fcy\u00fcyor, ne yapmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> Loglama k\u00fct\u00fcphanenizdeki \"Rolling File Appender\" veya benzeri mekanizmalar\u0131 kullanmal\u0131s\u0131n\u0131z. Bu appender'lar, log dosyalar\u0131n\u0131 belirli bir boyuta ula\u015ft\u0131\u011f\u0131nda veya belirli bir zaman dilimi (g\u00fcnl\u00fck, haftal\u0131k) sonunda otomatik olarak ar\u015fivler ve yeni bir log dosyas\u0131 olu\u015fturur. Ayr\u0131ca, eski log dosyalar\u0131n\u0131 otomatik olarak silme (maxHistory) veya s\u0131k\u0131\u015ft\u0131rma gibi \u00f6zellikler de sunarlar. Log seviyelerini optimize ederek gereksiz log \u00fcretimini azaltmak da \u00f6nemlidir.\n    <\/li>\n<li>\n        <strong>S: Mikroservis mimarilerinde log takibi nas\u0131l yap\u0131l\u0131r?<\/strong><br \/>\n        <strong>C:<\/strong> Mikroservislerde log takibi i\u00e7in iki ana y\u00f6ntem kritiktir:<\/p>\n<ol>\n<li><strong>Merkezi Log Y\u00f6netimi:<\/strong> T\u00fcm servislerden gelen loglar\u0131 ELK Stack veya Splunk gibi merkezi bir sistemde toplamak ve korele etmek.<\/li>\n<li><strong>MDC (Mapped Diagnostic Context) ve Korelasyon ID'leri:<\/strong> Her bir iste\u011fe veya i\u015fleme benzersiz bir \"Korelasyon ID'si\" (Correlation ID veya Transaction ID) atay\u0131n. Bu ID'yi HTTP ba\u015fl\u0131klar\u0131 veya mesaj kuyru\u011fu meta verileri arac\u0131l\u0131\u011f\u0131yla servisler aras\u0131nda aktar\u0131n. Her servisteki log mesajlar\u0131na bu ID'yi MDC kullanarak ekleyin. Bu sayede, merkezi log sisteminde bu ID'ye g\u00f6re arama yaparak bir i\u015flemin t\u00fcm servislerdeki ad\u0131mlar\u0131n\u0131 takip edebilirsiniz.<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler Java uygulamalar\u0131n\u0131zdaki g\u00f6r\u00fcnmez hatalar\u0131 bulmak, performans\u0131 izlemek ve sistem&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-35807","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?<\/title>\n<meta name=\"description\" content=\"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?\" \/>\n<meta property=\"og:description\" content=\"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-03T23:01:16+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?\",\"datePublished\":\"2025-12-03T23:01:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\"},\"wordCount\":5646,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\",\"name\":\"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-03T23:01:16+00:00\",\"description\":\"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?","description":"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler","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:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/","og_locale":"tr_TR","og_type":"article","og_title":"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?","og_description":"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler","og_url":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-03T23:01:16+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?","datePublished":"2025-12-03T23:01:16+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/"},"wordCount":5646,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/","url":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/","name":"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-03T23:01:16+00:00","description":"Java Uygulama Loglar\u0131: Motivasyon, Y\u00f6netim ve En \u0130yi Pratikler","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-uygulamalarinda-loglama-neden-bu-kadar-onemli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java Uygulamalar\u0131nda Loglama Neden Bu Kadar \u00d6nemli?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35807","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35807"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35807\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35807"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35807"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}