{"id":35099,"date":"2025-11-25T15:31:06","date_gmt":"2025-11-25T12:31:06","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/"},"modified":"2025-11-25T15:31:06","modified_gmt":"2025-11-25T12:31:06","slug":"scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/","title":{"rendered":"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t"},"content":{"rendered":"<p><body><\/p>\n<p>Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider&#8217;\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider&#8217;\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.<\/p>\n<p>Modern web kaz\u0131ma projeleri, genellikle onlarca, hatta y\u00fczlerce farkl\u0131 web sitesinden veri toplamak \u00fczere tasarlanm\u0131\u015f \u00e7ok say\u0131da <a href=\"https:\/\/docs.scrapy.org\/en\/latest\/topics\/spiders.html\" target=\"_blank\">Scrapy spider&#8217;\u0131<\/a> i\u00e7erir. Her bir spider&#8217;\u0131n kendine \u00f6zg\u00fc davran\u0131\u015flar\u0131, veri toplama stratejileri ve kar\u015f\u0131la\u015fabilece\u011fi \u00f6zel hatalar vard\u0131r. Ba\u015flang\u0131\u00e7ta, t\u00fcm loglar\u0131n tek bir konsola veya ortak bir dosyaya yaz\u0131lmas\u0131 pratik gibi g\u00f6r\u00fcnse de, proje b\u00fcy\u00fcd\u00fck\u00e7e bu yakla\u015f\u0131m h\u0131zla s\u00fcrd\u00fcr\u00fclemez hale gelir. D\u00fc\u015f\u00fcnsenize, ayn\u0131 anda \u00e7al\u0131\u015fan yirmi farkl\u0131 spider&#8217;\u0131n\u0131z var ve aniden bir hata raporu al\u0131yorsunuz. Hangi spider&#8217;\u0131n hata verdi\u011fini, hatan\u0131n tam olarak ne zaman ve hangi ba\u011flamda olu\u015ftu\u011funu anlamak i\u00e7in devasa bir log dosyas\u0131n\u0131 taramak zorunda kalmak, verimlili\u011finizi d\u00fc\u015f\u00fcren ve geli\u015ftirme s\u00fcrecini yava\u015flatan korkun\u00e7 bir deneyim olabilir. Bu durum, \u00f6zellikle ger\u00e7ek zamanl\u0131 hata tespiti veya performans darbo\u011fazlar\u0131n\u0131 analiz etme ihtiyac\u0131 do\u011fdu\u011funda daha da belirginle\u015fir.<\/p>\n<p>Tek bir log dosyas\u0131nda t\u00fcm spider&#8217;lar\u0131n kar\u0131\u015f\u0131k kay\u0131tlar\u0131n\u0131 g\u00f6rmek, adeta bir bilgi karma\u015fas\u0131 yarat\u0131r. \u00d6rne\u011fin, bir e-ticaret sitesinden \u00fcr\u00fcn fiyatlar\u0131n\u0131 \u00e7eken spider&#8217;\u0131n\u0131z\u0131n yava\u015f \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 fark etti\u011finizde, di\u011fer spider&#8217;lar\u0131n a\u011f istekleri veya sayfa ayr\u0131\u015ft\u0131rma (parsing) hatalar\u0131 aras\u0131nda, ilgili performans\u0131 d\u00fc\u015f\u00fcren sat\u0131rlar\u0131 bulmak i\u011fneyle kuyu kazmak gibidir. Bu durum, sadece zaman kaybettirmekle kalmaz, ayn\u0131 zamanda potansiyel hatalar\u0131n g\u00f6zden ka\u00e7mas\u0131na ve dolay\u0131s\u0131yla projenizin genel g\u00fcvenilirli\u011finin azalmas\u0131na yol a\u00e7abilir. \u0130\u015fte tam da bu noktada, her bir Scrapy spider&#8217;\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturman\u0131n \u00f6nemi ortaya \u00e7\u0131kar. Bu sayede, her spider kendi &#8220;g\u00fcnl\u00fc\u011f\u00fcn\u00fc&#8221; tutar ve bu da sorunlar\u0131 anlama, giderme ve performans\u0131 optimize etme s\u00fcrecini k\u00f6kten basitle\u015ftirir. Bu yakla\u015f\u0131m, sadece hata ay\u0131klama s\u00fcrecini h\u0131zland\u0131rmakla kalmaz, ayn\u0131 zamanda projelerinizin uzun vadeli bak\u0131m\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi a\u00e7\u0131s\u0131ndan da vazge\u00e7ilmez bir stratejidir.<\/p>\n<p>Bu makale boyunca, Scrapy&#8217;nin g\u00fc\u00e7l\u00fc Python <a href=\"https:\/\/docs.python.org\/3\/library\/logging.html\" target=\"_blank\">logging<\/a> mod\u00fcl\u00fcn\u00fc nas\u0131l kullanarak her spider&#8217;\u0131n\u0131z i\u00e7in \u00f6zel log dosyalar\u0131 olu\u015fturaca\u011f\u0131n\u0131z\u0131, bu dosyalar\u0131 nas\u0131l y\u00f6netece\u011finizi ve kay\u0131tlar\u0131n\u0131z\u0131 daha anlaml\u0131 hale getirmek i\u00e7in hangi \u00f6zelle\u015ftirmeleri yapabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, Scrapy projelerinizde log y\u00f6netimini bir zorluktan ziyade, g\u00fc\u00e7l\u00fc bir hata ay\u0131klama ve izleme arac\u0131na d\u00f6n\u00fc\u015ft\u00fcrmektir.<\/p>\n<h2>Temel Kavramlar: Python&#8217;\u0131n Logging Mod\u00fcl\u00fc ve Scrapy ile Entegrasyonu Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Dinamik loglama stratejilerine ge\u00e7meden \u00f6nce, Scrapy&#8217;nin temelinde yatan Python&#8217;\u0131n <code>logging<\/code> mod\u00fcl\u00fcn\u00fc ve bu mod\u00fcl\u00fcn Scrapy ile nas\u0131l entegre oldu\u011funu anlamak hayati \u00f6neme sahiptir. Python&#8217;\u0131n <code>logging<\/code> mod\u00fcl\u00fc, uygulamalar\u0131n\u0131zda olaylar\u0131 izlemek i\u00e7in esnek ve g\u00fc\u00e7l\u00fc bir \u00e7er\u00e7eve sunar. Bu olaylar, bir program\u0131n durumunu, hata mesajlar\u0131n\u0131, uyar\u0131lar\u0131 veya yaln\u0131zca bilgilendirme ama\u00e7l\u0131 mesajlar\u0131 i\u00e7erebilir. Mod\u00fcl\u00fcn temelinde d\u00f6rt ana bile\u015fen bulunur:<\/p>\n<ol>\n<li><strong>Logger&#8217;lar:<\/strong> Uygulaman\u0131zda log mesajlar\u0131 \u00fcreten ana giri\u015f noktalar\u0131d\u0131r. Hiyerar\u015fik bir yap\u0131ya sahiptirler ve farkl\u0131 mod\u00fcller veya i\u015flevler i\u00e7in farkl\u0131 logger&#8217;lar tan\u0131mlanabilir.<\/li>\n<li><strong>Handler&#8217;lar:<\/strong> Logger&#8217;lar taraf\u0131ndan \u00fcretilen log mesajlar\u0131n\u0131 al\u0131r ve belirli bir hedefe (konsol, dosya, a\u011f soketi, e-posta vb.) y\u00f6nlendirir. \u00d6rne\u011fin, <code>StreamHandler<\/code> mesajlar\u0131 konsola yazarken, <code>FileHandler<\/code> bir dosyaya yazar.<\/li>\n<li><strong>Formatter&#8217;lar:<\/strong> Log mesajlar\u0131n\u0131n son \u00e7\u0131kt\u0131s\u0131n\u0131 (format\u0131n\u0131) belirler. Tarih\/saat, log seviyesi, dosya ad\u0131, sat\u0131r numaras\u0131 gibi bilgileri mesaj\u0131n i\u00e7ine dahil edebilirler.<\/li>\n<li><strong>Filter&#8217;lar:<\/strong> Handler&#8217;lara ula\u015fmadan \u00f6nce log mesajlar\u0131n\u0131 filtrelemek i\u00e7in kullan\u0131l\u0131r. Belirli ko\u015fullar\u0131 kar\u015f\u0131lamayan mesajlar\u0131n i\u015flenmesini engelleyebilirler.<\/li>\n<\/ol>\n<p>Scrapy, varsay\u0131lan olarak bu <code>logging<\/code> mod\u00fcl\u00fcn\u00fc kapsaml\u0131 bir \u015fekilde kullan\u0131r. Projenizi \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Scrapy arka planda bir varsay\u0131lan logger olu\u015fturur ve bu logger genellikle log mesajlar\u0131n\u0131 konsola (<code>StreamHandler<\/code> arac\u0131l\u0131\u011f\u0131yla) yazd\u0131r\u0131r. Ayr\u0131ca, <code>LOG_FILE<\/code> ayar\u0131n\u0131 kullanarak t\u00fcm Scrapy loglar\u0131n\u0131 tek bir dosyaya y\u00f6nlendirme se\u00e7ene\u011fi de sunar. Bu, k\u00fc\u00e7\u00fck projeler i\u00e7in yeterli olabilir, ancak yukar\u0131da bahsedilen \u00f6l\u00e7eklenebilirlik sorunlar\u0131na yol a\u00e7ar. Scrapy&#8217;nin <code>settings.py<\/code> dosyas\u0131ndaki baz\u0131 \u00f6nemli log ayarlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>LOG_ENABLED = True<\/code>: Loglamay\u0131 etkinle\u015ftirir veya devre d\u0131\u015f\u0131 b\u0131rak\u0131r.<\/li>\n<li><code>LOG_LEVEL = 'DEBUG'<\/code>: Loglar\u0131n seviyesini belirler (DEBUG, INFO, WARNING, ERROR, CRITICAL). Varsay\u0131lan olarak DEBUG en d\u00fc\u015f\u00fck seviyedir ve t\u00fcm mesajlar\u0131 g\u00f6sterir.<\/li>\n<li><code>LOG_FILE = 'my_spider.log'<\/code>: T\u00fcm loglar\u0131 belirtilen dosyaya yazar.<\/li>\n<li><code>LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'<\/code>: Log mesajlar\u0131n\u0131n format\u0131n\u0131 belirler.<\/li>\n<li><code>LOG_DATEFORMAT = '%Y-%m-%d %H:%M:%S'<\/code>: Logdaki zaman damgas\u0131n\u0131n format\u0131n\u0131 belirler.<\/li>\n<\/ul>\n<p>Varsay\u0131lan Scrapy loglama entegrasyonu, t\u00fcm loglar\u0131 tek bir global logger \u00fczerinden y\u00f6netir. Bu, farkl\u0131 spider&#8217;lar aras\u0131nda ayr\u0131m yapmay\u0131 zorla\u015ft\u0131r\u0131r. \u0130\u015fte bu y\u00fczden, her spider&#8217;a \u00f6zel bir loglama mekanizmas\u0131 eklemek i\u00e7in Python&#8217;\u0131n <code>logging<\/code> mod\u00fcl\u00fcn\u00fcn esnekli\u011finden faydalanmam\u0131z gerekir. Bu, her spider&#8217;\u0131n kendi logger&#8217;\u0131n\u0131, handler&#8217;\u0131n\u0131 ve formatter&#8217;\u0131n\u0131 olu\u015fturmas\u0131n\u0131 sa\u011flayarak, log mesajlar\u0131n\u0131n belirli bir spider&#8217;a ait oldu\u011funu kesin olarak bilmemizi m\u00fcmk\u00fcn k\u0131lar. B\u00f6ylece, devasa bir log dosyas\u0131nda bir spider&#8217;\u0131n kay\u0131tlar\u0131n\u0131 aramak yerine, do\u011frudan o spider&#8217;\u0131n \u00f6zel log dosyas\u0131na bakarak \u00e7ok daha h\u0131zl\u0131 ve etkili bir \u015fekilde sorunlar\u0131 tespit edebiliriz.<\/p>\n<p>Bir sonraki b\u00f6l\u00fcmde, bu temel bilgileri kullanarak her spider i\u00e7in nas\u0131l dinamik olarak ayr\u0131 log dosyalar\u0131 olu\u015fturaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ele alaca\u011f\u0131z ve bu sayede Scrapy projelerinizin loglama yeteneklerini bir \u00fcst seviyeye ta\u015f\u0131yaca\u011f\u0131z.<\/p>\n<h2>Her Spider \u0130\u00e7in \u00d6zel Log Dosyas\u0131 Olu\u015fturma: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Scrapy projelerinizde her spider i\u00e7in ayr\u0131 bir log dosyas\u0131 olu\u015fturmak, proje y\u00f6netimini ve hata ay\u0131klamay\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Bu s\u00fcreci, Python&#8217;\u0131n <code>logging<\/code> mod\u00fcl\u00fcn\u00fcn g\u00fcc\u00fcn\u00fc kullanarak ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 inceleyelim. Temel fikir, her spider&#8217;\u0131n kendisi ba\u015flat\u0131ld\u0131\u011f\u0131nda (veya <a href=\"https:\/\/docs.scrapy.org\/en\/latest\/topics\/extensions.html\" target=\"_blank\">Scrapy uzant\u0131s\u0131<\/a> arac\u0131l\u0131\u011f\u0131yla), kendi \u00f6zel logger&#8217;\u0131n\u0131, dosya handler&#8217;\u0131n\u0131 ve formatter&#8217;\u0131n\u0131 ayarlamas\u0131d\u0131r.<\/p>\n<h3>1. Ad\u0131m: Scrapy&#8217;nin Varsay\u0131lan Dosya Loglamas\u0131n\u0131 Devre D\u0131\u015f\u0131 B\u0131rak\u0131n<\/h3>\n<p>\u00d6ncelikle, Scrapy&#8217;nin t\u00fcm loglar\u0131 tek bir dosyaya yazma davran\u0131\u015f\u0131n\u0131 engellememiz gerekiyor. Bunu <code>settings.py<\/code> dosyan\u0131zda yaparak global loglama davran\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftiriyoruz:<\/p>\n<pre><code class=\"language-python\"># settings.py\n# Varsay\u0131lan dosya loglamas\u0131n\u0131 kapat\nLOG_FILE = None\n# Log seviyesini uygun bir de\u011fere ayarla\nLOG_LEVEL = 'INFO' # Yaln\u0131zca \u00f6nemli bilgileri ve hatalar\u0131 g\u00f6rmek i\u00e7in 'INFO' veya 'WARNING' idealdir\n<\/pre>\n<p><\/code><\/p>\n<p><code>LOG_FILE = None<\/code> olarak ayarlamak, Scrapy'nin t\u00fcm loglar\u0131 tek bir dosyaya yazmas\u0131n\u0131 engeller. <code>LOG_LEVEL<\/code>'\u0131 ise, varsay\u0131lan olarak Scrapy taraf\u0131ndan konsola (e\u011fer ba\u015fka bir handler eklemezseniz) veya di\u011fer \u00f6zel handler'lara g\u00f6nderilecek mesajlar\u0131n minimum seviyesini belirler. Bu, gereksiz debug mesajlar\u0131n\u0131n genel log ak\u0131\u015f\u0131n\u0131 kirletmesini \u00f6nlemek i\u00e7in \u00f6nemlidir.<\/p>\n<h3>2. Ad\u0131m: Her Spider \u0130\u00e7in \u00d6zel Bir Logger ve FileHandler Olu\u015fturun<\/h3>\n<p>\u015eimdi s\u0131ra, her spider'\u0131n kendi \u00f6zel log mekanizmas\u0131n\u0131 nas\u0131l kuraca\u011f\u0131na geliyor. Bu genellikle spider s\u0131n\u0131f\u0131n\u0131n <code>__init__<\/code> metodu i\u00e7inde yap\u0131l\u0131r. A\u015fa\u011f\u0131daki \u00f6rnek, <code>MySpider<\/code> ad\u0131nda bir spider i\u00e7in nas\u0131l \u00f6zel bir log dosyas\u0131 olu\u015fturulaca\u011f\u0131n\u0131 g\u00f6steriyor:<\/p>\n<pre><code class=\"language-python\"># my_spider.py\nimport logging\nimport os\nfrom scrapy import Spider\n\nclass MySpider(Spider):\n    name = 'my_spider'\n    start_urls = ['http:\/\/quotes.toscrape.com\/']\n\n    custom_settings = {\n        'LOG_LEVEL': 'INFO', # Bu spider i\u00e7in \u00f6zel log seviyesi\n    }\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        \n        # Log dosyas\u0131n\u0131n kaydedilece\u011fi dizini olu\u015ftur\n        log_dir = 'logs'\n        if not os.path.exists(log_dir):\n            os.makedirs(log_dir)\n\n        # Spider'a \u00f6zel log dosyas\u0131 ad\u0131 olu\u015ftur\n        log_file_name = os.path.join(log_dir, f'{self.name}.log')\n\n        # Yeni bir logger \u00f6rne\u011fi al veya olu\u015ftur\n        self.logger = logging.getLogger(self.name)\n        self.logger.setLevel(logging.INFO) # Bu logger i\u00e7in minimum log seviyesi\n\n        # T\u00fcm mevcut handler'lar\u0131 temizle (iste\u011fe ba\u011fl\u0131 ama kar\u0131\u015f\u0131kl\u0131\u011f\u0131 \u00f6nler)\n        if not self.logger.handlers: # Sadece hen\u00fcz handler atanmam\u0131\u015fsa ekle\n            # Bir FileHandler olu\u015ftur ve log dosyas\u0131n\u0131 belirt\n            file_handler = logging.FileHandler(log_file_name, mode='a', encoding='utf-8')\n            file_handler.setLevel(logging.INFO) # Dosya handler'\u0131 i\u00e7in minimum log seviyesi\n\n            # Log format\u0131n\u0131 belirle\n            formatter = logging.Formatter(\n                '%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n                datefmt='%Y-%m-%d %H:%M:%S'\n            )\n            file_handler.setFormatter(formatter)\n\n            # FileHandler'\u0131 logger'a ekle\n            self.logger.addHandler(file_handler)\n\n            # Opsiyonel: Konsol loglamay\u0131 da eklemek isterseniz\n            # console_handler = logging.StreamHandler()\n            # console_handler.setLevel(logging.DEBUG)\n            # console_handler.setFormatter(formatter)\n            # self.logger.addHandler(console_handler)\n\n        # Scrapy'nin kendi logger'\u0131na ayn\u0131 handler'lar\u0131 eklemeyi \u00f6nlemek i\u00e7in\n        # Scrapy'nin root logger'\u0131na propagasyonu kapat (\u00e7o\u011fu durumda tercih edilir)\n        self.logger.propagate = False \n\n    def parse(self, response):\n        self.logger.info(f'URL {response.url} ba\u015far\u0131yla i\u015flendi.')\n        quotes = response.css('div.quote')\n        for quote in quotes:\n            text = quote.css('span.text::text').get()\n            author = quote.css('small.author::text').get()\n            self.logger.debug(f'Al\u0131nt\u0131 bulundu: \"{text[:30]}...\" yazar: {author}')\n            yield {\n                'text': text,\n                'author': author,\n            }\n\n        next_page = response.css('li.next a::attr(href)').get()\n        if next_page is not None:\n            self.logger.info(f'Sonraki sayfa bulunuyor: {next_page}')\n            yield response.follow(next_page, callback=self.parse)\n        else:\n            self.logger.info('T\u00fcm sayfalar i\u015flendi, sonraki sayfa yok.')\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda dikkat edilmesi gereken baz\u0131 noktalar:<\/p>\n<ul>\n<li><code>os.path.join(log_dir, f'{self.name}.log')<\/code>: Her spider i\u00e7in, ad\u0131n\u0131 kullanarak benzersiz bir log dosyas\u0131 ad\u0131 olu\u015ftururuz. Bu, <code>logs\/my_spider.log<\/code> gibi bir dosya olu\u015fturur.<\/li>\n<li><code>logging.getLogger(self.name)<\/code>: Spider'\u0131n ad\u0131 ile \u00f6zel bir logger al\u0131r\u0131z. Bu, log mesajlar\u0131n\u0131n hangi spider'dan geldi\u011fini a\u00e7\u0131k\u00e7a belirtir.<\/li>\n<li><code>self.logger.propagate = False<\/code>: Bu sat\u0131r \u00e7ok \u00f6nemlidir. Varsay\u0131lan olarak, bir logger'dan gelen mesajlar hiyerar\u015fik olarak \u00fcst logger'lara (root logger dahil) \"yay\u0131larak\" g\u00f6nderilir. E\u011fer bunu <code>False<\/code> yapmazsan\u0131z, sizin \u00f6zel handler'lar\u0131n\u0131z\u0131n yan\u0131 s\u0131ra Scrapy'nin varsay\u0131lan handler'lar\u0131 da ayn\u0131 mesajlar\u0131 i\u015fleyebilir ve bu da loglar\u0131n\u0131z\u0131n tekrar etmesine neden olabilir.<\/li>\n<li><code>if not self.logger.handlers:<\/code>: Bu kontrol, <code>__init__<\/code> metodunun birden fazla \u00e7a\u011fr\u0131lmas\u0131 durumunda (\u00f6rne\u011fin Scrapy'nin farkl\u0131 bile\u015fenleri taraf\u0131ndan) ayn\u0131 handler'lar\u0131n logger'a tekrar tekrar eklenmesini \u00f6nler. Bu da loglar\u0131n\u0131z\u0131n iki\u015fer kez yaz\u0131lmas\u0131n\u0131 engeller.<\/li>\n<\/ul>\n<h3>Vaka Analizi: E-ticaret \u00dcr\u00fcn Veri Kaz\u0131ma Senaryosu<\/h3>\n<p>Bir e-ticaret platformunda farkl\u0131 kategorilerdeki \u00fcr\u00fcn verilerini \u00e7eken \u00fc\u00e7 ayr\u0131 spider'\u0131n\u0131z oldu\u011funu d\u00fc\u015f\u00fcn\u00fcn: <code>ElectronicsSpider<\/code>, <code>ClothingSpider<\/code> ve <code>BooksSpider<\/code>. Her birinin kendine ait binlerce \u00fcr\u00fcn\u00fc i\u015fledi\u011fi ve kendi hatalar\u0131yla kar\u015f\u0131la\u015fabilece\u011fi bir senaryo hayal edin.<\/p>\n<p>Bu dinamik loglama yakla\u015f\u0131m\u0131 sayesinde:<\/p>\n<ul>\n<li><code>logs\/electronics_spider.log<\/code><\/li>\n<li><code>logs\/clothing_spider.log<\/code><\/li>\n<li><code>logs\/books_spider.log<\/code><\/li>\n<\/ul>\n<p>gibi ayr\u0131 log dosyalar\u0131na sahip olursunuz. Diyelim ki <code>ClothingSpider<\/code> beklenmedik bir \u015fekilde durdu. Yapman\u0131z gereken tek \u015fey <code>logs\/clothing_spider.log<\/code> dosyas\u0131n\u0131 a\u00e7\u0131p son kaydedilen hata mesajlar\u0131na bakmakt\u0131r. T\u00fcm loglar\u0131n i\u00e7inden ilgili sat\u0131rlar\u0131 ay\u0131klamak i\u00e7in saatler harcamak yerine, dakikalar i\u00e7inde sorunu tespit edip \u00e7\u00f6z\u00fcme odaklanabilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve kritik veri kaz\u0131ma operasyonlar\u0131nda zaman ve kaynak tasarrufu sa\u011flar.<\/p>\n<p>Bu ad\u0131mlarla, Scrapy projelerinizde her spider i\u00e7in \u00f6zel, dinamik log dosyalar\u0131 olu\u015fturman\u0131n temelini atm\u0131\u015f olursunuz. Bir sonraki b\u00f6l\u00fcmde, bu loglama yap\u0131s\u0131n\u0131 daha da geli\u015ftirerek log formatlar\u0131n\u0131 ve seviyelerini nas\u0131l \u00f6zelle\u015ftirebilece\u011finizi inceleyece\u011fiz.<\/p>\n<h3>Log Formatlamay\u0131 ve Seviyelerini \u00d6zelle\u015ftirme: Daha Anlaml\u0131 Kay\u0131tlar Nas\u0131l Tutulur?<\/h3>\n<p>Loglama sadece mesaj kaydetmekten ibaret de\u011fildir; kaydedilen mesajlar\u0131n okunabilirli\u011fi, anla\u015f\u0131labilirli\u011fi ve analizi de b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Python'\u0131n <code>logging<\/code> mod\u00fcl\u00fc ve dolay\u0131s\u0131yla Scrapy, log mesajlar\u0131n\u0131n format\u0131n\u0131 ve hangi seviyedeki mesajlar\u0131n kaydedilece\u011fini (veya g\u00f6sterilece\u011fini) \u00f6zelle\u015ftirme konusunda geni\u015f se\u00e7enekler sunar. Bu \u00f6zelle\u015ftirmeler, log dosyalar\u0131n\u0131z\u0131n ger\u00e7ek bir bilgi kayna\u011f\u0131 haline gelmesini sa\u011flar.<\/p>\n<h4>Log Seviyeleri: Ne Zaman Ne Kaydedilmeli?<\/h4>\n<p>Python <code>logging<\/code> mod\u00fcl\u00fc, mesajlar\u0131 \u00f6nem derecelerine g\u00f6re kategorize etmek i\u00e7in standart log seviyeleri tan\u0131mlar. Bu seviyeler, bir olay\u0131n ciddiyetini veya t\u00fcr\u00fcn\u00fc belirtir:<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Seviye<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<th>Kullan\u0131m Alan\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>DEBUG<\/code><\/td>\n<td>Detayl\u0131 hata ay\u0131klama bilgileri, yaln\u0131zca sorunu te\u015fhis etmeye \u00e7al\u0131\u015f\u0131rken faydal\u0131d\u0131r.<\/td>\n<td>De\u011fi\u015fken de\u011ferleri, fonksiyon \u00e7a\u011fr\u0131lar\u0131, ad\u0131m ad\u0131m i\u015flem takibi.<\/td>\n<\/tr>\n<tr>\n<td><code>INFO<\/code><\/td>\n<td>Bir uygulaman\u0131n normal \u00e7al\u0131\u015fmas\u0131 hakk\u0131nda genel onaylay\u0131c\u0131 bilgiler.<\/td>\n<td>\u0130\u015flem ba\u015flang\u0131c\u0131\/biti\u015fi, \u00f6nemli olaylar (\u00f6rn. sayfa kaz\u0131nd\u0131, X \u00fcr\u00fcn bulundu).<\/td>\n<\/tr>\n<tr>\n<td><code>WARNING<\/code><\/td>\n<td>Beklenmeyen bir olay\u0131n meydana geldi\u011fini veya yak\u0131n gelecekte bir sorunun olabilece\u011fini g\u00f6sterir.<\/td>\n<td>\u00d6rn. bir URL'ye eri\u015filemedi, CAPTCHA ile kar\u015f\u0131la\u015f\u0131ld\u0131, baz\u0131 veriler eksik.<\/td>\n<\/tr>\n<tr>\n<td><code>ERROR<\/code><\/td>\n<td>Uygulama d\u00fczg\u00fcn \u00e7al\u0131\u015fmaya devam edemedi\u011fi i\u00e7in daha ciddi bir sorun.<\/td>\n<td>\u00d6rn. kritik bir API yan\u0131t vermedi, dosya yazma hatas\u0131, ayr\u0131\u015ft\u0131rma hatas\u0131.<\/td>\n<\/tr>\n<tr>\n<td><code>CRITICAL<\/code><\/td>\n<td>\u00c7ok ciddi bir hata, uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 tamamen durdurabilir.<\/td>\n<td>Veritaban\u0131 ba\u011flant\u0131s\u0131 koptu, anahtar bile\u015fen ba\u015flat\u0131lamad\u0131.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Her logger ve handler i\u00e7in ayr\u0131 ayr\u0131 <code>setLevel()<\/code> metodunu kullanarak hangi seviyedeki mesajlar\u0131 i\u015fleyeceklerini belirleyebilirsiniz. \u00d6rne\u011fin, \u00fcretim ortam\u0131nda sadece <code>INFO<\/code> ve \u00fczeri mesajlar\u0131 kaydetmek, geli\u015ftirme ortam\u0131nda ise <code>DEBUG<\/code> seviyesini etkinle\u015ftirmek yayg\u0131n bir pratiktir.<\/p>\n<pre><code class=\"language-python\"># Spider init metodu i\u00e7inde\nself.logger.setLevel(logging.INFO) # Logger seviyesi\nfile_handler.setLevel(logging.WARNING) # Dosya handler'\u0131 sadece WARN ve \u00fczeri mesajlar\u0131 kaydetsin\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, spider'\u0131n logger'\u0131 <code>INFO<\/code> ve \u00fczeri t\u00fcm mesajlar\u0131 i\u015flerken, <code>file_handler<\/code> sadece <code>WARNING<\/code> ve \u00fczeri mesajlar\u0131 log dosyas\u0131na yazacakt\u0131r. Bu sayede, konsolda daha fazla detay g\u00f6r\u00fcrken, dosya logunda yaln\u0131zca kritik sorunlar\u0131 tutabilirsiniz.<\/p>\n<h4>Custom Formatters: Log Mesajlar\u0131n\u0131 Daha Anlaml\u0131 Hale Getirme<\/h4>\n<p>Bir <code>Formatter<\/code> kullanarak log mesajlar\u0131n\u0131n nas\u0131l g\u00f6r\u00fcnece\u011fini belirleyebilirsiniz. Bu, hata ay\u0131klama ve analiz i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Temel format string'i, yer tutucular (placeholders) i\u00e7erir. \u00d6nceki \u00f6rnekte kullan\u0131lan format\u0131 biraz daha detayland\u0131ral\u0131m:<\/p>\n<pre><code class=\"language-python\"># Spider init metodu i\u00e7inde\nformatter = logging.Formatter(\n    '[%(asctime)s] - %(name)s - %(levelname)s - %(module)s.%(funcName)s:%(lineno)d - %(message)s',\n    datefmt='%Y-%m-%d %H:%M:%S'\n)\nfile_handler.setFormatter(formatter)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu format string'i bir\u00e7ok faydal\u0131 bilgi i\u00e7erir:<\/p>\n<ul>\n<li><code>%(asctime)s<\/code>: Logland\u0131\u011f\u0131 tarih ve saat.<\/li>\n<li><code>%(name)s<\/code>: Logger'\u0131n ad\u0131 (yani spider'\u0131n ad\u0131).<\/li>\n<li><code>%(levelname)s<\/code>: Log mesaj\u0131n\u0131n seviyesi (INFO, DEBUG vb.).<\/li>\n<li><code>%(module)s<\/code>: Log \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 mod\u00fcl\u00fcn ad\u0131.<\/li>\n<li><code>%(funcName)s<\/code>: Log \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 fonksiyonun ad\u0131.<\/li>\n<li><code>%(lineno)d<\/code>: Log \u00e7a\u011fr\u0131s\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 sat\u0131r numaras\u0131.<\/li>\n<li><code>%(message)s<\/code>: As\u0131l log mesaj\u0131.<\/li>\n<\/ul>\n<p>Bu geli\u015fmi\u015f format, bir hatan\u0131n tam olarak ne zaman, hangi spider'da, hangi dosyada ve hangi fonksiyonun hangi sat\u0131r\u0131nda meydana geldi\u011fini size an\u0131nda g\u00f6sterir. Bu bilgiler, karma\u015f\u0131k hatalar\u0131n izini s\u00fcrmek i\u00e7in paha bi\u00e7ilmezdir. \u00d6zellikle b\u00fcy\u00fck Scrapy projelerinde, bir hatan\u0131n k\u00f6kenini h\u0131zl\u0131ca bulmak, geli\u015ftirme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<\/p>\n<div class=\"expert-tip\">\n<p>Uzman \u0130pucu: Log format\u0131n\u0131za benzersiz bir ID (\u00f6rne\u011fin request ID veya session ID) ekleyerek, bir kullan\u0131c\u0131n\u0131n veya bir i\u015flem ak\u0131\u015f\u0131n\u0131n t\u00fcm log mesajlar\u0131n\u0131 kolayca gruplayabilirsiniz. Bu, da\u011f\u0131t\u0131k sistemlerde hata ay\u0131klama i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fc bir tekniktir.<\/p>\n<\/p><\/div>\n<p>\u00d6zelle\u015ftirilmi\u015f log seviyeleri ve formatlar\u0131 kullanarak, Scrapy projelerinizin loglar\u0131n\u0131 sadece bir kay\u0131t y\u0131\u011f\u0131n\u0131 olmaktan \u00e7\u0131kar\u0131p, hata ay\u0131klama ve performans izleme i\u00e7in etkili bir araca d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz. Bir sonraki b\u00f6l\u00fcmde, log rotasyonu ve hata yakalama gibi daha ileri d\u00fczey konulara de\u011finece\u011fiz.<\/p>\n<h2>\u0130leri D\u00fczey Log Y\u00f6netimi: Log Rotasyonu, Hata Yakalama ve Performans \u0130zleme<\/h2>\n<p>Temel dinamik loglama yap\u0131land\u0131rmas\u0131n\u0131 kurduktan sonra, Scrapy projelerinizin log y\u00f6netimini bir sonraki seviyeye ta\u015f\u0131mak i\u00e7in ileri d\u00fczey tekniklere bakman\u0131n zaman\u0131 geldi. Bu teknikler, \u00f6zellikle uzun s\u00fcre \u00e7al\u0131\u015fan veya \u00e7ok fazla veri kaz\u0131yan projelerde log dosyalar\u0131n\u0131n boyutunu kontrol alt\u0131nda tutmak, kritik hatalar\u0131 otomatik olarak bildirmek ve genel performans\u0131 izlemek i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Log Rotasyonu: B\u00fcy\u00fck Log Dosyalar\u0131na Son!<\/h3>\n<p>Her spider i\u00e7in ayr\u0131 log dosyalar\u0131 tutmak harika, ancak zamanla bu dosyalar da devasa boyutlara ula\u015fabilir. \u00d6zellikle <code>DEBUG<\/code> seviyesinde loglama yap\u0131yorsan\u0131z, birka\u00e7 saat i\u00e7inde gigabaytlarca veri birikebilir. Bu, hem disk alan\u0131n\u0131 t\u00fcketir hem de log dosyalar\u0131n\u0131 a\u00e7may\u0131 ve analiz etmeyi zorla\u015ft\u0131r\u0131r. Python'\u0131n <code>logging.handlers<\/code> mod\u00fcl\u00fc, bu sorunu \u00e7\u00f6zmek i\u00e7in <code>RotatingFileHandler<\/code> ve <code>TimedRotatingFileHandler<\/code> gibi g\u00fc\u00e7l\u00fc ara\u00e7lar sunar.<\/p>\n<p><strong>RotatingFileHandler: Boyuta G\u00f6re Rotasyon<\/strong><\/p>\n<p>Bu handler, log dosyas\u0131n\u0131n belirli bir boyuta ula\u015ft\u0131\u011f\u0131nda otomatik olarak yeni bir dosya olu\u015fturmas\u0131n\u0131 sa\u011flar. Eski dosya yeniden adland\u0131r\u0131l\u0131r (\u00f6rn. <code>.log.1<\/code>, <code>.log.2<\/code>) ve belirli say\u0131da yedek kopya tutulur.<\/p>\n<pre><code class=\"language-python\"># Spider __init__ metodu i\u00e7inde\nfrom logging.handlers import RotatingFileHandler\n\n# ... (\u00f6nceki kod) ...\n\n# 10 MB'a ula\u015f\u0131nca dosya rotasyonu yap, 5 tane yedek tut\nfile_handler = RotatingFileHandler(\n    log_file_name,\n    maxBytes=10 * 1024 * 1024, # 10 MB\n    backupCount=5,\n    encoding='utf-8'\n)\nfile_handler.setLevel(logging.INFO)\nfile_handler.setFormatter(formatter)\nself.logger.addHandler(file_handler)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ayar ile <code>my_spider.log<\/code> dosyas\u0131 10 MB'a ula\u015ft\u0131\u011f\u0131nda, ad\u0131 <code>my_spider.log.1<\/code> olarak de\u011fi\u015ftirilecek ve yeni loglar <code>my_spider.log<\/code> dosyas\u0131na yaz\u0131lacakt\u0131r. Bu s\u00fcre\u00e7 <code>backupCount<\/code> de\u011feri kadar tekrar eder.<\/p>\n<p><strong>TimedRotatingFileHandler: Zamana G\u00f6re Rotasyon<\/strong><\/p>\n<p>E\u011fer log dosyalar\u0131n\u0131 g\u00fcnl\u00fck, haftal\u0131k veya saatlik periyotlarla rotasyona u\u011fratmak isterseniz, <code>TimedRotatingFileHandler<\/code> daha uygundur. Bu, \u00f6zellikle loglar\u0131 tarih baz\u0131nda ar\u015fivlemek istedi\u011finizde faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\"># Spider __init__ metodu i\u00e7inde\nfrom logging.handlers import TimedRotatingFileHandler\n\n# ... (\u00f6nceki kod) ...\n\n# Her gece yar\u0131s\u0131 (midnight) rotasyon yap, son 7 g\u00fcn\u00fc sakla\nfile_handler = TimedRotatingFileHandler(\n    log_file_name,\n    when='midnight', # 'h' (saatlik), 'd' (g\u00fcnl\u00fck), 'w0' (Pazartesi), 's' (saniyelik) gibi se\u00e7enekler de var\n    interval=1, # Her 'when' biriminde bir kez (\u00f6rn. her g\u00fcn)\n    backupCount=7,\n    encoding='utf-8'\n)\nfile_handler.setLevel(logging.INFO)\nfile_handler.setFormatter(formatter)\nself.logger.addHandler(file_handler)\n<\/pre>\n<p><\/code><\/p>\n<h3>Hata Yakalama ve Bildirim: Kritik Sorunlar\u0131 An\u0131nda Tespit Edin<\/h3>\n<p>Scrapy projelerinizde meydana gelen kritik hatalar\u0131 sadece log dosyas\u0131na yazmak yeterli de\u011fildir; bu hatalardan an\u0131nda haberdar olmak istersiniz. Bunun i\u00e7in loglama sisteminizi harici servislerle entegre edebilirsiniz:<\/p>\n<ol>\n<li><strong>Sentry Entegrasyonu:<\/strong> <a href=\"https:\/\/sentry.io\/\" target=\"_blank\">Sentry<\/a>, modern hata izleme platformlar\u0131ndan biridir. Scrapy projenize <a href=\"https:\/\/docs.sentry.io\/platforms\/python\/integrations\/logging\/\" target=\"_blank\">Sentry SDK's\u0131n\u0131<\/a> ekleyerek, <code>ERROR<\/code> veya <code>CRITICAL<\/code> seviyesindeki log mesajlar\u0131n\u0131 otomatik olarak Sentry'ye g\u00f6nderebilirsiniz. Sentry, bu hatalar\u0131 gruplar, bildirimler g\u00f6nderir ve detayl\u0131 hata izleri sunar. Bu, \u00f6zellikle \u00fcretim ortam\u0131nda proaktif hata y\u00f6netimi i\u00e7in hayati \u00f6neme sahiptir.<\/li>\n<li><strong>E-posta veya Anl\u0131k Mesajla\u015fma (Slack\/Telegram):<\/strong> Daha basit bir \u00e7\u00f6z\u00fcm olarak, <code>logging.handlers.SMTPHandler<\/code> ile kritik hatalar\u0131 e-posta ile alabilir veya \u00f6zel bir handler yazarak (veya mevcut k\u00fct\u00fcphaneleri kullanarak) Slack veya Telegram gibi platformlara bildirim g\u00f6nderebilirsiniz. Bu sayede, herhangi bir kritik durum olu\u015ftu\u011funda an\u0131nda haberdar olursunuz.<\/li>\n<\/ol>\n<pre><code class=\"language-python\"># settings.py (Sentry i\u00e7in)\n# pip install sentry-sdk\nimport sentry_sdk\nfrom sentry_sdk.integrations.logging import LoggingIntegration\n\nsentry_sdk.init(\n    dsn=\"YOUR_SENTRY_DSN_HERE\",\n    integrations=[LoggingIntegration(level=logging.ERROR)],\n    traces_sample_rate=1.0,\n)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ayar ile Scrapy'den gelen t\u00fcm <code>ERROR<\/code> seviyesindeki veya daha y\u00fcksek log mesajlar\u0131 otomatik olarak Sentry'ye g\u00f6nderilir.<\/p>\n<h3>Performans \u0130zleme \u0130\u00e7in Loglama<\/h3>\n<p>Loglama sadece hatalar\u0131 de\u011fil, ayn\u0131 zamanda projenizin performans\u0131n\u0131 da izlemek i\u00e7in kullan\u0131labilir. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong>\u0130\u015flem S\u00fcrelerini Loglama:<\/strong> Bir sayfan\u0131n i\u015flenmesinin ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc veya bir iste\u011fin ne kadar s\u00fcrede tamamland\u0131\u011f\u0131n\u0131 <code>INFO<\/code> seviyesinde loglayarak zaman i\u00e7indeki performans trendlerini takip edebilirsiniz.<\/li>\n<li><strong>Kaynak Kullan\u0131m\u0131n\u0131 \u0130zleme:<\/strong> \u00d6zel log mesajlar\u0131 ile belirli aral\u0131klarla haf\u0131za veya CPU kullan\u0131m\u0131n\u0131 kaydederek darbo\u011fazlar\u0131 tespit edebilirsiniz.<\/li>\n<li><strong>Spider \u0130statistikleri:<\/strong> Scrapy'nin kendi istatistik sistemine ek olarak, \u00f6nemli metrikleri (kaz\u0131nan \u00fcr\u00fcn say\u0131s\u0131, ba\u015far\u0131s\u0131z istek say\u0131s\u0131) spider kapand\u0131\u011f\u0131nda loglayarak her spider'\u0131n performans\u0131n\u0131 \u00f6zetleyebilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-python\"># Spider kapand\u0131\u011f\u0131nda istatistikleri loglama (signals.py veya spider i\u00e7inde)\nfrom scrapy import signals\nfrom scrapy.crawler import CrawlerProcess\n\n# Spider s\u0131n\u0131f\u0131 i\u00e7inde veya bir Scrapy Extension'da\nclass MySpider(Spider):\n    # ...\n    def closed(self, reason):\n        self.logger.info(f'Spider {self.name} kapat\u0131ld\u0131. Sebep: {reason}')\n        self.logger.info(f'Kaz\u0131nan \u00f6geler: {self.crawler.stats.get_value(\"item_scraped_count\", 0)}')\n        self.logger.info(f'Ba\u015far\u0131s\u0131z istekler: {self.crawler.stats.get_value(\"downloader\/response_status_count\/404\", 0)}')\n<\/pre>\n<p><\/code><\/p>\n<p>Bu t\u00fcr detayl\u0131 loglama, Scrapy projelerinizin uzun vadeli sa\u011fl\u0131\u011f\u0131n\u0131 ve verimlili\u011fini korumak i\u00e7in vazge\u00e7ilmezdir. Log rotasyonu ile disk alan\u0131ndan tasarruf ederken, harici entegrasyonlarla proaktif hata y\u00f6netimi sa\u011flayabilir ve performans izleme ile s\u00fcrekli optimizasyon yapabilirsiniz. Bu yakla\u015f\u0131mlar, \u00f6zellikle geni\u015f \u00f6l\u00e7ekli ve s\u00fcrekli \u00e7al\u0131\u015fan veri kaz\u0131ma altyap\u0131lar\u0131nda projenin istikrar\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<h2>Mobil Uyumlu HTML ve Log G\u00f6rselle\u015ftirme \u0130pu\u00e7lar\u0131<\/h2>\n<p>Log dosyalar\u0131n\u0131 dinamik olarak y\u00f6netmek harika bir ba\u015flang\u0131\u00e7, ancak bu loglar\u0131 etkili bir \u015fekilde okumak ve yorumlamak da \u00f6nemlidir. \u00d6zellikle y\u00f6neticiler veya operasyon ekipleri, loglar\u0131 mobil cihazlar \u00fczerinden h\u0131zl\u0131ca kontrol etmek isteyebilirler. Do\u011frudan ham log dosyalar\u0131n\u0131 mobil cihazlarda okumak genellikle zordur. Bu nedenle, log verilerinin daha eri\u015filebilir ve g\u00f6rsel olarak ho\u015f bir \u015fekilde sunulmas\u0131 i\u00e7in baz\u0131 yakla\u015f\u0131mlar \u00f6nemlidir.<\/p>\n<h3>Log G\u00f6rselle\u015ftirme Ara\u00e7lar\u0131 ve Mobil Uyum<\/h3>\n<p>Scrapy'nin kendisi bir g\u00f6rselle\u015ftirme arac\u0131 sa\u011flamaz, ancak toplanan log verilerini i\u015fleyip web tabanl\u0131 bir aray\u00fcze sunan \u00fc\u00e7\u00fcnc\u00fc taraf ara\u00e7lar veya \u00f6zel geli\u015ftirilmi\u015f panolar kullanabilirsiniz. Bu t\u00fcr bir aray\u00fcz tasarlarken, mobil uyumluluk modern web geli\u015ftirmenin temel ta\u015f\u0131d\u0131r.<\/p>\n<ol>\n<li><strong>Log Y\u00f6netimi Platformlar\u0131:<\/strong> ELK Stack (Elasticsearch, Logstash, Kibana), Grafana, Splunk gibi platformlar, log verilerini merkezi olarak toplar, indeksler ve zengin g\u00f6rselle\u015ftirme panolar\u0131 sunar. Bu panolar genellikle responsive tasar\u0131ma sahiptir, yani mobil cihazlardan da kolayca eri\u015filebilir ve okunabilirler.<\/li>\n<li><strong>\u00d6zel Panolar (Dashboard'lar):<\/strong> E\u011fer kendi log g\u00f6r\u00fcnt\u00fcleyicinizi geli\u015ftiriyorsan\u0131z, HTML ve CSS ile mobil uyumlulu\u011fu sa\u011flamak kritik \u00f6neme sahiptir. Temel prensip, k\u00fc\u00e7\u00fck ekranlarda \u00f6\u011felerin dikey olarak y\u0131\u011f\u0131lmas\u0131 ve okunabilirlik i\u00e7in yaz\u0131 tipi boyutlar\u0131n\u0131n ayarlanmas\u0131d\u0131r.<\/li>\n<\/ol>\n<pre><code class=\"language-html\">\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mobil Uyumlu Log G\u00f6r\u00fcnt\u00fcleyici \u00d6rne\u011fi<\/title>\n    <style>\n        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 0; padding: 20px; background-color: #f4f7f6; color: #333; }\n        .log-container { background-color: #fff; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); margin-bottom: 15px; padding: 15px; border-left: 5px solid; }\n        .log-container.info { border-color: #28a745; }\n        .log-container.warning { border-color: #ffc107; }\n        .log-container.error { border-color: #dc3545; }\n        .log-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; flex-wrap: wrap; }\n        .log-time { font-size: 0.9em; color: #666; flex-basis: 100%; order: 1; margin-bottom: 5px; }\n        .log-level { font-weight: bold; padding: 3px 8px; border-radius: 4px; font-size: 0.8em; margin-right: 10px; order: 2; }\n        .log-level.INFO { background-color: #d4edda; color: #155724; }\n        .log-level.WARNING { background-color: #fff3cd; color: #856404; }\n        .log-level.ERROR { background-color: #f8d7da; color: #721c24; }\n        .log-spider { font-size: 0.9em; color: #555; order: 3; flex-grow: 1; text-align: right; }\n        .log-message { font-family: 'Consolas', 'Monaco', monospace; background-color: #f8f8f8; padding: 10px; border-radius: 5px; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; font-size: 0.85em; }\n\n        \/* Mobil Uyumluluk \u0130\u00e7in Media Query \u00d6rne\u011fi *\/\n        @media (max-width: 768px) {\n            body { padding: 10px; }\n            .log-header { flex-direction: column; align-items: flex-start; }\n            .log-time { order: 1; text-align: left; }\n            .log-level { order: 2; margin-bottom: 5px; }\n            .log-spider { order: 3; text-align: left; font-size: 0.8em; }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"log-container info\">\n        <div class=\"log-header\">\n            <span class=\"log-time\">2023-10-27 10:30:05<\/span>\n            <span class=\"log-level INFO\">INFO<\/span>\n            <span class=\"log-spider\">MySpider<\/span>\n        <\/div>\n        <div class=\"log-message\">URL http:\/\/quotes.toscrape.com\/page\/1\/ ba\u015far\u0131yla i\u015flendi.<\/div>\n    <\/div>\n\n    <div class=\"log-container warning\">\n        <div class=\"log-header\">\n            <span class=\"log-time\">2023-10-27 10:31:10<\/span>\n            <span class=\"log-level WARNING\">WARNING<\/span>\n            <span class=\"log-spider\">BooksSpider<\/span>\n        <\/div>\n        <div class=\"log-message\">Eri\u015filemeyen URL tespit edildi: http:\/\/example.com\/broken-link (404 Not Found)<\/div>\n    <\/div>\n\n    <div class=\"log-container error\">\n        <div class=\"log-header\">\n            <span class=\"log-time\">2023-10-27 10:32:45<\/span>\n            <span class=\"log-level ERROR\">ERROR<\/span>\n            <span class=\"log-spider\">ElectronicsSpider<\/span>\n        <\/div>\n        <div class=\"log-message\">Veritaban\u0131na kay\u0131t s\u0131ras\u0131nda hata olu\u015ftu: Unique constraint violation on product_id.<\/div>\n    <\/div<\n<\/body>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnek HTML ve CSS yap\u0131s\u0131, basit bir log g\u00f6r\u00fcnt\u00fcs\u00fc i\u00e7in mobil uyumlulu\u011fun nas\u0131l sa\u011flanabilece\u011fine dair bir fikir vermektedir. <code>viewport<\/code> meta etiketi, mobil taray\u0131c\u0131lar\u0131n sayfay\u0131 cihaz geni\u015fli\u011fine g\u00f6re \u00f6l\u00e7eklendirmesini sa\u011flar. <code>@media (max-width: 768px)<\/code> kural\u0131 ise, ekran geni\u015fli\u011fi belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde log ba\u015fl\u0131klar\u0131n\u0131n (<code>log-header<\/code>) nas\u0131l dikey olarak s\u0131ralanaca\u011f\u0131n\u0131 g\u00f6sterir. Bu, daha k\u00fc\u00e7\u00fck ekranlarda okunabilirli\u011fi art\u0131r\u0131r.<\/p>\n<div class=\"expert-tip\">\n<p>Uzman \u0130pucu: Log g\u00f6rselle\u015ftirme panolar\u0131n\u0131zda filtreleme, arama ve s\u0131ralama \u00f6zelliklerini mobil uyumlu hale getirin. B\u00fcy\u00fck veri k\u00fcmelerinde bu, mobil cihazlardan bile sorun giderme yetene\u011finizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/p>\n<\/p><\/div>\n<p>Sonu\u00e7 olarak, dinamik loglama ile \u00fcretilen de\u011ferli bilgilerin eri\u015filebilirli\u011fini art\u0131rmak i\u00e7in mobil uyumlu g\u00f6rselle\u015ftirme yakla\u015f\u0131mlar\u0131n\u0131 d\u00fc\u015f\u00fcnmek, Scrapy projelerinizin y\u00f6netimini daha da kolayla\u015ft\u0131racakt\u0131r. Bu, sadece geli\u015ftiriciler i\u00e7in de\u011fil, ayn\u0131 zamanda operasyonel kararlar alan di\u011fer ekip \u00fcyeleri i\u00e7in de kritik \u00f6neme sahiptir.<\/p>\n<h2>Sonu\u00e7: Dinamik Loglama ile Scrapy Projelerinizde Tam Kontrol<\/h2>\n<p>Bu makale boyunca, Scrapy projelerinizde her spider i\u00e7in dinamik olarak ayr\u0131 log dosyalar\u0131 olu\u015fturman\u0131n ve bu loglar\u0131 etkili bir \u015fekilde y\u00f6netmenin neden bu kadar \u00f6nemli oldu\u011funu detayl\u0131 bir \u015fekilde inceledik. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, basit bir <code>logging.FileHandler<\/code> yap\u0131land\u0131rmas\u0131ndan ba\u015flayarak, log rotasyonu, \u00f6zel formatlay\u0131c\u0131lar ve harici hata izleme sistemleriyle entegrasyon gibi ileri d\u00fczey tekniklere kadar geni\u015f bir yelpazede \u00e7\u00f6z\u00fcmler mevcut. Bu yakla\u015f\u0131mlar, Scrapy projeleriniz b\u00fcy\u00fcd\u00fck\u00e7e ortaya \u00e7\u0131kan log karma\u015fas\u0131n\u0131 ortadan kald\u0131r\u0131r ve hata ay\u0131klama, performans izleme ve genel proje y\u00f6netimi s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir.<\/p>\n<p>Dinamik loglama sayesinde, her spider kendi izole \"g\u00fcnl\u00fc\u011f\u00fcn\u00fc\" tutar. Bu, bir sorunla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, hangi spider'\u0131n ne yapt\u0131\u011f\u0131n\u0131, hangi a\u015famada oldu\u011funu ve ne t\u00fcr hatalarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131 h\u0131zl\u0131ca tespit etmenizi sa\u011flar. Bu proaktif yakla\u015f\u0131m, hem geli\u015ftirme s\u00fcresini k\u0131salt\u0131r hem de \u00fcretim ortam\u0131ndaki olas\u0131 kesintileri minimize eder. Ayr\u0131ca, log seviyelerini ve formatlar\u0131n\u0131 \u00f6zelle\u015ftirerek, ihtiyac\u0131n\u0131z olan do\u011fru bilgi yo\u011funlu\u011funu elde edersiniz, bu da log dosyalar\u0131n\u0131z\u0131 gereksiz bilgilerle doldurmaktan ka\u00e7\u0131nman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Unutmay\u0131n ki iyi bir loglama stratejisi, sadece hata ay\u0131klama arac\u0131 olmaktan \u00f6te, projenizin sa\u011fl\u0131\u011f\u0131n\u0131 s\u00fcrekli takip etmenizi sa\u011flayan bir izleme sistemidir. Loglar\u0131 d\u00fczenli olarak g\u00f6zden ge\u00e7irmek, potansiyel sorunlar\u0131 b\u00fcy\u00fcmeden \u00f6nce yakalaman\u0131za, performans darbo\u011fazlar\u0131n\u0131 tespit etmenize ve Scrapy spider'lar\u0131n\u0131z\u0131n web siteleriyle nas\u0131l etkile\u015fime girdi\u011fini anlaman\u0131za yard\u0131mc\u0131 olur. Art\u0131k Scrapy projelerinizde log y\u00f6netimini tamamen kontrol alt\u0131na almak i\u00e7in gerekli bilgi ve ara\u00e7lara sahipsiniz. Ba\u015far\u0131l\u0131 kaz\u0131malar ve sorunsuz projeler dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>1. Neden her spider i\u00e7in ayr\u0131 log dosyas\u0131 kullanmal\u0131y\u0131m?<\/strong><\/dt>\n<dd>Birden fazla spider ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, t\u00fcm loglar\u0131n tek bir dosyada olmas\u0131 karma\u015faya yol a\u00e7ar. Her spider i\u00e7in ayr\u0131 bir log dosyas\u0131, hangi spider'\u0131n hata verdi\u011fini, ne zaman ve hangi ba\u011flamda oldu\u011funu kolayca belirlemenizi sa\u011flar, b\u00f6ylece hata ay\u0131klama ve performans izleme s\u00fcre\u00e7leri b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zlan\u0131r.<\/dd>\n<dt><strong>2. Scrapy'nin varsay\u0131lan loglama davran\u0131\u015f\u0131n\u0131 nas\u0131l de\u011fi\u015ftirebilirim?<\/strong><\/dt>\n<dd><code>settings.py<\/code> dosyan\u0131zda <code>LOG_FILE = None<\/code> ayarlayarak Scrapy'nin t\u00fcm loglar\u0131 tek bir dosyaya yazmas\u0131n\u0131 engelleyebilir ve <code>LOG_LEVEL<\/code> ile global log seviyesini kontrol edebilirsiniz. Ard\u0131ndan, her spider'\u0131n <code>__init__<\/code> metodunda kendi \u00f6zel logger'\u0131n\u0131 ve dosya handler'\u0131n\u0131 yap\u0131land\u0131rman\u0131z gerekir.<\/dd>\n<dt><strong>3. Log dosyalar\u0131m\u0131n boyutunun \u00e7ok b\u00fcy\u00fcmesini nas\u0131l \u00f6nleyebilirim?<\/strong><\/dt>\n<dd>Python'\u0131n <code>logging.handlers.RotatingFileHandler<\/code> veya <code>logging.handlers.TimedRotatingFileHandler<\/code> s\u0131n\u0131flar\u0131n\u0131 kullanabilirsiniz. <code>RotatingFileHandler<\/code>, log dosyas\u0131n\u0131n belirli bir boyuta ula\u015ft\u0131\u011f\u0131nda rotasyon yapmas\u0131n\u0131 sa\u011flarken, <code>TimedRotatingFileHandler<\/code> belirli zaman aral\u0131klar\u0131nda (\u00f6rn. g\u00fcnl\u00fck) rotasyon yapar ve belirli say\u0131da eski log dosyas\u0131n\u0131 saklar.<\/dd>\n<dt><strong>4. Kritik hatalar\u0131 an\u0131nda bildirim olarak nas\u0131l alabilirim?<\/strong><\/dt>\n<dd>Python'\u0131n <code>logging<\/code> mod\u00fcl\u00fcn\u00fc Sentry gibi harici hata izleme platformlar\u0131 (<code>sentry_sdk<\/code> k\u00fct\u00fcphanesi ile) veya e-posta g\u00f6ndermek i\u00e7in <code>logging.handlers.SMTPHandler<\/code> ile entegre edebilirsiniz. Bu sayede, <code>ERROR<\/code> veya <code>CRITICAL<\/code> seviyesindeki log mesajlar\u0131 olu\u015ftu\u011funda an\u0131nda haberdar olursunuz.<\/dd>\n<dt><strong>5. Scrapy'nin root logger'\u0131na mesajlar\u0131n tekrar tekrar g\u00f6nderilmesini nas\u0131l engellerim?<\/strong><\/dt>\n<dd>\u00d6zel logger'\u0131n\u0131z\u0131 olu\u015fturduktan sonra <code>self.logger.propagate = False<\/code> olarak ayarlayarak, bu logger'dan gelen mesajlar\u0131n hiyerar\u015fik olarak Scrapy'nin varsay\u0131lan (root) logger'\u0131na yay\u0131lmas\u0131n\u0131 engelleyebilirsiniz. Bu, loglar\u0131n\u0131z\u0131n tekrar etmesini \u00f6nler ve daha temiz bir \u00e7\u0131kt\u0131 sa\u011flar.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur.&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":[1],"tags":[],"class_list":{"0":"post-35099","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t<\/title>\n<meta name=\"description\" content=\"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider&#039;\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider&#039;\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.\" \/>\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\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t\" \/>\n<meta property=\"og:description\" content=\"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider&#039;\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider&#039;\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-25T12:31:06+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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t\",\"datePublished\":\"2025-11-25T12:31:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\"},\"wordCount\":3960,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\",\"name\":\"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-25T12:31:06+00:00\",\"description\":\"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider'\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider'\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t\"}]},{\"@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":"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t","description":"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider'\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider'\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.","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\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/","og_locale":"tr_TR","og_type":"article","og_title":"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t","og_description":"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider'\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider'\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-25T12:31:06+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t","datePublished":"2025-11-25T12:31:06+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/"},"wordCount":3960,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/","url":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/","name":"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-25T12:31:06+00:00","description":"Scrapy projeleri geli\u015ftik\u00e7e ve kapsamlar\u0131 geni\u015fledik\u00e7e, log y\u00f6netimi genellikle g\u00f6z ard\u0131 edilen ancak kritik \u00f6neme sahip bir konudur. Birden fazla spider'\u0131n ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda, t\u00fcm kay\u0131tlar\u0131n tek bir dosyada toplanmas\u0131 hata ay\u0131klamay\u0131 ve performans izlemeyi ger\u00e7ek bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. Peki, her bir Scrapy spider'\u0131 i\u00e7in dinamik olarak ayr\u0131 bir log dosyas\u0131 olu\u015fturarak bu karma\u015fay\u0131 nas\u0131l ortadan kald\u0131rabiliriz? Bu makale, web kaz\u0131ma projelerinizin daha d\u00fczenli, y\u00f6netilebilir ve hata ay\u0131klamas\u0131 kolay hale gelmesi i\u00e7in ad\u0131m ad\u0131m bir rehber sunuyor. B\u00f6ylece, loglar\u0131n\u0131zla bo\u011fu\u015fmak yerine veri toplamaya odaklanabilirsiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/scrapy-log-dosyalarini-dinamik-yonetme-her-spider-icin-ozel-kayit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Scrapy Log Dosyalar\u0131n\u0131 Dinamik Y\u00f6netme: Her Spider \u0130\u00e7in \u00d6zel Kay\u0131t"}]},{"@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\/35099","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=35099"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35099\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35099"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35099"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}