{"id":31219,"date":"2025-10-07T09:41:16","date_gmt":"2025-10-07T06:41:16","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31219"},"modified":"2025-10-07T09:41:16","modified_gmt":"2025-10-07T06:41:16","slug":"javada-loglama-kapsamli-bir-bakis-ve-ornekler","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/","title":{"rendered":"Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler"},"content":{"rendered":"<p><body><\/p>\n<h2>Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler<\/h2>\n<p>Java uygulamalar\u0131 geli\u015ftirirken, kodun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak, hatalar\u0131 tespit etmek ve uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 anlamak kritik \u00f6neme sahiptir. Bu noktada &#8220;loglama&#8221; devreye girer. Loglama, bir uygulaman\u0131n \u00e7al\u0131\u015fma zaman\u0131nda belirli olaylar\u0131, durumlar\u0131 veya hata mesajlar\u0131n\u0131 kaydederek, geli\u015ftiricilere ve sistem y\u00f6neticilerine de\u011ferli i\u00e7g\u00f6r\u00fcler sunan bir mekanizmad\u0131r. Bu makalede, Java&#8217;da loglaman\u0131n neden bu kadar \u00f6nemli oldu\u011funu, yerle\u015fik loglama API&#8217;si <code>java.util.logging<\/code>&#8216;i, pop\u00fcler \u00fc\u00e7\u00fcnc\u00fc parti loglama \u00e7er\u00e7evelerini (Log4j, Logback, SLF4J) ve iyi loglama pratiklerini detayl\u0131 \u00f6rneklerle inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f: Loglama Neden \u00d6nemli?<\/h3>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde loglama, sadece hata ay\u0131klama arac\u0131 olmaktan \u00e7ok daha fazlas\u0131d\u0131r. Modern, karma\u015f\u0131k ve da\u011f\u0131t\u0131k sistemlerde loglar, uygulaman\u0131n &#8220;kara kutusunu&#8221; a\u00e7an bir pencere g\u00f6revi g\u00f6r\u00fcr. Loglaman\u0131n ba\u015fl\u0131ca faydalar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Hata Ay\u0131klama (Debugging):<\/strong> Uygulama \u00e7\u00f6kt\u00fc\u011f\u00fcnde veya beklenmedik bir davran\u0131\u015f sergiledi\u011finde, loglar hatan\u0131n k\u00f6k nedenini bulmak i\u00e7in izlenebilecek bir &#8220;ekmek k\u0131r\u0131nt\u0131s\u0131&#8221; yolu sunar. Hata mesajlar\u0131, stack trace&#8217;ler ve de\u011fi\u015fken de\u011ferleri loglara kaydedilerek sorun tespiti kolayla\u015f\u0131r.<br \/>\n*   <strong>Uygulama Takibi ve Performans \u0130zleme:<\/strong> Loglar, uygulaman\u0131n hangi i\u015flemlerden ge\u00e7ti\u011fini, ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc ve hangi kaynaklar\u0131 kulland\u0131\u011f\u0131n\u0131 g\u00f6sterir. Bu bilgiler, performans darbo\u011fazlar\u0131n\u0131 tespit etmek ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in kullan\u0131labilir.<br \/>\n*   <strong>G\u00fcvenlik Denetimi (Auditing):<\/strong> Kullan\u0131c\u0131 giri\u015fleri, hassas veri eri\u015fimleri, yetkilendirme denemeleri gibi g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00f6nemli olaylar loglanarak, olas\u0131 g\u00fcvenlik ihlallerinin tespiti ve analizi sa\u011flan\u0131r.<br \/>\n*   <strong>\u0130\u015f S\u00fcreci \u0130zleme:<\/strong> Uygulama i\u00e7indeki belirli i\u015f ak\u0131\u015flar\u0131n\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131, hangi a\u015famada tak\u0131ld\u0131\u011f\u0131n\u0131 veya ka\u00e7 i\u015flem ger\u00e7ekle\u015ftirdi\u011fini loglar arac\u0131l\u0131\u011f\u0131yla takip edebiliriz. Bu, i\u015f operasyonlar\u0131n\u0131n izlenmesi ve raporlanmas\u0131 i\u00e7in \u00f6nemlidir.<br \/>\n*   <strong>Sistem Entegrasyonu:<\/strong> Da\u011f\u0131t\u0131k sistemlerde farkl\u0131 servisler aras\u0131ndaki etkile\u015fimleri loglamak, entegrasyon sorunlar\u0131n\u0131 anlamak ve gidermek i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<p><code>System.out.println()<\/code> kullanmak yerine ger\u00e7ek bir loglama mekanizmas\u0131 kullanmak, bu faydalar\u0131 sa\u011flaman\u0131n tek yoludur. <code>System.out.println()<\/code>, \u00e7\u0131kt\u0131y\u0131 kontrol etme, filtreleme, farkl\u0131 hedeflere y\u00f6nlendirme veya formatlama gibi esneklikler sunmaz ve \u00fcretim ortamlar\u0131nda ciddi performans sorunlar\u0131na yol a\u00e7abilir.<\/p>\n<h3>Java&#8217;da Temel Loglama Mekanizmalar\u0131<\/h3>\n<p>Java ekosisteminde birden fazla loglama se\u00e7ene\u011fi bulunmaktad\u0131r. Bunlar\u0131n en temel olan\u0131, Java&#8217;n\u0131n kendi b\u00fcnyesinde gelen <code>java.util.logging<\/code> (JUL) API&#8217;sidir.<\/p>\n<h4>java.util.logging (JUL)<\/h4>\n<p><code>java.util.logging<\/code>, Java SE platformunun bir par\u00e7as\u0131d\u0131r ve herhangi bir harici ba\u011f\u0131ml\u0131l\u0131k olmadan kullan\u0131labilir. Daha basit uygulamalar veya h\u0131zl\u0131 prototipleme i\u00e7in uygun olabilir.<\/p>\n<h5>JUL Temel Bile\u015fenleri<\/h5>\n<p>*   <strong><code>Logger<\/code>:<\/strong> Loglama mesajlar\u0131n\u0131 olu\u015fturan ana nesnedir. Belirli bir isimle (genellikle s\u0131n\u0131f\u0131n tam nitelikli ad\u0131) al\u0131n\u0131r.<br \/>\n*   <strong><code>Level<\/code>:<\/strong> Loglama mesaj\u0131n\u0131n \u00f6nem derecesini belirtir. \u00d6n tan\u0131ml\u0131 seviyeler \u015funlard\u0131r: <code>SEVERE<\/code> (ciddi hata), <code>WARNING<\/code> (uyar\u0131), <code>INFO<\/code> (bilgilendirme), <code>CONFIG<\/code> (yap\u0131land\u0131rma), <code>FINE<\/code> (detayl\u0131 hata ay\u0131klama), <code>FINER<\/code>, <code>FINEST<\/code> (en detayl\u0131 hata ay\u0131klama). Ayr\u0131ca <code>ALL<\/code> (t\u00fcm mesajlar) ve <code>OFF<\/code> (hi\u00e7bir mesaj) seviyeleri de bulunur.<br \/>\n*   <strong><code>Handler<\/code>:<\/strong> Log mesajlar\u0131n\u0131 belirli bir hedefe (konsol, dosya, a\u011f, veritaban\u0131 vb.) yazmaktan sorumludur. \u00d6rne\u011fin, <code>ConsoleHandler<\/code> konsola yazar, <code>FileHandler<\/code> dosyalara yazar.<br \/>\n*   <strong><code>Formatter<\/code>:<\/strong> Log mesajlar\u0131n\u0131n nas\u0131l bi\u00e7imlendirilece\u011fini belirler. \u00d6rne\u011fin, <code>SimpleFormatter<\/code> basit metin \u00e7\u0131kt\u0131s\u0131 sa\u011flarken, <code>XMLFormatter<\/code> XML format\u0131nda \u00e7\u0131kt\u0131 verir.<\/p>\n<h5>JUL Kullan\u0131m \u00d6rne\u011fi<\/h5>\n<pre><code class=\"language-java\">import java.util.logging.ConsoleHandler;\nimport java.util.logging.FileHandler;\nimport java.util.logging.Formatter;\nimport java.util.logging.Level;\nimport java.util.logging.LogRecord;\nimport java.util.logging.Logger;\nimport java.util.logging.SimpleFormatter;\nimport java.io.IOException;\n\npublic class JulLoggerExample {\n\n    private static final Logger logger = Logger.getLogger(JulLoggerExample.class.getName());\n\n    public static void main(String[] args) {\n        \/\/ Varsay\u0131lan olarak INFO seviyesindeki mesajlar loglan\u0131r.\n        \/\/ T\u00fcm mesajlar\u0131 g\u00f6rmek i\u00e7in seviyeyi de\u011fi\u015ftirebiliriz.\n        logger.setLevel(Level.ALL);\n\n        \/\/ Konsola log yazmak i\u00e7in bir Handler ekleyelim\n        ConsoleHandler consoleHandler = new ConsoleHandler();\n        consoleHandler.setLevel(Level.ALL); \/\/ Handler'\u0131n kendi seviyesi olabilir\n        logger.addHandler(consoleHandler);\n\n        \/\/ Dosyaya log yazmak i\u00e7in bir Handler ekleyelim\n        try {\n            FileHandler fileHandler = new FileHandler(\"my_app_jul.log\", true); \/\/ true: append modunda\n            fileHandler.setLevel(Level.FINE); \/\/ Sadece FINE ve \u00fcst\u00fc seviyeleri dosyaya yaz\n            \n            \/\/ \u00d6zel bir Formatter kullanabiliriz\n            fileHandler.setFormatter(new SimpleFormatter()); \/\/ Veya kendi Formatter'\u0131m\u0131z\u0131 yazabiliriz\n            logger.addHandler(fileHandler);\n        } catch (IOException e) {\n            logger.log(Level.SEVERE, \"Dosya Handler olu\u015fturulurken hata olu\u015ftu\", e);\n        }\n        \n        \/\/ Varsay\u0131lan handler'\u0131 (genellikle console) kald\u0131rmak isteyebiliriz\n        \/\/ logger.setUseParentHandlers(false);\n\n        logger.log(Level.INFO, \"Uygulama ba\u015flat\u0131l\u0131yor...\");\n        logger.info(\"Bu bir bilgilendirme mesaj\u0131d\u0131r.\"); \/\/ logger.info() k\u0131sayolu\n\n        try {\n            int result = divide(10, 0);\n            logger.log(Level.INFO, \"B\u00f6lme sonucu: \" + result);\n        } catch (ArithmeticException e) {\n            logger.log(Level.SEVERE, \"S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu!\", e);\n        }\n\n        logger.warning(\"Bu bir uyar\u0131 mesaj\u0131d\u0131r.\");\n        logger.fine(\"Bu detayl\u0131 bir hata ay\u0131klama mesaj\u0131d\u0131r. (Sadece seviye uygunsa g\u00f6r\u00fcn\u00fcr)\");\n        logger.log(Level.CONFIG, \"Uygulama ayarlar\u0131 y\u00fcklendi.\");\n\n        logger.log(Level.INFO, \"Uygulama kapat\u0131l\u0131yor.\");\n    }\n\n    public static int divide(int a, int b) {\n        return a \/ b;\n    }\n}<\/code><\/pre>\n<h5>JUL Avantajlar\u0131 ve Dezavantajlar\u0131<\/h5>\n<p>*   <strong>Avantajlar:<\/strong> Java&#8217;n\u0131n yerle\u015fik bir par\u00e7as\u0131d\u0131r, harici ba\u011f\u0131ml\u0131l\u0131k gerektirmez. Basit kullan\u0131m senaryolar\u0131 i\u00e7in yeterlidir.<br \/>\n*   <strong>Dezavantajlar:<\/strong> Yap\u0131land\u0131rma esnekli\u011fi s\u0131n\u0131rl\u0131d\u0131r. \u00d6zellikle \u00fc\u00e7\u00fcnc\u00fc parti k\u00fct\u00fcphanelerin farkl\u0131 loglama \u00e7er\u00e7evelerini kulland\u0131\u011f\u0131 karma\u015f\u0131k uygulamalarda y\u00f6netimi zorla\u015fabilir. Performans a\u00e7\u0131s\u0131ndan Log4j veya Logback kadar optimize de\u011fildir.<\/p>\n<h3>\u00dc\u00e7\u00fcnc\u00fc Parti Loglama \u00c7er\u00e7eveleri<\/h3>\n<p>JUL&#8217;nin s\u0131n\u0131rlamalar\u0131 nedeniyle, Java toplulu\u011fu daha g\u00fc\u00e7l\u00fc ve esnek loglama \u00e7\u00f6z\u00fcmleri geli\u015ftirmi\u015ftir. Bunlar\u0131n ba\u015f\u0131nda Apache Log4j ve Logback gelir. Ayr\u0131ca, bu \u00e7er\u00e7eveler aras\u0131nda bir soyutlama katman\u0131 sa\u011flayan SLF4J de yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<h4>Log4j (Apache Log4j 2)<\/h4>\n<p>Log4j, Apache Software Foundation taraf\u0131ndan geli\u015ftirilen, Java&#8217;daki en pop\u00fcler loglama \u00e7er\u00e7evelerinden biridir. \u00d6zellikle Log4j 2, Log4j 1.x&#8217;in bir\u00e7ok sorununu gidererek daha iyi performans, esneklik ve yap\u0131land\u0131rma se\u00e7enekleri sunar.<\/p>\n<h5>Log4j 2 Temel Bile\u015fenleri<\/h5>\n<p>*   <strong><code>Logger<\/code>:<\/strong> Log mesajlar\u0131n\u0131 olu\u015fturan ana bile\u015fen. Belirli bir isimle (genellikle s\u0131n\u0131f\u0131n tam ad\u0131) al\u0131n\u0131r.<br \/>\n*   <strong><code>Appender<\/code>:<\/strong> Log mesajlar\u0131n\u0131 belirli bir hedefe (konsol, dosya, veritaban\u0131, JMS kuyru\u011fu, e-posta vb.) yazmaktan sorumludur. <code>ConsoleAppender<\/code>, <code>FileAppender<\/code>, <code>RollingFileAppender<\/code> en yayg\u0131n olanlar\u0131d\u0131r.<br \/>\n*   <strong><code>Layout<\/code>:<\/strong> Log mesajlar\u0131n\u0131n nas\u0131l bi\u00e7imlendirilece\u011fini belirler. <code>PatternLayout<\/code> en yayg\u0131n ve g\u00fc\u00e7l\u00fc olan\u0131d\u0131r, desenler kullanarak \u00e7\u0131kt\u0131y\u0131 \u00f6zelle\u015ftirmeye olanak tan\u0131r.<br \/>\n*   <strong><code>Level<\/code>:<\/strong> Log mesaj\u0131n\u0131n \u00f6nem derecesini belirtir. Log4j 2 seviyeleri: <code>OFF<\/code>, <code>FATAL<\/code>, <code>ERROR<\/code>, <code>WARN<\/code>, <code>INFO<\/code>, <code>DEBUG<\/code>, <code>TRACE<\/code>, <code>ALL<\/code>.<br \/>\n*   <strong><code>Filter<\/code>:<\/strong> Log mesajlar\u0131n\u0131n Appender&#8217;a iletilmeden \u00f6nce filtrelenmesini sa\u011flar. Belirli bir seviyeden, desenden veya i\u00e7erikten ge\u00e7en mesajlar\u0131 filtreleyebiliriz.<\/p>\n<h5>Log4j 2 Yap\u0131land\u0131rmas\u0131<\/h5>\n<p>Log4j 2 genellikle XML, YAML veya JSON dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131r\u0131l\u0131r. <code>log4j2.xml<\/code> dosyas\u0131, s\u0131n\u0131f yolunda (classpath) bulunmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-xml\"><!-- log4j2.xml -->\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration status=\"WARN\">\n    <Appenders>\n        <!-- Konsol Appender'\u0131 -->\n        <Console name=\"ConsoleAppender\" target=\"SYSTEM_OUT\">\n            <PatternLayout pattern=\"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n\"\/>\n        <\/Console>\n\n        <!-- Dosya Appender'\u0131 (her g\u00fcn yeni dosya olu\u015fturur) -->\n        <RollingFile name=\"FileAppender\" fileName=\"logs\/my_app.log\"\n                     filePattern=\"logs\/my_app-%d{yyyy-MM-dd}.log.gz\">\n            <PatternLayout pattern=\"%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n\"\/>\n            <Policies>\n                <TimeBasedTriggeringPolicy interval=\"1\" modulate=\"true\"\/>\n            <\/Policies>\n            <DefaultRolloverStrategy max=\"7\"\/> <!-- Son 7 g\u00fcn\u00fc tut -->\n        <\/RollingFile>\n    <\/Appenders>\n\n    <Loggers>\n        <!-- Belirli bir paketin veya s\u0131n\u0131f\u0131n log seviyesini ayarlayabiliriz -->\n        <Logger name=\"com.example.myapp.service\" level=\"DEBUG\" additivity=\"false\">\n            <AppenderRef ref=\"ConsoleAppender\"\/>\n        <\/Logger>\n\n        <!-- Root Logger: Di\u011fer Logger'lar taraf\u0131ndan yakalanmayan t\u00fcm mesajlar\u0131 i\u015fler -->\n        <Root level=\"INFO\">\n            <AppenderRef ref=\"ConsoleAppender\"\/>\n            <AppenderRef ref=\"FileAppender\"\/>\n        <\/Root>\n    <\/Loggers>\n<\/Configuration><\/code><\/pre>\n<h5>Log4j 2 Kullan\u0131m \u00d6rne\u011fi<\/h5>\n<p>\u00d6ncelikle Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeliyiz:<\/p>\n<pre><code class=\"language-xml\"><dependency>\n    <groupId>org.apache.logging.log4j<\/groupId>\n    <artifactId>log4j-api<\/artifactId>\n    <version>2.23.1<\/version>\n<\/dependency>\n<dependency>\n    <groupId>org.apache.logging.log4j<\/groupId>\n    <artifactId>log4j-core<\/artifactId>\n    <version>2.23.1<\/version>\n<\/dependency><\/code><\/pre>\n<pre><code class=\"language-java\">import org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\n\npublic class Log4j2LoggerExample {\n\n    \/\/ Logger \u00f6rne\u011fini almak i\u00e7in s\u0131n\u0131f\u0131n ad\u0131n\u0131 kullan\u0131r\u0131z\n    private static final Logger logger = LogManager.getLogger(Log4j2LoggerExample.class);\n\n    public static void main(String[] args) {\n        logger.trace(\"Bu bir TRACE mesaj\u0131d\u0131r.\");\n        logger.debug(\"Bu bir DEBUG mesaj\u0131d\u0131r.\");\n        logger.info(\"Uygulama ba\u015flat\u0131l\u0131yor...\");\n        logger.warn(\"Bu bir uyar\u0131 mesaj\u0131d\u0131r.\");\n\n        try {\n            int result = divide(10, 0);\n            logger.info(\"B\u00f6lme sonucu: \" + result);\n        } catch (ArithmeticException e) {\n            \/\/ Hata mesaj\u0131n\u0131 ve stack trace'i loglamak i\u00e7in e nesnesini do\u011frudan ge\u00e7irebiliriz\n            logger.error(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu!\", e);\n        }\n\n        logger.fatal(\"Uygulama kritik bir hata nedeniyle kapat\u0131l\u0131yor.\");\n    }\n\n    public static int divide(int a, int b) {\n        return a \/ b;\n    }\n}<\/code><\/pre>\n<h4>Logback<\/h4>\n<p>Logback, Log4j&#8217;nin orijinal yazar\u0131 Ceki G\u00fclc\u00fc taraf\u0131ndan geli\u015ftirilen, Log4j 1.x&#8217;in halefi olarak tasarlanm\u0131\u015f modern bir loglama \u00e7er\u00e7evesidir. Spring Boot&#8217;un varsay\u0131lan loglama \u00e7er\u00e7evesidir. Logback, Log4j 2&#8217;ye benzer bir mimariye sahiptir ve performans, esneklik ve daha zengin \u00f6zellikler sunar.<\/p>\n<h5>Logback Temel Bile\u015fenleri<\/h5>\n<p>*   <strong><code>Logger<\/code>:<\/strong> Log mesajlar\u0131n\u0131 olu\u015fturan ana bile\u015fen.<br \/>\n*   <strong><code>Appender<\/code>:<\/strong> Log mesajlar\u0131n\u0131 hedeflere (konsol, dosya, veritaban\u0131 vb.) yazan bile\u015fen. <code>ConsoleAppender<\/code>, <code>FileAppender<\/code>, <code>RollingFileAppender<\/code> gibi \u00e7e\u015fitleri vard\u0131r.<br \/>\n*   <strong><code>Encoder<\/code>:<\/strong> Log mesajlar\u0131n\u0131n nas\u0131l bi\u00e7imlendirilece\u011fini belirler. Log4j&#8217;deki <code>Layout<\/code> kavram\u0131na benzer. <code>PatternLayoutEncoder<\/code> en yayg\u0131n olan\u0131d\u0131r.<br \/>\n*   <strong><code>Level<\/code>:<\/strong> Log mesaj\u0131n\u0131n \u00f6nem derecesini belirtir. Logback seviyeleri: <code>TRACE<\/code>, <code>DEBUG<\/code>, <code>INFO<\/code>, <code>WARN<\/code>, <code>ERROR<\/code>.<\/p>\n<h5>Logback Yap\u0131land\u0131rmas\u0131<\/h5>\n<p>Logback genellikle <code>logback.xml<\/code> veya <code>logback-spring.xml<\/code> (Spring Boot i\u00e7in) dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131r\u0131l\u0131r. Bu dosya da s\u0131n\u0131f yolunda bulunmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-xml\"><!-- logback.xml -->\n<configuration>\n    <!-- Konsol Appender -->\n    <appender name=\"STDOUT\" 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    <!-- Dosya Appender (boyuta g\u00f6re dosya d\u00f6nd\u00fcrme) -->\n    <appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>logs\/my_app_logback.log<\/file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n            <!-- Her g\u00fcn yeni bir dosya olu\u015ftur, dosya boyutu 10MB'\u0131 a\u015farsa yeni bir dosya olu\u015ftur -->\n            <fileNamePattern>logs\/my_app_logback-%d{yyyy-MM-dd}.%i.log.gz<\/fileNamePattern>\n            <maxFileSize>10MB<\/maxFileSize>\n            <maxHistory>30<\/maxHistory> <!-- Son 30 g\u00fcn\u00fc tut -->\n            <totalSizeCap>1GB<\/totalSizeCap> <!-- Toplam log boyutu \u00fcst s\u0131n\u0131r\u0131 -->\n        <\/rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <!-- Belirli bir paketin veya s\u0131n\u0131f\u0131n log seviyesini ayarlayabiliriz -->\n    <logger name=\"com.example.myapp.controller\" level=\"DEBUG\" additivity=\"false\">\n        <appender-ref ref=\"STDOUT\"\/>\n    <\/logger>\n\n    <!-- Root Logger -->\n    <root level=\"INFO\">\n        <appender-ref ref=\"STDOUT\"\/>\n        <appender-ref ref=\"FILE\"\/>\n    <\/root>\n<\/configuration><\/code><\/pre>\n<h5>Logback Kullan\u0131m \u00d6rne\u011fi<\/h5>\n<p>Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131:<\/p>\n<pre><code class=\"language-xml\"><dependency>\n    <groupId>ch.qos.logback<\/groupId>\n    <artifactId>logback-classic<\/artifactId>\n    <version>1.5.6<\/version>\n<\/dependency>\n<!-- logback-classic, slf4j-api'yi de i\u00e7erir --><\/code><\/pre>\n<pre><code class=\"language-java\">import org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class LogbackLoggerExample {\n\n    \/\/ SLF4J aray\u00fcz\u00fcn\u00fc kullanarak Logger'\u0131 al\u0131yoruz, arka planda Logback kullan\u0131l\u0131yor\n    private static final Logger logger = LoggerFactory.getLogger(LogbackLoggerExample.class);\n\n    public static void main(String[] args) {\n        logger.trace(\"Bu bir TRACE mesaj\u0131d\u0131r.\");\n        logger.debug(\"Bu bir DEBUG mesaj\u0131d\u0131r.\");\n        logger.info(\"Uygulama ba\u015flat\u0131l\u0131yor...\");\n        logger.warn(\"Bu bir uyar\u0131 mesaj\u0131d\u0131r.\");\n\n        try {\n            int result = divide(10, 0);\n            logger.info(\"B\u00f6lme sonucu: \" + result);\n        } catch (ArithmeticException e) {\n            logger.error(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 olu\u015ftu!\", e);\n        }\n\n        logger.error(\"Uygulama kritik bir hata nedeniyle kapat\u0131l\u0131yor.\");\n    }\n\n    public static int divide(int a, int b) {\n        return a \/ b;\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte <code>org.slf4j.Logger<\/code> kulland\u0131\u011f\u0131m\u0131za dikkat edin. Bunun nedeni, Logback&#8217;in genellikle SLF4J ile birlikte kullan\u0131lmas\u0131d\u0131r.<\/p>\n<h4>SLF4J (Simple Logging Facade for Java)<\/h4>\n<p>SLF4J, Java uygulamalar\u0131 i\u00e7in basit bir loglama cephesi (facade) veya soyutlama katman\u0131d\u0131r. Do\u011frudan bir loglama \u00e7er\u00e7evesi de\u011fildir; bunun yerine, geli\u015ftiricilerin kodlar\u0131nda belirli bir loglama \u00e7er\u00e7evesine (Log4j, Logback, JUL vb.) ba\u011f\u0131ml\u0131 kalmadan loglama yapmalar\u0131n\u0131 sa\u011flar.<\/p>\n<h5>Neden SLF4J Kullan\u0131lmal\u0131?<\/h5>\n<p>*   <strong>Esneklik:<\/strong> Uygulaman\u0131z\u0131n loglama altyap\u0131s\u0131n\u0131 istedi\u011finiz zaman de\u011fi\u015ftirebilirsiniz (\u00f6rne\u011fin, Log4j&#8217;den Logback&#8217;e ge\u00e7mek) kodunuzu de\u011fi\u015ftirmeden. Sadece ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve yap\u0131land\u0131rma dosyas\u0131n\u0131 g\u00fcncellersiniz.<br \/>\n*   <strong>K\u00fct\u00fcphane Uyumlu\u011fu:<\/strong> Farkl\u0131 \u00fc\u00e7\u00fcnc\u00fc parti k\u00fct\u00fcphaneler farkl\u0131 loglama \u00e7er\u00e7eveleri kullanabilir. SLF4J, t\u00fcm bu farkl\u0131 \u00e7er\u00e7eveleri tek bir standart aray\u00fcz alt\u0131nda birle\u015ftirerek &#8220;loglama karma\u015fas\u0131n\u0131&#8221; \u00f6nler.<br \/>\n*   <strong>Performans:<\/strong> Parametreli log mesajlar\u0131 (<code>logger.debug(\"Mesaj: {}\", parameter);<\/code>) sayesinde, log seviyesi uygun olmad\u0131\u011f\u0131nda gereksiz String birle\u015ftirme i\u015flemlerini \u00f6nler.<\/p>\n<h5>SLF4J Kullan\u0131m \u00d6rne\u011fi (Logback ile Birlikte)<\/h5>\n<p>SLF4J kullanmak i\u00e7in iki ana ba\u011f\u0131ml\u0131l\u0131\u011fa ihtiyac\u0131n\u0131z vard\u0131r: <code>slf4j-api<\/code> ve kullanmak istedi\u011finiz loglama \u00e7er\u00e7evesinin SLF4J uygulamas\u0131 (\u00f6rne\u011fin, <code>logback-classic<\/code> Logback i\u00e7in, <code>log4j-slf4j-impl<\/code> Log4j 2 i\u00e7in).<\/p>\n<p>Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131 (Logback ile):<\/p>\n<pre><code class=\"language-xml\"><dependency>\n    <groupId>org.slf4j<\/groupId>\n    <artifactId>slf4j-api<\/artifactId>\n    <version>2.0.13<\/version>\n<\/dependency>\n<dependency>\n    <groupId>ch.qos.logback<\/groupId>\n    <artifactId>logback-classic<\/artifactId>\n    <version>1.5.6<\/version>\n    <!-- logback-classic, slf4j-api'yi otomatik olarak getirir, \n         bu y\u00fczden yukar\u0131daki slf4j-api ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na do\u011frudan ihtiyac\u0131m\u0131z olmayabilir.\n         Ancak a\u00e7\u0131k\u00e7a belirtmek iyi bir pratiktir. -->\n<\/dependency><\/code><\/pre>\n<p>Java kodu:<\/p>\n<pre><code class=\"language-java\">import org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class Slf4jExample {\n\n    private static final Logger logger = LoggerFactory.getLogger(Slf4jExample.class);\n\n    public static void main(String[] args) {\n        String userName = \"Alice\";\n        int userId = 123;\n\n        logger.info(\"Kullan\u0131c\u0131 {} (ID: {}) sisteme giri\u015f yapt\u0131.\", userName, userId);\n        logger.debug(\"Kullan\u0131c\u0131 detaylar\u0131 getiriliyor...\");\n\n        try {\n            processData(null);\n        } catch (IllegalArgumentException e) {\n            logger.error(\"Veri i\u015flenirken hata olu\u015ftu: {}\", e.getMessage(), e); \/\/ Son parametre throwable i\u00e7in\n        }\n    }\n\n    public static void processData(String data) {\n        if (data == null) {\n            throw new IllegalArgumentException(\"\u0130\u015flenecek veri bo\u015f olamaz.\");\n        }\n        logger.info(\"Veri ba\u015far\u0131yla i\u015flendi.\");\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, kodunuzda sadece <code>org.slf4j.Logger<\/code> ve <code>LoggerFactory<\/code> kullan\u0131yorsunuz. Arka planda hangi loglama \u00e7er\u00e7evesinin \u00e7al\u0131\u015ft\u0131\u011f\u0131 (Logback, Log4j 2 veya JUL) ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131za ve yap\u0131land\u0131rman\u0131za ba\u011fl\u0131d\u0131r. Bu sayede, uygulaman\u0131z\u0131n loglama altyap\u0131s\u0131n\u0131 de\u011fi\u015ftirmek istedi\u011finizde Java kodunuzu yeniden derlemenize gerek kalmaz.<\/p>\n<h3>Loglama Seviyeleri (Logging Levels)<\/h3>\n<p>Loglama seviyeleri, bir log mesaj\u0131n\u0131n \u00f6nemini ve aciliyetini belirtmek i\u00e7in kullan\u0131l\u0131r. Bu seviyeler sayesinde, \u00fcretim ortam\u0131nda sadece kritik hatalar\u0131, geli\u015ftirme ortam\u0131nda ise daha detayl\u0131 hata ay\u0131klama mesajlar\u0131n\u0131 g\u00f6rebiliriz. \u00c7o\u011fu loglama \u00e7er\u00e7evesi benzer seviyeleri kullan\u0131r:<\/p>\n<p>*   <strong><code>OFF<\/code>:<\/strong> Hi\u00e7bir log mesaj\u0131 kaydedilmez. Loglama tamamen devre d\u0131\u015f\u0131 b\u0131rak\u0131l\u0131r.<br \/>\n*   <strong><code>FATAL<\/code> (Log4j 2):<\/strong> Uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 tamamen durduran, kurtar\u0131lamaz bir hata. Genellikle uygulaman\u0131n \u00e7\u00f6kmesine yol a\u00e7ar.<br \/>\n*   <strong><code>ERROR<\/code>:<\/strong> Uygulaman\u0131n normal \u00e7al\u0131\u015fmas\u0131n\u0131 engelleyen, ancak mutlaka durdurmayan ciddi bir hata. Bir i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131na neden olur.<br \/>\n*   <strong><code>WARN<\/code>:<\/strong> Potansiyel bir sorun veya beklenmedik bir durum. Uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 etkilemez ancak gelecekte sorunlara yol a\u00e7abilir.<br \/>\n*   <strong><code>INFO<\/code>:<\/strong> Uygulaman\u0131n genel ilerleyi\u015fi hakk\u0131nda bilgi veren mesajlar. Kullan\u0131c\u0131 giri\u015fleri, uygulaman\u0131n ba\u015flat\u0131lmas\u0131\/kapat\u0131lmas\u0131 gibi olaylar.<br \/>\n*   <strong><code>DEBUG<\/code>:<\/strong> Geli\u015ftirme s\u0131ras\u0131nda hata ay\u0131klama i\u00e7in kullan\u0131lan detayl\u0131 bilgiler. De\u011fi\u015fken de\u011ferleri, metod \u00e7a\u011fr\u0131lar\u0131 gibi.<br \/>\n*   <strong><code>TRACE<\/code>:<\/strong> <code>DEBUG<\/code> seviyesinden daha da detayl\u0131 bilgiler. \u00c7ok ince taneli i\u015flem ad\u0131mlar\u0131. Genellikle sadece \u00e7ok \u00f6zel durumlarda kullan\u0131l\u0131r.<br \/>\n*   <strong><code>ALL<\/code>:<\/strong> T\u00fcm log mesajlar\u0131 kaydedilir.<\/p>\n<p>Loglama seviyeleri hiyerar\u015fiktir. Bir logger&#8217;\u0131n seviyesi <code>INFO<\/code> olarak ayarland\u0131\u011f\u0131nda, sadece <code>INFO<\/code>, <code>WARN<\/code>, <code>ERROR<\/code> ve <code>FATAL<\/code> seviyesindeki mesajlar i\u015flenir. <code>DEBUG<\/code> ve <code>TRACE<\/code> seviyesindeki mesajlar g\u00f6z ard\u0131 edilir.<\/p>\n<h3>Loglama Yap\u0131land\u0131rmas\u0131 (Configuration)<\/h3>\n<p>Loglama \u00e7er\u00e7evelerinin g\u00fcc\u00fc, esnek yap\u0131land\u0131rma se\u00e7eneklerinden gelir. Yap\u0131land\u0131rma, loglar\u0131n nereye yaz\u0131laca\u011f\u0131n\u0131 (konsol, dosya, veritaban\u0131 vb.), hangi formatta olaca\u011f\u0131n\u0131, hangi seviyeden itibaren loglanaca\u011f\u0131n\u0131 ve log dosyalar\u0131n\u0131n nas\u0131l y\u00f6netilece\u011fini belirler.<\/p>\n<p>Yap\u0131land\u0131rma genellikle harici dosyalar arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r:<br \/>\n*   <strong>Log4j 2:<\/strong> <code>log4j2.xml<\/code>, <code>log4j2.yaml<\/code>, <code>log4j2.json<\/code><br \/>\n*   <strong>Logback:<\/strong> <code>logback.xml<\/code>, <code>logback-spring.xml<\/code><br \/>\n*   <strong>JUL:<\/strong> <code>logging.properties<\/code><\/p>\n<p>Bu dosyalar genellikle uygulaman\u0131n s\u0131n\u0131f yolu (classpath) i\u00e7inde bulunur.<\/p>\n<h5>Yap\u0131land\u0131rma \u00d6rnekleri (Tekrar Hat\u0131rlatma)<\/h5>\n<p>Yukar\u0131daki Log4j 2 ve Logback \u00f6rneklerinde detayl\u0131 yap\u0131land\u0131rma dosyalar\u0131 verilmi\u015ftir. \u00d6nemli k\u0131s\u0131mlar:<\/p>\n<p>*   <strong>Appender&#8217;lar:<\/strong> Loglar\u0131n yaz\u0131laca\u011f\u0131 hedefleri tan\u0131mlar.<br \/>\n    *   <code>ConsoleAppender<\/code>: Konsola yazar.<br \/>\n    *   <code>FileAppender<\/code>: Tek bir dosyaya yazar.<br \/>\n    *   <code>RollingFileAppender<\/code> (Log4j 2) \/ <code>RollingFileAppender<\/code> (Logback): Belirli bir boyuta veya zamana ula\u015ft\u0131\u011f\u0131nda log dosyas\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr (eski dosyay\u0131 ar\u015fivler ve yeni bir dosya olu\u015fturur). Bu, log dosyalar\u0131n\u0131n \u00e7ok b\u00fcy\u00fcmesini engeller.<br \/>\n    *   Di\u011fer Appender&#8217;lar: <code>SMTPAppender<\/code> (e-posta g\u00f6nderir), <code>JDBCAppender<\/code> (veritaban\u0131na yazar), <code>JMSAppender<\/code> (JMS kuyru\u011funa g\u00f6nderir) vb.<br \/>\n*   <strong>Layout&#8217;lar \/ Encoder&#8217;lar:<\/strong> Log mesajlar\u0131n\u0131n format\u0131n\u0131 belirler. <code>PatternLayout<\/code> (Log4j 2) ve <code>PatternLayoutEncoder<\/code> (Logback) en yayg\u0131n olanlard\u0131r ve <code>%d<\/code> (tarih), <code>%t<\/code> (thread ad\u0131), <code>%-5level<\/code> (log seviyesi), <code>%logger<\/code> (logger ad\u0131), <code>%msg<\/code> (mesaj), <code>%n<\/code> (yeni sat\u0131r) gibi desen kodlar\u0131 kullan\u0131larak \u00e7\u0131kt\u0131 \u00f6zelle\u015ftirilebilir.<br \/>\n*   <strong>Logger&#8217;lar:<\/strong> Belirli paketler veya s\u0131n\u0131flar i\u00e7in log seviyeleri ve Appender referanslar\u0131 tan\u0131mlan\u0131r.<br \/>\n    *   <code>Root Logger<\/code>: T\u00fcm log mesajlar\u0131 i\u00e7in varsay\u0131lan davran\u0131\u015f\u0131 belirler. Genellikle t\u00fcm Appender&#8217;lara y\u00f6nlendirilir.<br \/>\n    *   Spesifik Logger&#8217;lar: Belirli bir paket veya s\u0131n\u0131f i\u00e7in <code>level<\/code> \u00f6zniteli\u011fi ile \u00f6zel bir log seviyesi ayarlanabilir. <code>additivity=\"false\"<\/code> ayar\u0131, bu logger&#8217;\u0131n mesajlar\u0131n\u0131n Root Logger&#8217;a iletilmesini engeller. Bu, loglar\u0131n birden fazla kez yaz\u0131lmas\u0131n\u0131 \u00f6nlemek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>\u0130yi Loglama Pratikleri (Best Practices)<\/h3>\n<p>Etkili loglama, sadece bir loglama \u00e7er\u00e7evesi kullanmaktan ibaret de\u011fildir. Loglar\u0131n\u0131z\u0131 nas\u0131l olu\u015fturdu\u011funuz, y\u00f6netti\u011finiz ve analiz etti\u011finiz de \u00f6nemlidir.<\/p>\n<p>1.  <strong>Anlaml\u0131 ve Ba\u011flam \u0130\u00e7eren Mesajlar Yaz\u0131n:<\/strong> Log mesajlar\u0131 k\u0131sa ve net olmal\u0131, ancak ayn\u0131 zamanda yeterli ba\u011flam\u0131 sa\u011flamal\u0131d\u0131r. Sadece &#8220;Hata olu\u015ftu&#8221; demek yerine, &#8220;Kullan\u0131c\u0131 ID 123 i\u00e7in sipari\u015f i\u015flenirken veritaban\u0131 ba\u011flant\u0131 hatas\u0131 olu\u015ftu&#8221; gibi daha a\u00e7\u0131klay\u0131c\u0131 mesajlar kullan\u0131n.<br \/>\n2.  <strong>Do\u011fru Log Seviyelerini Kullan\u0131n:<\/strong> Her mesaj\u0131n amac\u0131na uygun bir seviye atay\u0131n.<br \/>\n    *   <code>TRACE\/DEBUG<\/code>: Geli\u015ftirme ve hata ay\u0131klama s\u0131ras\u0131nda detayl\u0131 bilgi.<br \/>\n    *   <code>INFO<\/code>: Uygulaman\u0131n normal ak\u0131\u015f\u0131n\u0131 g\u00f6steren \u00f6nemli olaylar.<br \/>\n    *   <code>WARN<\/code>: Potansiyel sorunlar veya beklenmeyen ancak tolere edilebilir durumlar.<br \/>\n    *   <code>ERROR<\/code>: Bir i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131na neden olan hatalar.<br \/>\n    *   <code>FATAL<\/code>: Uygulaman\u0131n \u00e7\u00f6kmesine neden olan kritik hatalar.<br \/>\n3.  <strong>Hassas Bilgileri Loglamaktan Ka\u00e7\u0131n\u0131n:<\/strong> Parolalar, kredi kart\u0131 numaralar\u0131, ki\u015fisel kimlik bilgileri (PII) gibi hassas verileri loglara yazmaktan kesinlikle ka\u00e7\u0131n\u0131n. Bu, g\u00fcvenlik a\u00e7\u0131klar\u0131 ve GDPR\/KVKK gibi d\u00fczenlemelerle uyumsuzluk yaratabilir. Gerekirse bu bilgileri maskeleyin veya anonimle\u015ftirin.<br \/>\n4.  <strong>Parametreli Log Mesajlar\u0131 Kullan\u0131n (SLF4J ile):<\/strong> <code>logger.debug(\"Kullan\u0131c\u0131: {}\", username);<\/code> \u015feklinde parametreleri kullanarak String birle\u015ftirmeden ka\u00e7\u0131n\u0131n. Bu, log seviyesi uygun olmad\u0131\u011f\u0131nda String birle\u015ftirme maliyetini ortadan kald\u0131rarak performans\u0131 art\u0131r\u0131r.<br \/>\n5.  <strong>Exception&#8217;lar\u0131 Do\u011fru Loglay\u0131n:<\/strong> Hata durumlar\u0131nda, <code>logger.error(\"Hata mesaj\u0131\", e);<\/code> \u015feklinde <code>Exception<\/code> nesnesini log metoduna ikinci parametre olarak ge\u00e7irin. Bu, stack trace&#8217;in loglanmas\u0131n\u0131 sa\u011flar ve hatan\u0131n k\u00f6k nedenini bulmay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n6.  <strong>Asenkron Loglama Kullan\u0131n:<\/strong> \u00d6zellikle y\u00fcksek performans gerektiren uygulamalarda, loglama i\u015fleminin ana uygulama i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 engellemesini \u00f6nlemek i\u00e7in asenkron loglama yap\u0131land\u0131rmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Log4j 2 ve Logback, asenkron Appender&#8217;lar sunar.<br \/>\n7.  <strong>Loglar\u0131 Yap\u0131land\u0131r\u0131lm\u0131\u015f Formatlarda Tutun (JSON gibi):<\/strong> Da\u011f\u0131t\u0131k sistemlerde ve log analizi ara\u00e7lar\u0131yla (ELK Stack, Splunk) \u00e7al\u0131\u015f\u0131rken, loglar\u0131 JSON gibi yap\u0131land\u0131r\u0131lm\u0131\u015f bir formatta tutmak, loglar\u0131n otomatik olarak ayr\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 ve sorgulanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n8.  <strong>Korelasyon ID&#8217;leri Kullan\u0131n:<\/strong> Mikroservis mimarilerinde veya da\u011f\u0131t\u0131k sistemlerde, bir iste\u011fin birden fazla servis aras\u0131nda nas\u0131l ilerledi\u011fini takip etmek zordur. Her istek i\u00e7in benzersiz bir &#8220;korelasyon ID&#8221; olu\u015fturup, bu ID&#8217;yi t\u00fcm log mesajlar\u0131na dahil etmek, bir iste\u011fin t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc izlemenizi sa\u011flar.<br \/>\n9.  <strong>Merkezi Log Y\u00f6netimi:<\/strong> \u00dcretim ortamlar\u0131nda, loglar\u0131 tek bir yerden toplamak, depolamak, aramak ve analiz etmek i\u00e7in merkezi bir log y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc (\u00f6rne\u011fin, ELK Stack: Elasticsearch, Logstash, Kibana) kullan\u0131n.<\/p>\n<h3>\u00d6rnek Uygulama: SLF4J + Logback Kullan\u0131m\u0131<\/h3>\n<p>\u015eimdi, SLF4J ve Logback&#8217;i birle\u015ftirerek kapsaml\u0131 bir \u00f6rnek olu\u015ftural\u0131m.<\/p>\n<p><strong>1. Maven <code>pom.xml<\/code> Ba\u011f\u0131ml\u0131l\u0131klar\u0131:<\/strong><\/p>\n<pre><code class=\"language-xml\"><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0<\/modelVersion>\n\n    <groupId>com.example<\/groupId>\n    <artifactId>java-logging-example<\/artifactId>\n    <version>1.0-SNAPSHOT<\/version>\n\n    <properties>\n        <maven.compiler.source>11<\/maven.compiler.source>\n        <maven.compiler.target>11<\/maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8<\/project.build.sourceEncoding>\n        <slf4j.version>2.0.13<\/slf4j.version>\n        <logback.version>1.5.6<\/logback.version>\n    <\/properties>\n\n    <dependencies>\n        <!-- SLF4J API -->\n        <dependency>\n            <groupId>org.slf4j<\/groupId>\n            <artifactId>slf4j-api<\/artifactId>\n            <version>${slf4j.version}<\/version>\n        <\/dependency>\n        <!-- Logback Classic (SLF4J'nin Logback uygulamas\u0131) -->\n        <dependency>\n            <groupId>ch.qos.logback<\/groupId>\n            <artifactId>logback-classic<\/artifactId>\n            <version>${logback.version}<\/version>\n        <\/dependency>\n        <!-- Logback Core (logback-classic taraf\u0131ndan otomatik olarak getirilir, ancak a\u00e7\u0131k\u00e7a belirtmek zarar vermez) -->\n        <dependency>\n            <groupId>ch.qos.logback<\/groupId>\n            <artifactId>logback-core<\/artifactId>\n            <version>${logback.version}<\/version>\n        <\/dependency>\n    <\/dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-compiler-plugin<\/artifactId>\n                <version>3.8.1<\/version>\n                <configuration>\n                    <source>${maven.compiler.source}<\/source>\n                    <target>${maven.compiler.target}<\/target>\n                <\/configuration>\n            <\/plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-jar-plugin<\/artifactId>\n                <version>3.2.0<\/version>\n                <configuration>\n                    <archive>\n                        <manifest>\n                            <addClasspath>true<\/addClasspath>\n                            <mainClass>com.example.logging.Application<\/mainClass>\n                        <\/manifest>\n                    <\/archive>\n                <\/configuration>\n            <\/plugin>\n        <\/plugins>\n    <\/build>\n<\/project><\/code><\/pre>\n<p><strong>2. <code>src\/main\/resources\/logback.xml<\/code> Yap\u0131land\u0131rmas\u0131:<\/strong><\/p>\n<pre><code class=\"language-xml\"><configuration>\n    <property name=\"LOG_DIR\" value=\"logs\"\/>\n    <property name=\"LOG_FILE_NAME\" value=\"app.log\"\/>\n\n    <!-- Konsol Appender -->\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <!-- Rolling File Appender (g\u00fcnl\u00fck d\u00f6nd\u00fcrme ve boyut kontrol\u00fc) -->\n    <appender name=\"ROLLING_FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_DIR}\/${LOG_FILE_NAME}<\/file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_DIR}\/archived\/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.%i.gz<\/fileNamePattern>\n            <maxFileSize>10MB<\/maxFileSize>\n            <maxHistory>7<\/maxHistory> <!-- Son 7 g\u00fcn\u00fcn loglar\u0131n\u0131 sakla -->\n            <totalSizeCap>1GB<\/totalSizeCap> <!-- Toplam ar\u015fivlenmi\u015f log boyutu 1GB'\u0131 ge\u00e7mesin -->\n        <\/rollingPolicy>\n        <encoder>\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <!-- JSON format\u0131nda loglama i\u00e7in ba\u015fka bir Appender (ELK Stack gibi ara\u00e7lar i\u00e7in ideal) -->\n    <appender name=\"JSON_FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_DIR}\/json_logs\/app-json.log<\/file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n            <fileNamePattern>${LOG_DIR}\/json_logs\/archived\/app-json.%d{yyyy-MM-dd}.%i.json.gz<\/fileNamePattern>\n            <maxFileSize>10MB<\/maxFileSize>\n            <maxHistory>7<\/maxHistory>\n            <totalSizeCap>1GB<\/totalSizeCap>\n        <\/rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <pattern>{\"timestamp\":\"%d{yyyy-MM-dd HH:mm:ss.SSS}\", \"level\":\"%level\", \"thread\":\"%thread\", \"logger\":\"%logger{36}\", \"message\":\"%msg\"}%n<\/pattern>\n        <\/encoder>\n    <\/appender>\n\n    <!-- Belirli bir paketin log seviyesi -->\n    <logger name=\"com.example.logging.service\" level=\"DEBUG\" additivity=\"false\">\n        <appender-ref ref=\"CONSOLE\"\/>\n        <appender-ref ref=\"ROLLING_FILE\"\/>\n    <\/logger>\n\n    <!-- Root Logger: Varsay\u0131lan olarak t\u00fcm loglar\u0131 y\u00f6netir -->\n    <root level=\"INFO\">\n        <appender-ref ref=\"CONSOLE\"\/>\n        <appender-ref ref=\"ROLLING_FILE\"\/>\n        <appender-ref ref=\"JSON_FILE\"\/>\n    <\/root>\n<\/configuration><\/code><\/pre>\n<p><strong>3. <code>src\/main\/java\/com\/example\/logging\/Application.java<\/code> S\u0131n\u0131f\u0131:<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.logging;\n\nimport com.example.logging.service.UserService;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class Application {\n\n    \/\/ SLF4J Logger'\u0131 kullanarak loglama yap\u0131yoruz\n    private static final Logger logger = LoggerFactory.getLogger(Application.class);\n\n    public static void main(String[] args) {\n        logger.info(\"Uygulama ba\u015flat\u0131l\u0131yor...\");\n\n        UserService userService = new UserService();\n\n        \/\/ Ba\u015far\u0131l\u0131 bir kullan\u0131c\u0131 i\u015flemi\n        userService.createUser(\"Alice\", \"alice@example.com\");\n\n        \/\/ Hatal\u0131 bir kullan\u0131c\u0131 i\u015flemi\n        try {\n            userService.createUser(\"Bob\", \"invalid-email\");\n        } catch (IllegalArgumentException e) {\n            logger.error(\"Kullan\u0131c\u0131 olu\u015fturulurken bir hata olu\u015ftu: {}\", e.getMessage(), e);\n        }\n\n        \/\/ Farkl\u0131 log seviyelerinde mesajlar\n        logger.debug(\"Debug seviyesinde bir mesaj. Sadece debug seviyesi etkinse g\u00f6r\u00fcn\u00fcr.\");\n        logger.trace(\"Trace seviyesinde bir mesaj. En detayl\u0131 seviyedir.\");\n        logger.warn(\"Dikkat: Uygulama \u00f6nbelle\u011fi yenilenemedi.\");\n\n        logger.info(\"Uygulama ba\u015far\u0131yla tamamland\u0131.\");\n    }\n}<\/code><\/pre>\n<p><strong>4. <code>src\/main\/java\/com\/example\/logging\/service\/UserService.java<\/code> S\u0131n\u0131f\u0131:<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.logging.service;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class UserService {\n\n    \/\/ Servis katman\u0131 i\u00e7in ayr\u0131 bir logger\n    private static final Logger logger = LoggerFactory.getLogger(UserService.class);\n\n    public void createUser(String name, String email) {\n        logger.debug(\"Kullan\u0131c\u0131 olu\u015fturma iste\u011fi al\u0131nd\u0131: \u0130sim={}, E-posta={}\", name, email);\n\n        if (name == null || name.trim().isEmpty()) {\n            logger.error(\"Kullan\u0131c\u0131 ad\u0131 bo\u015f olamaz.\");\n            throw new IllegalArgumentException(\"Kullan\u0131c\u0131 ad\u0131 bo\u015f olamaz.\");\n        }\n\n        if (!isValidEmail(email)) {\n            logger.warn(\"Ge\u00e7ersiz e-posta format\u0131 alg\u0131land\u0131: {}\", email);\n            throw new IllegalArgumentException(\"Ge\u00e7ersiz e-posta format\u0131.\");\n        }\n\n        \/\/ Ger\u00e7ekte burada veritaban\u0131na kaydetme vb. i\u015flemler olurdu.\n        logger.info(\"Kullan\u0131c\u0131 '{}' (E-posta: {}) ba\u015far\u0131yla olu\u015fturuldu.\", name, email);\n    }\n\n    private boolean isValidEmail(String email) {\n        \/\/ Basit bir e-posta do\u011frulama kontrol\u00fc\n        return email != null && email.contains(\"@\") && email.contains(\".\");\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Application<\/code> s\u0131n\u0131f\u0131 <code>INFO<\/code> seviyesinde loglarken, <code>UserService<\/code> s\u0131n\u0131f\u0131 i\u00e7in <code>logback.xml<\/code> i\u00e7inde \u00f6zel bir <code>logger<\/code> tan\u0131m\u0131 yaparak <code>DEBUG<\/code> seviyesinde loglama yapmas\u0131n\u0131 sa\u011flad\u0131k. B\u00f6ylece, uygulaman\u0131n genel ak\u0131\u015f\u0131n\u0131 <code>INFO<\/code> seviyesinde izlerken, <code>UserService<\/code> i\u00e7indeki daha detayl\u0131 ad\u0131mlar\u0131 <code>DEBUG<\/code> seviyesinde g\u00f6rebiliriz. Ayr\u0131ca, farkl\u0131 Appender&#8217;lar (konsol, metin dosyas\u0131, JSON dosyas\u0131) kullanarak loglar\u0131n farkl\u0131 hedeflere ve formatlarda yaz\u0131lmas\u0131n\u0131 g\u00f6sterdik.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Java&#8217;da loglama, modern yaz\u0131l\u0131m geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Uygulamalar\u0131n\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 anlamak, hatalar\u0131 h\u0131zl\u0131ca tespit etmek ve performans sorunlar\u0131n\u0131 gidermek i\u00e7in sa\u011flam bir loglama stratejisi olu\u015fturmak hayati \u00f6neme sahiptir. <code>java.util.logging<\/code> basit senaryolar i\u00e7in yeterli olsa da, Log4j 2 ve Logback gibi \u00fc\u00e7\u00fcnc\u00fc parti \u00e7er\u00e7eveler, daha fazla esneklik, performans ve zengin \u00f6zellikler sunar. SLF4J gibi bir soyutlama katman\u0131 kullanmak, uygulaman\u0131z\u0131 belirli bir loglama \u00e7er\u00e7evesine ba\u011f\u0131ml\u0131 k\u0131lmadan gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 diren\u00e7li hale getirir.<\/p>\n<p>Unutmay\u0131n ki iyi loglama pratikleri, sadece loglama \u00e7er\u00e7evesini do\u011fru yap\u0131land\u0131rmakla kalmaz, ayn\u0131 zamanda anlaml\u0131, ba\u011flam i\u00e7eren ve do\u011fru seviyelerde log mesajlar\u0131 yazmay\u0131 da i\u00e7erir. Bu sayede, loglar\u0131n\u0131z yaln\u0131zca bir dosya y\u0131\u011f\u0131n\u0131 olmaktan \u00e7\u0131kar ve uygulaman\u0131z\u0131n kalbine giden de\u011ferli bir rehber haline gelir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler\nJava uygulamalar\u0131 geli\u015ftirirken, kodun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak, hatalar\u0131 tespit","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-31219","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&#039;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/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:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java&#039;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler\" \/>\n<meta property=\"og:description\" content=\"Java&#039;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler Java uygulamalar\u0131 geli\u015ftirirken, kodun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak, hatalar\u0131 tespit\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-07T06:41: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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler\",\"datePublished\":\"2025-10-07T06:41:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\"},\"wordCount\":2527,\"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\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\",\"name\":\"Java'da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-07T06:41:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler\"}]},{\"@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'da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/","og_locale":"tr_TR","og_type":"article","og_title":"Java'da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler","og_description":"Java'da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler Java uygulamalar\u0131 geli\u015ftirirken, kodun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak, hatalar\u0131 tespit","og_url":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-07T06:41:16+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler","datePublished":"2025-10-07T06:41:16+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/"},"wordCount":2527,"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\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/","url":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/","name":"Java'da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-07T06:41:16+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javada-loglama-kapsamli-bir-bakis-ve-ornekler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java&#8217;da Loglama: Kapsaml\u0131 Bir Bak\u0131\u015f ve \u00d6rnekler"}]},{"@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\/31219","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=31219"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31219\/revisions"}],"predecessor-version":[{"id":31220,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31219\/revisions\/31220"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}