{"id":33812,"date":"2025-11-07T11:31:23","date_gmt":"2025-11-07T08:31:23","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/"},"modified":"2025-11-07T11:31:23","modified_gmt":"2025-11-07T08:31:23","slug":"pythonda-gelismis-loglama-uygulamali-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/","title":{"rendered":"Python&#8217;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<style>\n        \/* Temel stil ayarlamalar\u0131 *\/\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            max-width: 900px;\n            margin: 2em auto;\n            padding: 0 1em;\n            background-color: #f9f9f9;\n        }\n        h2 {\n            color: #2c3e50;\n            border-bottom: 2px solid #3498db;\n            padding-bottom: 0.5em;\n            margin-top: 2em;\n        }\n        h3 {\n            color: #34495e;\n            margin-top: 1.5em;\n        }\n        p {\n            margin-bottom: 1em;\n        }\n        pre {\n            background-color: #ecf0f1;\n            border: 1px solid #bdc3c7;\n            padding: 1em;\n            border-radius: 5px;\n            overflow-x: auto;\n        }\n        code {\n            font-family: 'Fira Code', 'Cascadia Code', 'Consolas', monospace;\n            font-size: 0.9em;\n            color: #c0392b; \/* K\u0131rm\u0131z\u0131ms\u0131 ton *\/\n        }\n        pre code {\n            color: #2c3e50; \/* Koyu gri *\/\n        }\n        ul, ol {\n            margin-bottom: 1em;\n            padding-left: 1.5em;\n        }\n        li {\n            margin-bottom: 0.5em;\n        }\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 1em;\n        }\n        th, td {\n            border: 1px solid #ddd;\n            padding: 8px;\n            text-align: left;\n        }\n        th {\n            background-color: #f2f2f2;\n        }\n        .expert-tip {\n            background-color: #e8f6f3;\n            border-left: 5px solid #1abc9c;\n            padding: 1em;\n            margin: 1.5em 0;\n            border-radius: 4px;\n            font-style: italic;\n        }\n        .expert-tip strong {\n            color: #1abc9c;\n        }\n        .faq-section strong {\n            color: #3498db;\n        }<\/p>\n<p>        \/* Mobil uyumluluk i\u00e7in medya sorgusu *\/\n        @media (max-width: 768px) {\n            body {\n                margin: 1em auto;\n                padding: 0 0.5em;\n            }\n            h2 {\n                font-size: 1.5em;\n            }\n            h3 {\n                font-size: 1.2em;\n            }\n            table, thead, tbody, th, td, tr {\n                display: block;\n            }\n            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }\n            tr {\n                border: 1px solid #ccc;\n                margin-bottom: 0.8em;\n            }\n            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n                text-align: right;\n            }\n            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                text-align: left;\n                font-weight: bold;\n            }\n            \/* Tablo s\u00fctun ba\u015fl\u0131klar\u0131n\u0131 td:before i\u00e7eri\u011fine e\u015fle\u015ftir *\/\n            td:nth-of-type(1):before { content: \"Seviye\"; }\n            td:nth-of-type(2):before { content: \"A\u00e7\u0131klama\"; }\n        }\n    <\/style>\n<p>Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python&#8217;da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, herhangi bir uygulaman\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 sa\u011flamak, geli\u015ftiriciler i\u00e7in kritik bir g\u00f6revdir. Bir uygulaman\u0131n &#8220;g\u00f6z\u00fc&#8221; ve &#8220;kula\u011f\u0131&#8221; niteli\u011findeki loglama, geli\u015ftirme s\u00fcrecinden \u00fcretim ortam\u0131na kadar her a\u015famada vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. Peki, loglama tam olarak nedir ve neden bu kadar \u00f6nemlidir? Loglama, uygulaman\u0131z\u0131n belirli olaylar\u0131 (hatalar, uyar\u0131lar, bilgi mesajlar\u0131 vb.) kaydetme s\u00fcrecidir. Bu kay\u0131tlar, sorun giderme, performans analizi, g\u00fcvenlik denetimi ve hatta kullan\u0131c\u0131 davran\u0131\u015flar\u0131n\u0131 anlama gibi bir\u00e7ok farkl\u0131 ama\u00e7 i\u00e7in kullan\u0131labilir.<\/p>\n<p>Loglama olmadan, uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 anlamak adeta karanl\u0131kta yol almaya benzerdi. Bir hata olu\u015ftu\u011funda, hatan\u0131n kayna\u011f\u0131n\u0131 bulmak i\u00e7in saatler harcaman\u0131z gerekebilir, \u00e7\u00fcnk\u00fc sistemde neler olup bitti\u011fine dair hi\u00e7bir kayd\u0131n\u0131z olmaz. Loglar sayesinde, uygulaman\u0131z\u0131n belirli bir anda hangi ad\u0131mlar\u0131 izledi\u011fini, hangi verilerle \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve nerede tak\u0131ld\u0131\u011f\u0131n\u0131 net bir \u015fekilde g\u00f6rebilirsiniz. Bu durum, \u00f6zellikle da\u011f\u0131t\u0131k sistemlerde veya karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131nda hayati \u00f6nem ta\u015f\u0131r. \u00d6yleyse, Python&#8217;\u0131n zengin <\/p>\n<pre><code>logging<\/pre>\n<p><\/code> mod\u00fcl\u00fcn\u00fc kullanarak bu s\u00fcreci nas\u0131l y\u00f6netece\u011fimizi inceleyelim.<\/p>\n<p>Python'\u0131n standart k\u00fct\u00fcphanesinde yer alan <\/p>\n<pre><code>logging<\/pre>\n<p><\/code> mod\u00fcl\u00fc, olduk\u00e7a esnek ve g\u00fc\u00e7l\u00fc bir loglama altyap\u0131s\u0131 sunar. Bu mod\u00fcl\u00fcn temelinde d\u00f6rt ana bile\u015fen bulunur:<\/p>\n<ul>\n<li><strong>Loggerlar (Kaydediciler):<\/strong> Log mesajlar\u0131n\u0131 olu\u015fturan ana nesnelerdir. Uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmleri i\u00e7in farkl\u0131 loggerlar tan\u0131mlayabilirsiniz. \u00d6rne\u011fin, veritaban\u0131 i\u015flemleri i\u00e7in ayr\u0131, web istekleri i\u00e7in ayr\u0131 bir logger kullanmak m\u00fcmk\u00fcnd\u00fcr. Her logger\u0131n bir seviyesi vard\u0131r ve yaln\u0131zca o seviyedeki veya daha y\u00fcksek seviyedeki mesajlar\u0131 i\u015fler.<\/li>\n<li><strong>Handlerlar (\u0130\u015fleyiciler):<\/strong> Loggerlar taraf\u0131ndan olu\u015fturulan log mesajlar\u0131n\u0131 belirli hedeflere y\u00f6nlendiren nesnelerdir. Bu hedefler bir dosya, konsol, veritaban\u0131, e-posta veya uzak bir sunucu olabilir. Bir loggera birden fazla handler ekleyerek ayn\u0131 log mesaj\u0131n\u0131 farkl\u0131 yerlere g\u00f6nderebilirsiniz.<\/li>\n<li><strong>Formatlay\u0131c\u0131lar (Formatters):<\/strong> Log mesajlar\u0131n\u0131n nas\u0131l g\u00f6r\u00fcnece\u011fini belirleyen nesnelerdir. Zaman damgas\u0131, log seviyesi, dosya ad\u0131, sat\u0131r numaras\u0131 gibi bilgileri mesaj metniyle birle\u015ftirerek okunabilir bir \u00e7\u0131kt\u0131 olu\u015ftururlar.<\/li>\n<li><strong>Filtreler (Filters):<\/strong> Log mesajlar\u0131n\u0131 daha fazla kontrol etmek i\u00e7in kullan\u0131l\u0131rlar. Belirli kriterlere uyan mesajlar\u0131n i\u015flenip i\u015flenmeyece\u011fine karar verirler. \u00d6rne\u011fin, yaln\u0131zca belirli bir kelimeyi i\u00e7eren mesajlar\u0131 loglamak i\u00e7in bir filtre kullanabilirsiniz.<\/li>\n<\/ul>\n<p>Bu bile\u015fenlerin yan\u0131 s\u0131ra, log mesajlar\u0131n\u0131n \u00f6nem derecesini belirten <a href=\"https:\/\/docs.python.org\/3\/library\/logging.html#logging-levels\" target=\"_blank\">log seviyeleri<\/a> de kritik bir rol oynar. Python'da varsay\u0131lan olarak tan\u0131mlanm\u0131\u015f be\u015f standart log seviyesi bulunmaktad\u0131r:<\/p>\n<table>\n<thead>\n<tr>\n<th>Seviye<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<pre><code>DEBUG<\/pre>\n<p><\/code><\/td>\n<td>Detayl\u0131 hata ay\u0131klama bilgileri, yaln\u0131zca bir problemi te\u015fhis ederken ilgilenilir.<\/td>\n<\/tr>\n<tr>\n<td>\n<pre><code>INFO<\/pre>\n<p><\/code><\/td>\n<td>Uygulaman\u0131n beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayan genel bilgiler.<\/td>\n<\/tr>\n<tr>\n<td>\n<pre><code>WARNING<\/pre>\n<p><\/code><\/td>\n<td>Beklenmeyen bir olay\u0131n veya gelecekte bir soruna yol a\u00e7abilecek bir durumun g\u00f6stergesi. Yaz\u0131l\u0131m halen do\u011fru \u00e7al\u0131\u015f\u0131yor.<\/td>\n<\/tr>\n<tr>\n<td>\n<pre><code>ERROR<\/pre>\n<p><\/code><\/td>\n<td>Ciddi bir problem nedeniyle yaz\u0131l\u0131m\u0131n baz\u0131 fonksiyonlar\u0131 ger\u00e7ekle\u015ftiremedi\u011fi durumlar.<\/td>\n<\/tr>\n<tr>\n<td>\n<pre><code>CRITICAL<\/pre>\n<p><\/code><\/td>\n<td>Uygulaman\u0131n kendisinin veya kritik bir bile\u015feninin tamamen durmas\u0131na neden olan ciddi hatalar.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu seviyeler, log mesajlar\u0131n\u0131n \u00f6nem s\u0131ras\u0131na g\u00f6re filtrelenmesini ve i\u015flenmesini sa\u011flar. \u00d6rne\u011fin, \u00fcretim ortam\u0131nda yaln\u0131zca <\/p>\n<pre><code>INFO<\/pre>\n<p><\/code> ve \u00fczeri seviyedeki mesajlar\u0131 loglarken, geli\u015ftirme ortam\u0131nda <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> seviyesini kullanarak daha detayl\u0131 bilgi edinebiliriz. Bu esneklik, Python loglama mekanizmas\u0131n\u0131 son derece kullan\u0131\u015fl\u0131 k\u0131lmaktad\u0131r.<\/p>\n<h2>Python'da Temel Loglama Nas\u0131l Yap\u0131l\u0131r? Uygulamal\u0131 Ad\u0131mlar<\/h2>\n<p>Python'da loglama i\u015flemine ba\u015flamak olduk\u00e7a kolayd\u0131r ve standart <\/p>\n<pre><code>logging<\/pre>\n<p><\/code> mod\u00fcl\u00fc ile ger\u00e7ekle\u015ftirilir. \u00d6ncelikle, en temel d\u00fczeyde bir loglama kurulumunu nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 ele alal\u0131m. Varsay\u0131lan olarak, <\/p>\n<pre><code>logging<\/pre>\n<p><\/code> mod\u00fcl\u00fc sadece <\/p>\n<pre><code>WARNING<\/pre>\n<p><\/code> veya daha y\u00fcksek seviyedeki mesajlar\u0131 konsola yazd\u0131r\u0131r. Ancak bu davran\u0131\u015f\u0131 kolayca de\u011fi\u015ftirebilir ve ihtiya\u00e7lar\u0131m\u0131za g\u00f6re \u00f6zelle\u015ftirebiliriz. \u0130\u015fte ad\u0131m ad\u0131m temel loglama kurulumu ve kullan\u0131m\u0131:<\/p>\n<h3>Basit Bir Logger Olu\u015fturma ve Kullanma<\/h3>\n<p>\u0130lk olarak, Python'\u0131n <\/p>\n<pre><code>logging<\/pre>\n<p><\/code> mod\u00fcl\u00fcn\u00fc i\u00e7e aktar\u0131p temel log mesajlar\u0131 g\u00f6ndermeyi deneyelim. A\u015fa\u011f\u0131daki kod blo\u011fu, \u00e7e\u015fitli log seviyelerindeki mesajlar\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 g\u00f6stermektedir:<\/p>\n<pre><code>\nimport logging\n\n# Varsay\u0131lan logger'\u0131 kullanarak log mesajlar\u0131 g\u00f6nderelim\nlogging.debug(\"Bu bir hata ay\u0131klama mesaj\u0131d\u0131r.\")\nlogging.info(\"Bu bir bilgi mesaj\u0131d\u0131r.\")\nlogging.warning(\"Bu bir uyar\u0131 mesaj\u0131d\u0131r. Dikkat edin!\")\nlogging.error(\"Bu bir hata mesaj\u0131d\u0131r. Bir \u015feyler ters gitti.\")\nlogging.critical(\"Bu kritik bir hata mesaj\u0131d\u0131r! Uygulama \u00e7\u00f6kebilir.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, konsolda muhtemelen sadece <\/p>\n<pre><code>WARNING<\/pre>\n<p><\/code>, <\/p>\n<pre><code>ERROR<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>CRITICAL<\/pre>\n<p><\/code> mesajlar\u0131n\u0131 g\u00f6receksiniz. Bunun nedeni, Python'\u0131n varsay\u0131lan loglama seviyesinin <\/p>\n<pre><code>WARNING<\/pre>\n<p><\/code> olarak ayarlanm\u0131\u015f olmas\u0131d\u0131r. <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>INFO<\/pre>\n<p><\/code> mesajlar\u0131 varsay\u0131lan olarak g\u00f6z ard\u0131 edilir.<\/p>\n<h3>Loglama Seviyesini ve Format\u0131n\u0131 Yap\u0131land\u0131rma<\/h3>\n<p>Loglama \u00e7\u0131kt\u0131s\u0131n\u0131 tamamen kontrol etmek i\u00e7in <\/p>\n<pre><code>basicConfig()<\/pre>\n<p><\/code> fonksiyonunu kullan\u0131r\u0131z. Bu fonksiyon, temel loglama ayarlar\u0131n\u0131 tek bir \u00e7a\u011fr\u0131yla yapman\u0131z\u0131 sa\u011flar. Genellikle beti\u011finizin veya uygulaman\u0131z\u0131n ba\u015flang\u0131c\u0131nda bir kez \u00e7a\u011fr\u0131lmal\u0131d\u0131r.<\/p>\n<pre><code>\nimport logging\n\n# Temel loglama yap\u0131land\u0131rmas\u0131\n# level: Loglanacak en d\u00fc\u015f\u00fck seviye\n# format: Log mesajlar\u0131n\u0131n \u00e7\u0131kt\u0131 format\u0131\n# filename: Loglar\u0131n yaz\u0131laca\u011f\u0131 dosya (iste\u011fe ba\u011fl\u0131)\nlogging.basicConfig(level=logging.DEBUG,\n                    format='%(asctime)s - %(levelname)s - %(message)s')\n\nlogging.debug(\"Art\u0131k DEBUG mesajlar\u0131n\u0131 da g\u00f6receksiniz.\")\nlogging.info(\"Bilgi mesajlar\u0131 art\u0131k loglan\u0131yor.\")\nlogging.warning(\"Hala uyar\u0131 mesajlar\u0131 al\u0131yoruz.\")\nlogging.error(\"Hatalar her zaman \u00f6nemlidir.\")\nlogging.critical(\"Kritik durumlar alarm verir.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kodda, <\/p>\n<pre><code>level=logging.DEBUG<\/pre>\n<p><\/code> diyerek en d\u00fc\u015f\u00fck loglama seviyesini <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> olarak ayarlad\u0131k. Bu, <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> ve daha y\u00fcksek t\u00fcm seviyelerdeki mesajlar\u0131n i\u015flenece\u011fi anlam\u0131na gelir. <\/p>\n<pre><code>format<\/pre>\n<p><\/code> parametresi ise log \u00e7\u0131kt\u0131s\u0131n\u0131n yap\u0131s\u0131n\u0131 belirler. Burada kullan\u0131lan baz\u0131 format belirleyiciler \u015funlard\u0131r:<\/p>\n<ul>\n<li>\n<pre><code>%(asctime)s<\/pre>\n<p><\/code>: Log mesaj\u0131n\u0131n olu\u015fturuldu\u011fu zaman.<\/li>\n<li>\n<pre><code>%(levelname)s<\/pre>\n<p><\/code>: Log mesaj\u0131n\u0131n seviyesi (DEBUG, INFO, WARNING vb.).<\/li>\n<li>\n<pre><code>%(message)s<\/pre>\n<p><\/code>: As\u0131l log mesaj\u0131.<\/li>\n<li>\n<pre><code>%(name)s<\/pre>\n<p><\/code>: Logger'\u0131n ad\u0131 (varsay\u0131lan olarak <\/p>\n<pre><code>root<\/pre>\n<p><\/code>).<\/li>\n<li>\n<pre><code>%(filename)s<\/pre>\n<p><\/code>: Loglama \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 dosya ad\u0131.<\/li>\n<li>\n<pre><code>%(lineno)d<\/pre>\n<p><\/code>: Loglama \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 sat\u0131r numaras\u0131.<\/li>\n<\/ul>\n<h3>Loglar\u0131 Bir Dosyaya Yazd\u0131rma<\/h3>\n<p>Sadece konsola log yazmak \u00e7o\u011fu zaman yeterli de\u011fildir. Kal\u0131c\u0131 kay\u0131tlar i\u00e7in loglar\u0131 bir dosyaya yazmam\u0131z gerekir. <\/p>\n<pre><code>basicConfig()<\/pre>\n<p><\/code> fonksiyonuna <\/p>\n<pre><code>filename<\/pre>\n<p><\/code> parametresini ekleyerek bunu kolayca yapabiliriz:<\/p>\n<pre><code>\nimport logging\n\n# Loglar\u0131 bir dosyaya y\u00f6nlendirme\nlogging.basicConfig(level=logging.INFO,\n                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n                    filename='uygulama.log',\n                    filemode='a') # 'a' ekleme modudur, 'w' ise her seferinde dosyay\u0131 siler\n\nlogger = logging.getLogger('ana_uygulama') # \u00d6zel bir logger olu\u015fturma\n\nlogger.info(\"Uygulama ba\u015flat\u0131l\u0131yor...\")\nlogger.debug(\"Bu mesaj dosyaya yaz\u0131lmayacak \u00e7\u00fcnk\u00fc seviye INFO.\") # Bu mesaj loglanmayacak\nlogger.warning(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 kurulurken bir sorun ya\u015fand\u0131.\")\n\ntry:\n    1 \/ 0\nexcept ZeroDivisionError:\n    logger.error(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 meydana geldi!\", exc_info=True)\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <\/p>\n<pre><code>filename='uygulama.log'<\/pre>\n<p><\/code> ile loglar\u0131n <\/p>\n<pre><code>uygulama.log<\/pre>\n<p><\/code> adl\u0131 bir dosyaya yaz\u0131lmas\u0131n\u0131 sa\u011flad\u0131k. <\/p>\n<pre><code>filemode='a'<\/pre>\n<p><\/code> ise, her uygulama \u00e7al\u0131\u015ft\u0131\u011f\u0131nda loglar\u0131n dosyan\u0131n sonuna eklenmesini sa\u011flar. E\u011fer <\/p>\n<pre><code>'w'<\/pre>\n<p><\/code> (write) kullan\u0131rsak, her seferinde dosya silinip yeniden olu\u015fturulur. Ayr\u0131ca, <\/p>\n<pre><code>logging.getLogger('ana_uygulama')<\/pre>\n<p><\/code> ile \u00f6zel bir logger olu\u015fturduk. Bu, daha mod\u00fcler ve y\u00f6netilebilir bir loglama yap\u0131s\u0131 kurmam\u0131z\u0131 sa\u011flar. Hata durumlar\u0131nda <\/p>\n<pre><code>exc_info=True<\/pre>\n<p><\/code> parametresini kullanarak istisna bilgilerini (traceback) loga dahil etmek, sorun giderme a\u00e7\u0131s\u0131ndan son derece de\u011ferlidir.<\/p>\n<aside class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> <\/p>\n<pre><code>basicConfig()<\/pre>\n<p><\/code> \u00e7a\u011fr\u0131s\u0131, varsay\u0131lan (root) logger'\u0131 yap\u0131land\u0131r\u0131r. Genellikle bu fonksiyonu uygulaman\u0131n ba\u015f\u0131nda yaln\u0131zca bir kez \u00e7a\u011f\u0131r\u0131rs\u0131n\u0131z. Birden fazla kez \u00e7a\u011f\u0131rmak beklenmedik sonu\u00e7lara yol a\u00e7abilir. Daha karma\u015f\u0131k senaryolar i\u00e7in, birden fazla handler ve logger'\u0131 programatik olarak veya bir yap\u0131land\u0131rma dosyas\u0131 kullanarak y\u00f6netmek daha iyidir.<br \/>\n    <\/aside>\n<h3>Farkl\u0131 Handler'lar\u0131 Birlikte Kullanma<\/h3>\n<p>Bazen log mesajlar\u0131n\u0131 hem konsola hem de bir dosyaya yazmak isteyebilirsiniz. Python'\u0131n loglama mod\u00fcl\u00fc bunu kolayca yapmam\u0131z\u0131 sa\u011flar. Farkl\u0131 <\/p>\n<pre><code>Handler<\/pre>\n<p><\/code> nesneleri olu\u015fturup bunlar\u0131 ayn\u0131 <\/p>\n<pre><code>Logger<\/pre>\n<p><\/code> nesnesine ekleyerek bu i\u015flevi yerine getirebiliriz.<\/p>\n<pre><code>\nimport logging\n\n# Logger olu\u015fturma\nlogger = logging.getLogger('cift_cikis_logger')\nlogger.setLevel(logging.DEBUG) # En d\u00fc\u015f\u00fck seviyeyi ayarla\n\n# Konsol handler'\u0131 olu\u015fturma\nconsole_handler = logging.StreamHandler()\nconsole_handler.setLevel(logging.INFO) # Konsola sadece INFO ve \u00fczeri mesajlar\u0131 g\u00f6nder\n\n# Dosya handler'\u0131 olu\u015fturma\nfile_handler = logging.FileHandler('cift_cikis.log')\nfile_handler.setLevel(logging.DEBUG) # Dosyaya t\u00fcm DEBUG ve \u00fczeri mesajlar\u0131 g\u00f6nder\n\n# Formatlay\u0131c\u0131 olu\u015fturma\nformatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n\n# Handler'lara formatlay\u0131c\u0131y\u0131 ekleme\nconsole_handler.setFormatter(formatter)\nfile_handler.setFormatter(formatter)\n\n# Logger'a handler'lar\u0131 ekleme\nlogger.addHandler(console_handler)\nlogger.addHandler(file_handler)\n\nlogger.debug(\"Bu bir hata ay\u0131klama mesaj\u0131d\u0131r. Sadece dosyaya gider.\")\nlogger.info(\"Bu bir bilgi mesaj\u0131d\u0131r. Hem konsola hem dosyaya gider.\")\nlogger.warning(\"Bu bir uyar\u0131 mesaj\u0131d\u0131r. Hem konsola hem dosyaya gider.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, ayn\u0131 logger'a hem bir <\/p>\n<pre><code>StreamHandler<\/pre>\n<p><\/code> (konsol i\u00e7in) hem de bir <\/p>\n<pre><code>FileHandler<\/pre>\n<p><\/code> (dosya i\u00e7in) ekledik. Her handler'\u0131n kendi log seviyesi olabilir, bu da \u00e7\u0131kt\u0131y\u0131 daha da \u00f6zelle\u015ftirmemize olanak tan\u0131r. <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> mesaj\u0131 yaln\u0131zca dosyaya yaz\u0131l\u0131rken, <\/p>\n<pre><code>INFO<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>WARNING<\/pre>\n<p><\/code> mesajlar\u0131 hem konsola hem de dosyaya yaz\u0131lacakt\u0131r. Bu yap\u0131land\u0131rma, uygulaman\u0131z\u0131n farkl\u0131 ortamlar veya farkl\u0131 ihtiya\u00e7lar i\u00e7in esnek loglama stratejileri geli\u015ftirmesine imkan tan\u0131r.<\/p>\n<h2>Geli\u015fmi\u015f Loglama Teknikleri: Performans ve G\u00fcvenlik \u0130\u00e7in Ne Yapmal\u0131y\u0131z?<\/h2>\n<p>Temel loglama kurulumu bir\u00e7ok senaryo i\u00e7in yeterli olsa da, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar, y\u00fcksek trafikli web servisleri veya uzun s\u00fcre \u00e7al\u0131\u015fan arka plan g\u00f6revleri i\u00e7in daha geli\u015fmi\u015f tekniklere ihtiya\u00e7 duyar\u0131z. Bu b\u00f6l\u00fcmde, loglama performans\u0131n\u0131 art\u0131ran, log g\u00fcvenli\u011fini sa\u011flayan ve log y\u00f6netimini kolayla\u015ft\u0131ran ileri d\u00fczey Python loglama yakla\u015f\u0131mlar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>Log Dosyas\u0131 Y\u00f6netimi: RotatingFileHandler ve TimedRotatingFileHandler<\/h3>\n<p>Tek bir log dosyas\u0131na s\u00fcrekli yazmak, zamanla dosyan\u0131n boyutunun a\u015f\u0131r\u0131 b\u00fcy\u00fcmesine neden olabilir. Bu durum, disk alan\u0131 sorunlar\u0131na yol a\u00e7abilece\u011fi gibi, log dosyas\u0131n\u0131n a\u00e7\u0131l\u0131p okunmas\u0131n\u0131 da zorla\u015ft\u0131rabilir. Python'\u0131n <\/p>\n<pre><code>logging.handlers<\/pre>\n<p><\/code> mod\u00fcl\u00fc, bu sorunu \u00e7\u00f6zmek i\u00e7in <\/p>\n<pre><code>RotatingFileHandler<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>TimedRotatingFileHandler<\/pre>\n<p><\/code> gibi \u00f6zel handler'lar sunar.<\/p>\n<h4>RotatingFileHandler ile Boyuta G\u00f6re D\u00f6nd\u00fcrme<\/h4>\n<p><pre><code>RotatingFileHandler<\/pre>\n<p><\/code>, log dosyas\u0131n\u0131n belirli bir boyuta ula\u015ft\u0131\u011f\u0131nda otomatik olarak yeni bir dosyaya d\u00f6nmesini sa\u011flar. Eski dosyalar genellikle yeniden adland\u0131r\u0131larak yedeklenir. Bu sayede, log dosyalar\u0131n\u0131z\u0131n kontrol alt\u0131nda kalmas\u0131n\u0131 sa\u011flars\u0131n\u0131z.<\/p>\n<pre><code>\nimport logging\nfrom logging.handlers import RotatingFileHandler\nimport time\nimport os\n\nLOG_FILE = 'uygulama_dondur.log'\n\n# \u00d6nceki log dosyalar\u0131n\u0131 temizleyelim (test ama\u00e7l\u0131)\nif os.path.exists(LOG_FILE):\n    os.remove(LOG_FILE)\nfor i in range(5):\n    if os.path.exists(f\"{LOG_FILE}.{i}\"):\n        os.remove(f\"{LOG_FILE}.{i}\")\n\nlogger = logging.getLogger('rotating_logger')\nlogger.setLevel(logging.INFO)\n\n# RotatingFileHandler: maxBytes=1024 (1KB), backupCount=5 (5 yedek dosya)\nhandler = RotatingFileHandler(LOG_FILE, maxBytes=1024, backupCount=5)\nformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')\nhandler.setFormatter(formatter)\nlogger.addHandler(handler)\n\nprint(f\"Loglar '{LOG_FILE}' dosyas\u0131na yaz\u0131lacak. Her 1KB'da bir d\u00f6necek ve 5 yedek tutulacak.\")\n\n# \u00c7ok say\u0131da log mesaj\u0131 g\u00f6ndererek dosyalar\u0131n d\u00f6nmesini sa\u011flayal\u0131m\nfor i in range(1000):\n    logger.info(f\"Bu {i}. log mesaj\u0131d\u0131r. Dosya boyutu b\u00fcy\u00fcyor...\")\n    time.sleep(0.001) # \u00c7ok h\u0131zl\u0131 yazmamak i\u00e7in k\u00fc\u00e7\u00fck bir bekleme\n\nprint(\"Loglama tamamland\u0131. Dosyalar\u0131 kontrol edin.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <\/p>\n<pre><code>uygulama_dondur.log<\/pre>\n<p><\/code> dosyas\u0131 her 1 KB'a ula\u015ft\u0131\u011f\u0131nda, mevcut dosya <\/p>\n<pre><code>uygulama_dondur.log.1<\/pre>\n<p><\/code> olarak yeniden adland\u0131r\u0131l\u0131r ve yeni bir <\/p>\n<pre><code>uygulama_dondur.log<\/pre>\n<p><\/code> dosyas\u0131 olu\u015fturulur. <\/p>\n<pre><code>backupCount=5<\/pre>\n<p><\/code> sayesinde en fazla 5 eski log dosyas\u0131 saklan\u0131r.<\/p>\n<h4>TimedRotatingFileHandler ile Zamana G\u00f6re D\u00f6nd\u00fcrme<\/h4>\n<p><pre><code>TimedRotatingFileHandler<\/pre>\n<p><\/code> ise log dosyalar\u0131n\u0131 belirli bir zaman dilimine (\u00f6rne\u011fin, g\u00fcnl\u00fck, haftal\u0131k) g\u00f6re d\u00f6nd\u00fcr\u00fcr. Bu, \u00f6zellikle g\u00fcnl\u00fck veya ayl\u0131k raporlamalar i\u00e7in loglar\u0131 ayr\u0131 tutmak istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code>\nimport logging\nfrom logging.handlers import TimedRotatingFileHandler\nimport time\nimport os\n\nLOG_FILE_TIMED = 'uygulama_zamanli.log'\n\n# Test ama\u00e7l\u0131 temizlik\nif os.path.exists(LOG_FILE_TIMED):\n    os.remove(LOG_FILE_TIMED)\n# Di\u011fer zamanlanm\u0131\u015f dosyalar\u0131 da temizleyebiliriz, ancak format\u0131 de\u011fi\u015fkendir.\n\nlogger_timed = logging.getLogger('timed_logger')\nlogger_timed.setLevel(logging.INFO)\n\n# TimedRotatingFileHandler: when='s' (saniye), interval=5 (her 5 saniyede bir), backupCount=3\n# 'midnight', 'h', 'd', 'w0'-'w6', 's', 'm' de\u011ferleri kullan\u0131labilir.\nhandler_timed = TimedRotatingFileHandler(LOG_FILE_TIMED,\n                                         when='s',\n                                         interval=5,\n                                         backupCount=3)\nformatter_timed = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')\nhandler_timed.setFormatter(formatter_timed)\nlogger_timed.addHandler(handler_timed)\n\nprint(f\"Loglar '{LOG_FILE_TIMED}' dosyas\u0131na yaz\u0131lacak. Her 5 saniyede bir d\u00f6necek ve 3 yedek tutulacak.\")\n\nfor i in range(15): # 15 saniye boyunca log g\u00f6nder (3 d\u00f6nd\u00fcrme g\u00f6rece\u011fiz)\n    logger_timed.info(f\"Bu {i}. zamanlanm\u0131\u015f log mesaj\u0131d\u0131r. Bekleyelim...\")\n    time.sleep(1)\n\nprint(\"Zamanlanm\u0131\u015f loglama tamamland\u0131. Dosyalar\u0131 kontrol edin.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, log dosyas\u0131 her 5 saniyede bir d\u00f6necektir. <\/p>\n<pre><code>backupCount=3<\/pre>\n<p><\/code> sayesinde 3 eski log dosyas\u0131 zaman damgas\u0131yla birlikte (<\/p>\n<pre><code>uygulama_zamanli.log.YYYY-MM-DD_HH-MM-SS<\/pre>\n<p><\/code> format\u0131nda) saklanacakt\u0131r. Bu, log dosyalar\u0131n\u0131n manuel m\u00fcdahaleye gerek kalmadan d\u00fczenli kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Yap\u0131land\u0131rma Dosyas\u0131 Kullanarak Loglama Ayarlar\u0131<\/h3>\n<p>Uygulaman\u0131n kodunda loglama ayarlar\u0131n\u0131 yapmak, karma\u015f\u0131kla\u015ft\u0131k\u00e7a y\u00f6netimi zorla\u015ft\u0131rabilir. Daha esnek ve d\u0131\u015far\u0131dan y\u00f6netilebilir bir \u00e7\u00f6z\u00fcm i\u00e7in loglama yap\u0131land\u0131rmas\u0131n\u0131 bir dosyada tutmak tercih edilir. Python'\u0131n <\/p>\n<pre><code>logging.config<\/pre>\n<p><\/code> mod\u00fcl\u00fc, JSON, YAML veya INI format\u0131ndaki dosyalar\u0131 kullanarak loglama ayarlar\u0131n\u0131 y\u00fcklemenize olanak tan\u0131r.<\/p>\n<p>\u00d6rnek bir <\/p>\n<pre><code>logging.ini<\/pre>\n<p><\/code> dosyas\u0131:<\/p>\n<pre><code>\n[loggers]\nkeys=root,my_app_logger\n\n[handlers]\nkeys=consoleHandler,fileHandler\n\n[formatters]\nkeys=simpleFormatter,detailedFormatter\n\n[logger_root]\nlevel=INFO\nhandlers=consoleHandler\n\n[logger_my_app_logger]\nlevel=DEBUG\nhandlers=consoleHandler,fileHandler\nqualname=my_app_logger\npropagate=0\n\n[handler_consoleHandler]\nclass=StreamHandler\nlevel=INFO\nformatter=simpleFormatter\nargs=(sys.stdout,)\n\n[handler_fileHandler]\nclass=FileHandler\nlevel=DEBUG\nformatter=detailedFormatter\nargs=('app_config.log','a')\n\n[formatter_simpleFormatter]\nformat=%(levelname)s - %(message)s\n\n[formatter_detailedFormatter]\nformat=%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s\n    <\/pre>\n<p><\/code><\/p>\n<p>Python kodu ile bu dosyay\u0131 y\u00fckleme:<\/p>\n<pre><code>\nimport logging.config\nimport os\nimport sys\n\n# logging.ini dosyas\u0131n\u0131 y\u00fckleyelim\n# Dosyan\u0131n varl\u0131\u011f\u0131n\u0131 kontrol etmek \u00f6nemlidir\nconfig_file = 'logging.ini'\nif os.path.exists(config_file):\n    logging.config.fileConfig(config_file, disable_existing_loggers=False)\n    print(f\"Loglama yap\u0131land\u0131rmas\u0131 '{config_file}' dosyas\u0131ndan y\u00fcklendi.\")\nelse:\n    print(f\"Hata: '{config_file}' bulunamad\u0131. Varsay\u0131lan loglama kullan\u0131l\u0131yor.\")\n    logging.basicConfig(level=logging.INFO) # Yedek olarak basicConfig\n\n# Loggers'\u0131 alal\u0131m ve kullanal\u0131m\nroot_logger = logging.getLogger()\napp_logger = logging.getLogger('my_app_logger')\n\nroot_logger.info(\"Bu root logger'dan bir bilgi mesaj\u0131d\u0131r.\")\nroot_logger.debug(\"Root logger'\u0131n varsay\u0131lan seviyesi INFO oldu\u011fu i\u00e7in bu g\u00f6r\u00fcnmez.\")\n\napp_logger.debug(\"Bu \u00f6zel app_logger'dan bir hata ay\u0131klama mesaj\u0131d\u0131r. Dosyaya yaz\u0131lmal\u0131.\")\napp_logger.info(\"Bu app_logger'dan bir bilgi mesaj\u0131d\u0131r. Hem konsola hem dosyaya yaz\u0131lmal\u0131.\")\napp_logger.error(\"Bir hata meydana geldi, app_logger ile logland\u0131.\", exc_info=True)\n    <\/pre>\n<p><\/code><\/p>\n<p>Yap\u0131land\u0131rma dosyalar\u0131, uygulaman\u0131z\u0131 da\u011f\u0131t\u0131rken veya farkl\u0131 ortamlar i\u00e7in loglama ayarlar\u0131n\u0131 de\u011fi\u015ftirmek istedi\u011finizde b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Kodda de\u011fi\u015fiklik yapmadan sadece yap\u0131land\u0131rma dosyas\u0131n\u0131 g\u00fcncelleyerek loglama davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirebilirsiniz.<\/p>\n<h3>Loglama G\u00fcvenli\u011fi: Hassas Verilerin Gizlenmesi<\/h3>\n<p>Loglama yaparken en \u00f6nemli konulardan biri de g\u00fcvenliktir. Kullan\u0131c\u0131 \u015fifreleri, kredi kart\u0131 numaralar\u0131, ki\u015fisel kimlik bilgileri gibi hassas verilerin loglara yaz\u0131lmamas\u0131 gerekir. Bu t\u00fcr veriler, log dosyalar\u0131 ele ge\u00e7irildi\u011finde ciddi g\u00fcvenlik a\u00e7\u0131klar\u0131 yaratabilir. Hassas verileri loglardan uzak tutmak i\u00e7in birka\u00e7 y\u00f6ntem mevcuttur:<\/p>\n<ol>\n<li><strong>Filtreler Kullanma:<\/strong>\n<pre><code>logging.Filter<\/pre>\n<p><\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak log mesajlar\u0131n\u0131 filtreleyebilirsiniz. Belirli anahtar kelimeleri veya desenleri i\u00e7eren mesajlar\u0131 alg\u0131lay\u0131p sans\u00fcrleyebilir veya tamamen atabilirsiniz.<\/li>\n<li><strong>Veri Maskeleme:<\/strong> Loga yazmadan \u00f6nce hassas verileri maskelemek (\u00f6rne\u011fin, \u015fifreleri\n<pre><code><strong><\/strong><\/pre>\n<p><\/code> ile de\u011fi\u015ftirmek) yayg\u0131n bir uygulamad\u0131r.<\/li>\n<li><strong>Do\u011fru Log Seviyeleri:<\/strong> Hassas verileri sadece\n<pre><code>DEBUG<\/pre>\n<p><\/code> seviyesinde loglamak ve \u00fcretim ortam\u0131nda bu seviyenin alt\u0131ndaki loglar\u0131 kapatmak bir \u00e7\u00f6z\u00fcm olabilir, ancak yine de risk ta\u015f\u0131r. En g\u00fcvenli y\u00f6ntem, bu verileri asla loglamamakt\u0131r.<\/li>\n<\/ol>\n<pre><code>\nimport logging\n\nclass CustomFilter(logging.Filter):\n    def filter(self, record):\n        message = record.getMessage()\n        if \"\u015fifre\" in message or \"token\" in message:\n            record.msg = self.mask_sensitive_data(record.msg)\n            if record.args:\n                record.args = tuple(self.mask_sensitive_data(str(arg)) if isinstance(arg, str) else arg for arg in record.args)\n        return True\n\n    def mask_sensitive_data(self, data):\n        # Basit bir maskeleme \u00f6rne\u011fi\n        return data.replace(\"\u015fifre123\", \"[MASKED_PASSWORD]\").replace(\"my_secret_token\", \"[MASKED_TOKEN]\")\n\nlogger = logging.getLogger('security_logger')\nlogger.setLevel(logging.DEBUG)\n\n# Konsol handler'\u0131\nconsole_handler = logging.StreamHandler()\nconsole_handler.setLevel(logging.DEBUG)\nformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')\nconsole_handler.setFormatter(formatter)\n\n# Filtreyi handler'a ekleme\nconsole_handler.addFilter(CustomFilter())\nlogger.addHandler(console_handler)\n\nlogger.info(\"Kullan\u0131c\u0131 login oldu: username=testuser, \u015fifre=\u015fifre123\")\nlogger.debug(\"API \u00e7a\u011fr\u0131s\u0131: endpoint=\/api\/data, token=my_secret_token\")\nlogger.warning(\"Genel bir uyar\u0131 mesaj\u0131.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <\/p>\n<pre><code>CustomFilter<\/pre>\n<p><\/code> \u00f6rne\u011fi, log mesaj\u0131nda \"\u015fifre\" veya \"token\" kelimeleri ge\u00e7ti\u011finde ilgili hassas verileri maskeler. Bu t\u00fcr filtreler, uygulaman\u0131z\u0131n loglama stratejisini daha g\u00fcvenli hale getirmenize yard\u0131mc\u0131 olur. Loglama i\u015flemi s\u0131ras\u0131nda, \u00f6zellikle kullan\u0131c\u0131 giri\u015fi veya d\u0131\u015f sistemlerle etkile\u015fim i\u00e7eren k\u0131s\u0131mlarda dikkatli olmak ve hassas verileri asla a\u00e7\u0131k metin olarak loglamamak temel g\u00fcvenlik prensibidir.<\/p>\n<aside class=\"expert-tip\">\n        <strong>Uzman \u0130pucu: Performans ve Asenkron Loglama:<\/strong> \u00d6zellikle y\u00fcksek performans gerektiren uygulamalarda, loglama i\u015fleminin kendisi dar bo\u011faz yaratabilir. Disk I\/O i\u015flemleri CPU zaman\u0131 t\u00fcketebilir. Bu gibi durumlarda, log mesajlar\u0131n\u0131 ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda veya s\u00fcre\u00e7te i\u015flemek i\u00e7in <\/p>\n<pre><code>QueueHandler<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>QueueListener<\/pre>\n<p><\/code> kullanmak, ana uygulaman\u0131n performans\u0131n\u0131 art\u0131rabilir. Bu asenkron loglama, uygulaman\u0131n daha h\u0131zl\u0131 yan\u0131t vermesini sa\u011flar.<br \/>\n    <\/aside>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Python Loglama Vaka Analizleri<\/h2>\n<p>Teorik bilgiler ve basit \u00f6rnekler loglaman\u0131n temellerini anlamak i\u00e7in harikad\u0131r, ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131nda loglaman\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rmek, bu beceriyi derinle\u015ftirmek i\u00e7in kritik \u00f6neme sahiptir. \u0130\u015fte farkl\u0131 senaryolarda Python loglamay\u0131 nas\u0131l kullanabilece\u011fimize dair iki vaka analizi.<\/p>\n<h3>Vaka Analizi 1: E-ticaret Uygulamas\u0131nda Sipari\u015f \u0130\u015fleme Ak\u0131\u015f\u0131 \u0130zleme<\/h3>\n<p>Bir e-ticaret uygulamas\u0131nda, kullan\u0131c\u0131lar\u0131n sipari\u015f verme, \u00f6deme yapma ve sipari\u015fin sevkiyat\u0131n\u0131 takip etme gibi karma\u015f\u0131k bir ak\u0131\u015f vard\u0131r. Bu ak\u0131\u015f\u0131n her ad\u0131m\u0131n\u0131 izlemek ve olas\u0131 hatalar\u0131 tespit etmek, m\u00fc\u015fteri memnuniyeti ve i\u015f s\u00fcreklili\u011fi i\u00e7in hayati \u00f6neme sahiptir. Python loglama mod\u00fcl\u00fc bu senaryoda g\u00fc\u00e7l\u00fc bir ara\u00e7 olarak kar\u015f\u0131m\u0131za \u00e7\u0131kar.<\/p>\n<h4>Senaryo Detaylar\u0131:<\/h4>\n<p>Kullan\u0131c\u0131 bir \u00fcr\u00fcn se\u00e7er, sepete ekler, \u00f6deme bilgilerini girer ve sipari\u015fi tamamlar. Bu s\u00fcre\u00e7te a\u015fa\u011f\u0131daki ad\u0131mlar ger\u00e7ekle\u015fir:<\/p>\n<ol>\n<li>\u00dcr\u00fcn sepete eklenir.<\/li>\n<li>\u00d6deme i\u015flemi ba\u015flat\u0131l\u0131r.<\/li>\n<li>\u00d6deme ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z olur.<\/li>\n<li>Sipari\u015f veritaban\u0131na kaydedilir.<\/li>\n<li>Stok g\u00fcncellemesi yap\u0131l\u0131r.<\/li>\n<li>Sipari\u015f onay e-postas\u0131 g\u00f6nderilir.<\/li>\n<\/ol>\n<pre><code>\nimport logging\nimport random\nimport sys\nimport os\n\n# Logger'\u0131 yap\u0131land\u0131rma\nLOG_FILE = 'ecommerce_orders.log'\nif os.path.exists(LOG_FILE):\n    os.remove(LOG_FILE) # Her \u00e7al\u0131\u015ft\u0131rmada temizle\n\nlogging.basicConfig(\n    level=logging.INFO,\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    handlers=[\n        logging.FileHandler(LOG_FILE),\n        logging.StreamHandler(sys.stdout) # Konsola da yaz\n    ]\n)\n\norder_logger = logging.getLogger('OrderProcessor')\n\ndef add_to_cart(user_id, product_id, quantity):\n    order_logger.info(f\"Kullan\u0131c\u0131 {user_id}: \u00dcr\u00fcn {product_id} (adet: {quantity}) sepete eklendi.\")\n    # Ger\u00e7ek sepete ekleme mant\u0131\u011f\u0131 burada olur\n    return True\n\ndef process_payment(user_id, order_id, amount):\n    order_logger.info(f\"Kullan\u0131c\u0131 {user_id}: Sipari\u015f {order_id} i\u00e7in {amount} TL \u00f6deme i\u015flemi ba\u015flat\u0131ld\u0131.\")\n    if random.random() < 0.9: # %90 ba\u015far\u0131 oran\u0131\n        order_logger.info(f\"Kullan\u0131c\u0131 {user_id}: Sipari\u015f {order_id} i\u00e7in \u00f6deme ba\u015far\u0131l\u0131.\")\n        return True\n    else:\n        order_logger.error(f\"Kullan\u0131c\u0131 {user_id}: Sipari\u015f {order_id} i\u00e7in \u00f6deme ba\u015far\u0131s\u0131z oldu!\")\n        return False\n\ndef save_order_to_db(order_details):\n    order_logger.info(f\"Sipari\u015f {order_details['order_id']} veritaban\u0131na kaydediliyor.\")\n    if random.random() < 0.95: # %95 ba\u015far\u0131 oran\u0131\n        order_logger.info(f\"Sipari\u015f {order_details['order_id']} ba\u015far\u0131yla kaydedildi.\")\n        return True\n    else:\n        order_logger.critical(f\"Sipari\u015f {order_details['order_id']} veritaban\u0131na kaydedilemedi! Kritik hata.\", exc_info=True)\n        return False\n\ndef update_stock(product_id, quantity):\n    order_logger.info(f\"\u00dcr\u00fcn {product_id} i\u00e7in stok g\u00fcncelleniyor, {quantity} adet azalt\u0131l\u0131yor.\")\n    # Stok g\u00fcncelleme mant\u0131\u011f\u0131\n    return True\n\ndef send_confirmation_email(user_id, order_id):\n    order_logger.info(f\"Kullan\u0131c\u0131 {user_id} i\u00e7in sipari\u015f {order_id} onay e-postas\u0131 g\u00f6nderiliyor.\")\n    # E-posta g\u00f6nderme mant\u0131\u011f\u0131\n    return True\n\ndef complete_order_flow(user_id, product_id, quantity, amount):\n    order_id = f\"ORD-{random.randint(1000, 9999)}\"\n    order_logger.info(f\"[{order_id}] Yeni sipari\u015f ak\u0131\u015f\u0131 ba\u015flat\u0131ld\u0131: Kullan\u0131c\u0131={user_id}, \u00dcr\u00fcn={product_id}, Adet={quantity}, Tutar={amount}\")\n\n    if not add_to_cart(user_id, product_id, quantity):\n        order_logger.error(f\"[{order_id}] Sepete eklenemedi. Ak\u0131\u015f durduruldu.\")\n        return\n\n    if not process_payment(user_id, order_id, amount):\n        order_logger.error(f\"[{order_id}] \u00d6deme ba\u015far\u0131s\u0131z. Ak\u0131\u015f durduruldu.\")\n        return\n\n    order_details = {\n        'order_id': order_id,\n        'user_id': user_id,\n        'product_id': product_id,\n        'quantity': quantity,\n        'amount': amount,\n        'status': 'completed'\n    }\n    if not save_order_to_db(order_details):\n        order_logger.critical(f\"[{order_id}] Veritaban\u0131 kayd\u0131 ba\u015far\u0131s\u0131z. Ak\u0131\u015f kritik hata ile durduruldu.\")\n        return\n\n    update_stock(product_id, quantity)\n    send_confirmation_email(user_id, order_id)\n\n    order_logger.info(f\"[{order_id}] Sipari\u015f ba\u015far\u0131yla tamamland\u0131.\")\n\n# Birka\u00e7 sipari\u015f ak\u0131\u015f\u0131n\u0131 sim\u00fcle edelim\nprint(\"\\n--- Sipari\u015f Ak\u0131\u015f\u0131 1 ---\")\ncomplete_order_flow(\"user_alice\", \"PROD-101\", 2, 150.00)\nprint(\"\\n--- Sipari\u015f Ak\u0131\u015f\u0131 2 ---\")\ncomplete_order_flow(\"user_bob\", \"PROD-203\", 1, 75.50)\nprint(\"\\n--- Sipari\u015f Ak\u0131\u015f\u0131 3 (Hata Bekleniyor) ---\")\ncomplete_order_flow(\"user_charlie\", \"PROD-404\", 3, 220.00)\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, her bir sipari\u015f ak\u0131\u015f\u0131 ad\u0131m\u0131 i\u00e7in <\/p>\n<pre><code>INFO<\/pre>\n<p><\/code> seviyesinde loglar olu\u015fturulur. Olas\u0131 hatalar (<\/p>\n<pre><code>payment_failed<\/pre>\n<p><\/code>, <\/p>\n<pre><code>db_save_failed<\/pre>\n<p><\/code>) <\/p>\n<pre><code>ERROR<\/pre>\n<p><\/code> veya <\/p>\n<pre><code>CRITICAL<\/pre>\n<p><\/code> seviyesinde loglanarak hemen fark edilmeleri sa\u011flan\u0131r. <\/p>\n<pre><code>exc_info=True<\/pre>\n<p><\/code> kullan\u0131m\u0131, istisna ayr\u0131nt\u0131lar\u0131n\u0131 da loga ekleyerek hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r. Bu sayede, operasyon ekipleri anormallikleri h\u0131zl\u0131ca tespit edebilir ve m\u00fc\u015fteri deneyimi olumsuz etkilenmeden m\u00fcdahale edebilir.<\/p>\n<h3>Vaka Analizi 2: Veri \u0130\u015fleme Hatt\u0131nda Performans ve Anomali Tespiti<\/h3>\n<p>B\u00fcy\u00fck veri i\u015fleme hatlar\u0131nda (data pipelines), verilerin farkl\u0131 a\u015famalardan ge\u00e7erek d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc\u011f\u00fc ve analiz edildi\u011fi karma\u015f\u0131k s\u00fcre\u00e7ler bulunur. Bu hatlar\u0131n performans\u0131 ve do\u011fru \u00e7al\u0131\u015fmas\u0131, nihai analitik sonu\u00e7lar\u0131n g\u00fcvenilirli\u011fi i\u00e7in kritik \u00f6neme sahiptir. Loglama, bu hatlardaki darbo\u011fazlar\u0131 ve veri anormalliklerini tespit etmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<h4>Senaryo Detaylar\u0131:<\/h4>\n<p>Bir veri hatt\u0131, ham verileri al\u0131r, temizler, d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve bir veri ambar\u0131na y\u00fckler. Her ad\u0131m\u0131n ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc ve potansiyel veri kalitesi sorunlar\u0131n\u0131 izlemek istiyoruz.<\/p>\n<pre><code>\nimport logging\nimport time\nimport random\nimport sys\nimport os\n\n# Logger'\u0131 yap\u0131land\u0131rma\nLOG_FILE_DATA_PIPELINE = 'data_pipeline.log'\nif os.path.exists(LOG_FILE_DATA_PIPELINE):\n    os.remove(LOG_FILE_DATA_PIPELINE)\n\nlogging.basicConfig(\n    level=logging.DEBUG, # Geli\u015fme ortam\u0131nda daha detayl\u0131 loglar i\u00e7in DEBUG\n    format='%(asctime)s - %(name)s - %(levelname)s - %(process)d - %(message)s',\n    handlers=[\n        logging.FileHandler(LOG_FILE_DATA_PIPELINE),\n        logging.StreamHandler(sys.stdout)\n    ]\n)\n\npipeline_logger = logging.getLogger('DataPipeline')\n\ndef fetch_data(source_id):\n    start_time = time.time()\n    pipeline_logger.debug(f\"[{source_id}] Veri kayna\u011f\u0131 {source_id}'dan veri \u00e7ekiliyor...\")\n    time.sleep(random.uniform(0.1, 0.5)) # Sim\u00fcle edilmi\u015f gecikme\n    data_records = random.randint(100, 1000)\n    end_time = time.time()\n    pipeline_logger.info(f\"[{source_id}] Veri \u00e7ekme tamamland\u0131 ({data_records} kay\u0131t). S\u00fcre: {end_time - start_time:.2f}s\")\n    return {\"source\": source_id, \"records\": data_records, \"raw_data\": [random.randint(1, 100) for _ in range(data_records)]}\n\ndef clean_data(data):\n    start_time = time.time()\n    source_id = data['source']\n    total_records = data['records']\n    corrupted_records = random.randint(0, int(total_records * 0.05)) # %0-5 aras\u0131 bozuk kay\u0131t\n    cleaned_records = total_records - corrupted_records\n    \n    if corrupted_records > 0:\n        pipeline_logger.warning(f\"[{source_id}] {corrupted_records} adet bozuk kay\u0131t tespit edildi ve temizlendi.\")\n    \n    time.sleep(random.uniform(0.05, 0.3))\n    end_time = time.time()\n    pipeline_logger.info(f\"[{source_id}] Veri temizleme tamamland\u0131 ({cleaned_records} ge\u00e7erli kay\u0131t). S\u00fcre: {end_time - start_time:.2f}s\")\n    data[\"cleaned_records\"] = cleaned_records\n    return data\n\ndef transform_data(data):\n    start_time = time.time()\n    source_id = data['source']\n    pipeline_logger.debug(f\"[{source_id}] Veriler d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor...\")\n    # D\u00f6n\u00fc\u015f\u00fcm mant\u0131\u011f\u0131 (\u00f6rne\u011fin,\u805a\u5408, zenginle\u015ftirme)\n    if random.random() < 0.02: # %2 hata olas\u0131l\u0131\u011f\u0131\n        raise ValueError(\"Veri d\u00f6n\u00fc\u015f\u00fcm hatas\u0131!\")\n    \n    time.sleep(random.uniform(0.1, 0.6))\n    end_time = time.time()\n    pipeline_logger.info(f\"[{source_id}] Veri d\u00f6n\u00fc\u015f\u00fcm\u00fc tamamland\u0131. S\u00fcre: {end_time - start_time:.2f}s\")\n    data[\"transformed\"] = True\n    return data\n\ndef load_data_to_warehouse(data):\n    start_time = time.time()\n    source_id = data['source']\n    pipeline_logger.debug(f\"[{source_id}] Veri ambar\u0131na y\u00fckleniyor...\")\n    time.sleep(random.uniform(0.2, 0.8))\n    end_time = time.time()\n    pipeline_logger.info(f\"[{source_id}] Veri ambar\u0131na y\u00fckleme tamamland\u0131. Y\u00fcklenen kay\u0131t: {data.get('cleaned_records', 'N\/A')}. S\u00fcre: {end_time - start_time:.2f}s\")\n    return True\n\ndef run_data_pipeline(source_id):\n    pipeline_logger.info(f\"--- Veri hatt\u0131 ba\u015flat\u0131ld\u0131: Kaynak {source_id} ---\")\n    try:\n        raw_data = fetch_data(source_id)\n        cleaned_data = clean_data(raw_data)\n        transformed_data = transform_data(cleaned_data)\n        load_data_to_warehouse(transformed_data)\n        pipeline_logger.info(f\"--- Veri hatt\u0131 ba\u015far\u0131yla tamamland\u0131: Kaynak {source_id} ---\")\n    except ValueError as e:\n        pipeline_logger.error(f\"--- Veri hatt\u0131 hatas\u0131: Kaynak {source_id}. Hata: {e} ---\", exc_info=True)\n    except Exception as e:\n        pipeline_logger.critical(f\"--- Veri hatt\u0131 kritik hatas\u0131: Kaynak {source_id}. Beklenmeyen hata: {e} ---\", exc_info=True)\n\n# \u00c7e\u015fitli veri kaynaklar\u0131 i\u00e7in hatt\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m\nfor i in range(1, 4):\n    run_data_pipeline(f\"SRC-{i}\")\n    time.sleep(1) # Arka arkaya \u00e7ok h\u0131zl\u0131 \u00e7al\u0131\u015ft\u0131rmamak i\u00e7in\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu senaryoda, her bir i\u015flem ad\u0131m\u0131n\u0131n ba\u015flang\u0131\u00e7 ve biti\u015f zamanlar\u0131n\u0131 <\/p>\n<pre><code>INFO<\/pre>\n<p><\/code> seviyesinde loglayarak performans izlemesi yapar\u0131z. <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> mesajlar\u0131, geli\u015ftirme a\u015famas\u0131nda daha detayl\u0131 i\u00e7g\u00f6r\u00fcler sa\u011flar. Veri temizleme ad\u0131m\u0131nda tespit edilen bozuk kay\u0131tlar <\/p>\n<pre><code>WARNING<\/pre>\n<p><\/code> olarak i\u015faretlenir. <\/p>\n<pre><code>transform_data<\/pre>\n<p><\/code> fonksiyonundaki olas\u0131 hatalar <\/p>\n<pre><code>ERROR<\/pre>\n<p><\/code> olarak yakalan\u0131r ve <\/p>\n<pre><code>exc_info=True<\/pre>\n<p><\/code> ile detayl\u0131 hata bilgisi loglan\u0131r. Bu sayede, hem hatt\u0131n genel performans\u0131n\u0131 g\u00f6zlemleyebilir hem de olas\u0131 veri kalitesi sorunlar\u0131n\u0131 veya i\u015flem hatalar\u0131n\u0131 proaktif olarak tespit edebiliriz. Zaman damgalar\u0131 ve s\u00fcre\u00e7 ID'leri sayesinde, loglar\u0131 merkezi bir log toplama sisteminde (ELK Stack gibi) analiz ederken belirli bir kaynak veya s\u00fcrecin davran\u0131\u015f\u0131n\u0131 kolayca izleyebiliriz.<\/p>\n<h2>Loglama \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>Python'da loglama sadece temel fonksiyonlar\u0131 kullanmaktan ibaret de\u011fildir. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, loglama stratejinizin de geli\u015fmesi gerekir. \u0130\u015fte daha verimli, okunabilir ve y\u00f6netilebilir loglar olu\u015fturman\u0131za yard\u0131mc\u0131 olacak baz\u0131 ipu\u00e7lar\u0131 ve en iyi uygulamalar:<\/p>\n<h3>1. Anlaml\u0131 Logger \u0130simleri Kullan\u0131n<\/h3>\n<p>Her mod\u00fcl veya \u00f6nemli uygulama bile\u015feni i\u00e7in ayr\u0131 bir logger olu\u015fturmak, loglar\u0131n izlenebilirli\u011fini art\u0131r\u0131r. \u00d6rne\u011fin, bir web uygulamas\u0131nda <\/p>\n<pre><code>auth<\/pre>\n<p><\/code> mod\u00fcl\u00fc i\u00e7in <\/p>\n<pre><code>logging.getLogger('my_app.auth')<\/pre>\n<p><\/code>, veritaban\u0131 i\u015flemleri i\u00e7in <\/p>\n<pre><code>logging.getLogger('my_app.database')<\/pre>\n<p><\/code> gibi hiyerar\u015fik isimler kullan\u0131n. Bu, loglar\u0131 filtrelerken veya analiz ederken hangi mesaj\u0131n nereden geldi\u011fini h\u0131zl\u0131ca anlaman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code>\nimport logging\n\n# Hiyerar\u015fik logger \u00f6rnekleri\nlogger_auth = logging.getLogger('my_app.auth')\nlogger_db = logging.getLogger('my_app.database')\n\n# Her logger kendi i\u00e7inde yap\u0131land\u0131r\u0131labilir\nlogger_auth.setLevel(logging.INFO)\nlogger_db.setLevel(logging.DEBUG) # Veritaban\u0131 i\u00e7in daha detayl\u0131 log\n\n# ... handler ve formatter ekleme i\u015flemleri ...\n\nlogger_auth.info(\"Kullan\u0131c\u0131 'admin' ba\u015far\u0131yla giri\u015f yapt\u0131.\")\nlogger_db.debug(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 kontrol ediliyor...\")\n    <\/pre>\n<p><\/code><\/p>\n<h3>2. \u0130stisnalar\u0131 Do\u011fru \u015eekilde Loglay\u0131n (<\/p>\n<pre><code>exc_info=True<\/pre>\n<p><\/code>)<\/h3>\n<p>Bir hata (istisna) meydana geldi\u011finde, yaln\u0131zca hata mesaj\u0131n\u0131 de\u011fil, t\u00fcm izleme bilgisini (traceback) loglamak \u00e7ok \u00f6nemlidir. <\/p>\n<pre><code>logger.error()<\/pre>\n<p><\/code> veya <\/p>\n<pre><code>logger.exception()<\/pre>\n<p><\/code> y\u00f6ntemleriyle <\/p>\n<pre><code>exc_info=True<\/pre>\n<p><\/code> parametresini kullanarak bunu yapabilirsiniz. <\/p>\n<pre><code>logger.exception()<\/pre>\n<p><\/code> \u00f6zel bir durumdur, her zaman <\/p>\n<pre><code>ERROR<\/pre>\n<p><\/code> seviyesinde loglar ve otomatik olarak <\/p>\n<pre><code>exc_info=True<\/pre>\n<p><\/code> olarak ayarlanm\u0131\u015ft\u0131r.<\/p>\n<pre><code>\nimport logging\n\nlogging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')\nlogger = logging.getLogger('error_logger')\n\ntry:\n    result = 10 \/ 0\nexcept ZeroDivisionError as e:\n    logger.error(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 meydana geldi!\", exc_info=True)\n    # veya daha k\u0131sa olarak:\n    # logger.exception(\"S\u0131f\u0131ra b\u00f6lme hatas\u0131 meydana geldi!\")\n    <\/pre>\n<p><\/code><\/p>\n<h3>3. Dinamik ve Ba\u011flamsal Loglama (Contextual Logging)<\/h3>\n<p>Log mesajlar\u0131na, uygulaman\u0131n o anki durumu hakk\u0131nda daha fazla bilgi eklemek, sorun gidermeyi kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, bir web iste\u011fi i\u015flenirken, iste\u011fin benzersiz ID'sini, kullan\u0131c\u0131n\u0131n IP adresini veya kullan\u0131c\u0131n\u0131n ID'sini her log mesaj\u0131na dahil etmek faydal\u0131 olabilir. Bunu yapman\u0131n bir yolu, log mesajlar\u0131n\u0131 formatlarken veya <\/p>\n<pre><code>LoggerAdapter<\/pre>\n<p><\/code> kullanarak ek ba\u011flam bilgileri eklemektir.<\/p>\n<pre><code>\nimport logging\n\n# LoggerAdapter ile ba\u011flamsal bilgi ekleme\nclass ContextualAdapter(logging.LoggerAdapter):\n    def process(self, msg, kwargs):\n        return f\"[{self.extra['request_id']}] {msg}\", kwargs\n\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\nbase_logger = logging.getLogger('my_api')\n\nrequest_id = \"req-12345\"\nadapter = ContextualAdapter(base_logger, {'request_id': request_id})\n\nadapter.info(\"API iste\u011fi ba\u015flat\u0131ld\u0131.\")\n# ... i\u015fleme ...\nadapter.warning(\"Baz\u0131 veriler eksik.\")\nadapter.info(\"API iste\u011fi tamamland\u0131.\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m sayesinde, farkl\u0131 isteklerin loglar\u0131n\u0131 kolayca ay\u0131rt edebilir ve izleyebiliriz. Ayr\u0131ca her log \u00e7a\u011fr\u0131s\u0131nda tekrar tekrar ayn\u0131 bilgileri yazmak zorunda kalmay\u0131z.<\/p>\n<h3>4. Log Seviyelerini Ak\u0131ll\u0131ca Kullan\u0131n<\/h3>\n<p>Her log mesaj\u0131n\u0131n uygun bir seviyede olmas\u0131 gerekir. Gereksiz yere y\u00fcksek seviyelerde loglama (\u00f6rne\u011fin her \u015feyi <\/p>\n<pre><code>ERROR<\/pre>\n<p><\/code> olarak i\u015faretlemek) ger\u00e7ek sorunlar\u0131n g\u00f6zden ka\u00e7mas\u0131na neden olabilir. A\u015f\u0131r\u0131 <\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> loglama ise performans d\u00fc\u015f\u00fc\u015f\u00fcne ve log dosyalar\u0131n\u0131n a\u015f\u0131r\u0131 b\u00fcy\u00fcmesine yol a\u00e7ar.<\/p>\n<ul>\n<li>\n<pre><code>DEBUG<\/pre>\n<p><\/code>: Geli\u015ftirme ve hata ay\u0131klama i\u00e7in \u00e7ok detayl\u0131 bilgiler.<\/li>\n<li>\n<pre><code>INFO<\/pre>\n<p><\/code>: Uygulaman\u0131n normal i\u015fleyi\u015fini g\u00f6steren genel bilgiler (\u00f6rne\u011fin, \"Kullan\u0131c\u0131 giri\u015f yapt\u0131\", \"Veri i\u015fleme ba\u015flad\u0131\").<\/li>\n<li>\n<pre><code>WARNING<\/pre>\n<p><\/code>: Potansiyel sorunlar veya beklenen ama istenmeyen durumlar (\u00f6rne\u011fin, \"Yap\u0131land\u0131rma dosyas\u0131 bulunamad\u0131, varsay\u0131lanlar kullan\u0131l\u0131yor\").<\/li>\n<li>\n<pre><code>ERROR<\/pre>\n<p><\/code>: Uygulaman\u0131n belirli bir fonksiyonunun d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131n\u0131 engelleyen hatalar.<\/li>\n<li>\n<pre><code>CRITICAL<\/pre>\n<p><\/code>: Uygulaman\u0131n veya sistemin kararl\u0131l\u0131\u011f\u0131n\u0131 etkileyen ciddi hatalar.<\/li>\n<\/ul>\n<h3>5. Harici K\u00fct\u00fcphaneler ve Merkezi Loglama Sistemleri ile Entegrasyon<\/h3>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, loglar\u0131 merkezi bir sistemde toplamak ve analiz etmek esast\u0131r. Pop\u00fcler se\u00e7enekler aras\u0131nda ELK Stack (Elasticsearch, Logstash, Kibana), Splunk, Graylog ve Datadog bulunur. Python'da, bu sistemlere log g\u00f6ndermek i\u00e7in \u00e7e\u015fitli k\u00fct\u00fcphaneler (\u00f6rne\u011fin, <\/p>\n<pre><code>logstash-formatter<\/pre>\n<p><\/code> veya <\/p>\n<pre><code>fluent-logger<\/pre>\n<p><\/code>) veya do\u011frudan TCP\/UDP socket handler'lar\u0131 kullan\u0131labilir.<\/p>\n<p>Merkezi loglama, t\u00fcm uygulama ve servislerinizin loglar\u0131n\u0131 tek bir yerden izlemenizi, araman\u0131z\u0131 ve g\u00f6rselle\u015ftirmenizi sa\u011flar. Bu, mikroservis mimarilerinde veya birden fazla sunucuya da\u011f\u0131lm\u0131\u015f uygulamalarda sorun gidermeyi ve operasyonel g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<aside class=\"expert-tip\">\n        <strong>Uzman \u0130pucu: Log Yap\u0131land\u0131rmas\u0131n\u0131 Test Edin:<\/strong> Loglama ayarlar\u0131n\u0131z\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in otomatik testler yaz\u0131n. Log dosyalar\u0131n\u0131n olu\u015fturuldu\u011funu, belirli mesajlar\u0131n do\u011fru seviyelerde ve formatlarda yaz\u0131ld\u0131\u011f\u0131n\u0131 do\u011frulayan testler, \u00fcretim ortam\u0131nda beklenmedik s\u00fcrprizleri \u00f6nler.<br \/>\n    <\/aside>\n<p>Bu ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 takip ederek, Python uygulamalar\u0131n\u0131zda daha sa\u011flam, izlenebilir ve y\u00f6netilebilir bir loglama stratejisi olu\u015fturabilirsiniz. Loglama, sadece hata ay\u0131klama arac\u0131 de\u011fil, ayn\u0131 zamanda uygulaman\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 s\u00fcrekli izlemek i\u00e7in g\u00fc\u00e7l\u00fc bir operasyonel ara\u00e7t\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Python'da loglama, uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 anlamak, hatalar\u0131 tespit etmek, performans\u0131 izlemek ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 saptamak i\u00e7in hayati bir ara\u00e7t\u0131r. Bu makalede, loglaman\u0131n temel kavramlar\u0131ndan ba\u015flayarak, farkl\u0131 log seviyeleri, handler'lar, formatlay\u0131c\u0131lar ve filtreler gibi yap\u0131 ta\u015flar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, log dosyas\u0131 y\u00f6netimi i\u00e7in <\/p>\n<pre><code>RotatingFileHandler<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>TimedRotatingFileHandler<\/pre>\n<p><\/code> gibi geli\u015fmi\u015f tekniklere de\u011findik ve yap\u0131land\u0131rma dosyalar\u0131 kullanarak loglama ayarlar\u0131n\u0131 nas\u0131l y\u00f6netece\u011fimizi \u00f6\u011frendik. Ger\u00e7ek d\u00fcnya vaka analizleri sayesinde, e-ticaret sipari\u015f i\u015fleme ve veri i\u015fleme hatlar\u0131 gibi karma\u015f\u0131k senaryolarda loglaman\u0131n pratik uygulamalar\u0131n\u0131 g\u00f6rd\u00fck.<\/p>\n<p>Unutmay\u0131n ki etkili bir loglama stratejisi, sadece kodunuzdaki hatalar\u0131 bulmaktan \u00e7ok daha fazlas\u0131n\u0131 sunar. Uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca bir \"kara kutu\" olmas\u0131n\u0131 engelleyerek, size s\u00fcrekli bir geri bildirim mekanizmas\u0131 sa\u011flar. \u0130yi yap\u0131land\u0131r\u0131lm\u0131\u015f loglar, geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r, operasyonel y\u00fck\u00fc azalt\u0131r ve nihayetinde daha g\u00fcvenilir ve bak\u0131m\u0131 kolay yaz\u0131l\u0131mlar olu\u015fturman\u0131za yard\u0131mc\u0131 olur. Art\u0131k Python'daki bu g\u00fc\u00e7l\u00fc loglama yeteneklerini kendi projelerinizde kullanarak uygulamalar\u0131n\u0131z\u0131n derinliklerine inmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<div class=\"faq-section\">\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Python'da loglama yapmak performans\u0131m\u0131 etkiler mi?<\/strong><\/p>\n<p>Evet, her log mesaj\u0131 bir miktar CPU ve I\/O kayna\u011f\u0131 t\u00fcketir. \u00d6zellikle \u00e7ok detayl\u0131 (<\/p>\n<pre><code>DEBUG<\/pre>\n<p><\/code> seviyesi) loglama veya y\u00fcksek yo\u011funluklu I\/O i\u015flemleri gerektiren handler'lar (\u00f6rne\u011fin a\u011f \u00fczerinden log g\u00f6nderme) performans \u00fczerinde g\u00f6zle g\u00f6r\u00fcl\u00fcr bir etki yaratabilir. Bu nedenle \u00fcretim ortamlar\u0131nda log seviyelerini dikkatli ayarlamak ve gerekti\u011finde asenkron loglama (<\/p>\n<pre><code>QueueHandler<\/pre>\n<p><\/code>) kullanmak \u00f6nemlidir.<\/p>\n<p><strong>2. Hangi log seviyesini ne zaman kullanmal\u0131y\u0131m?<\/strong><\/p>\n<ul>\n<li>\n<pre><code>DEBUG<\/pre>\n<p><\/code>: Geli\u015ftirme ve hata ay\u0131klama a\u015famas\u0131nda, her detay ad\u0131m\u0131n\u0131 izlemek istedi\u011finizde.<\/li>\n<li>\n<pre><code>INFO<\/pre>\n<p><\/code>: Uygulaman\u0131n normal ak\u0131\u015f\u0131n\u0131, \u00f6nemli olaylar\u0131 (kullan\u0131c\u0131 giri\u015fi, i\u015flem ba\u015flatma) kaydetmek i\u00e7in.<\/li>\n<li>\n<pre><code>WARNING<\/pre>\n<p><\/code>: Beklenmeyen ama uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 engellemeyen durumlar (yap\u0131land\u0131rma hatas\u0131, deprecated \u00f6zellik kullan\u0131m\u0131).<\/li>\n<li>\n<pre><code>ERROR<\/pre>\n<p><\/code>: Uygulaman\u0131n bir k\u0131sm\u0131n\u0131n i\u015flevini yerine getiremedi\u011fi durumlar (veritaban\u0131 ba\u011flant\u0131 hatas\u0131, dosya okuma hatas\u0131).<\/li>\n<li>\n<pre><code>CRITICAL<\/pre>\n<p><\/code>: Uygulaman\u0131n veya sistemin tamamen \u00e7\u00f6kmesine neden olan \u00e7ok ciddi, kurtar\u0131lamaz hatalar.<\/li>\n<\/ul>\n<p><strong>3. Python loglama mod\u00fcl\u00fc hassas verileri otomatik olarak gizler mi?<\/strong><\/p>\n<p>Hay\u0131r, Python'\u0131n standart <\/p>\n<pre><code>logging<\/pre>\n<p><\/code> mod\u00fcl\u00fc hassas verileri otomatik olarak gizlemez. Bu, geli\u015ftiricinin sorumlulu\u011fundad\u0131r. Makalede bahsedilen filtreler veya manuel maskeleme y\u00f6ntemleri kullan\u0131larak hassas verilerin loglara s\u0131zmas\u0131 \u00f6nlenmelidir. G\u00fcvenlik ve gizlilik her zaman \u00f6ncelikli olmal\u0131d\u0131r.<\/p>\n<p><strong>4. Log dosyalar\u0131n\u0131 manuel olarak silmek yerine daha iyi bir y\u00f6ntem var m\u0131?<\/strong><\/p>\n<p>Kesinlikle! Makalede de de\u011findi\u011fimiz gibi, <\/p>\n<pre><code>RotatingFileHandler<\/pre>\n<p><\/code> ve <\/p>\n<pre><code>TimedRotatingFileHandler<\/pre>\n<p><\/code> gibi handler'lar, log dosyalar\u0131n\u0131 belirli boyut veya zamana g\u00f6re otomatik olarak d\u00f6nd\u00fcr\u00fcr ve eski dosyalar\u0131 siler. Bu, log dosyalar\u0131n\u0131z\u0131n disk alan\u0131n\u0131 doldurmas\u0131n\u0131 engeller ve manuel m\u00fcdahaleye gerek kalmadan d\u00fczenli kalmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, merkezi loglama sistemleri genellikle loglar\u0131 belirli bir s\u00fcre sonra otomatik olarak ar\u015fivler veya siler.<\/p>\n<p><strong>5. Birden fazla Python uygulamas\u0131 ayn\u0131 log dosyas\u0131na yazabilir mi?<\/strong><\/p>\n<p>Evet, yazabilirler ancak dikkatli olunmal\u0131d\u0131r. Farkl\u0131 uygulamalar ayn\u0131 <\/p>\n<pre><code>FileHandler<\/pre>\n<p><\/code> ile ayn\u0131 dosyaya yazarsa, e\u015fzamanl\u0131 eri\u015fim sorunlar\u0131 ya\u015fanabilir ve log mesajlar\u0131 kar\u0131\u015fabilir. \u00c7\u00f6z\u00fcm olarak, her uygulama i\u00e7in ayr\u0131 bir log dosyas\u0131 kullanmak veya <\/p>\n<pre><code>logging.handlers.WatchedFileHandler<\/pre>\n<p><\/code> gibi kilit mekanizmalar\u0131 olan handler'lar kullanmak ya da en iyisi, loglar\u0131 merkezi bir log toplama sistemine (\u00f6rne\u011fin Syslog veya ELK Stack) g\u00f6ndermek daha g\u00fcvenli ve y\u00f6netilebilirdir.<\/p>\n<\/p><\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor&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":[1403],"tags":[],"class_list":{"0":"post-33812","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","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>Python&#039;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber<\/title>\n<meta name=\"description\" content=\"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python&#039;da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.\" \/>\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\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python&#039;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python&#039;da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-07T08:31:23+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=\"31 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python&#8217;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber\",\"datePublished\":\"2025-11-07T08:31:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\"},\"wordCount\":3765,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\",\"name\":\"Python'da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-07T08:31:23+00:00\",\"description\":\"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python'da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python&#8217;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber\"}]},{\"@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":"Python'da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber","description":"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python'da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.","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\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Python'da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber","og_description":"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python'da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-07T08:31:23+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"31 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python&#8217;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber","datePublished":"2025-11-07T08:31:23+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/"},"wordCount":3765,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/","name":"Python'da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-07T08:31:23+00:00","description":"Uygulamalar\u0131n\u0131z\u0131n derinliklerinde neler olup bitti\u011fini merak m\u0131 ediyorsunuz? Bir hata meydana geldi\u011finde nerede ve neden oldu\u011funu anlamakta zorlan\u0131yor musunuz? \u0130\u015fte bu noktada Python'da loglama devreye giriyor ve kodunuzun kalbine inmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor. Bu makalede, loglaman\u0131n temel prensiplerinden en geli\u015fmi\u015f tekniklerine kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-gelismis-loglama-uygulamali-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python&#8217;da Geli\u015fmi\u015f Loglama: Uygulamal\u0131 Bir Rehber"}]},{"@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\/33812","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=33812"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33812\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}