Tartışma

Python Watchdog Kütüphanesi Kullanımı

Başlatan CyberReis · 09 Tem 2026 11:41 · 16 Görüntülenme · 0 Yanıtlar
Konuyu Açan #0
Python Watchdog Kütüphanesi Kullanımı

Dosya sistemi üzerindeki değişiklikleri gerçek zamanlı olarak izlemek, otomasyon süreçlerinde, geliştirme iş akışlarında veya sunucu yönetimi gibi pek çok senaryoda kritik bir ihtiyaç haline gelebiliyor. Düşünsenize, bir klasöre yeni bir dosya düştüğünde otomatik olarak işlenmesi, bir yapılandırma dosyası değiştiğinde uygulamanın kendini yeniden yüklemesi veya bir log dosyasında belirli bir hata mesajı belirdiğinde anında uyarı verilmesi... Bunlar, manuel olarak takip etmenin hem yorucu hem de hataya açık olduğu durumlar. İşte tam da bu noktada, Python'ın Watchdog kütüphanesi imdadımıza yetişiyor. Peki, nedir bu Watchdog, bize neler sunar ve en önemlisi, onu nasıl etkili bir şekilde kullanabiliriz? Gelin, bu soruların cevaplarını detaylıca inceleyelim.

Giriş: Neden Watchdog?

Dosya sistemi olaylarını izlemek, ilk bakışta basit gibi görünebilir. Belirli aralıklarla bir dizini tarayıp, son değişiklik zamanlarını karşılaştırarak yeni veya değişen dosyaları bulmak mümkün, değil mi? Evet, mümkün... Ama bu yaklaşımın ciddi dezavantajları var. Birincisi, sürekli tarama yapmak, özellikle büyük dizinlerde ve sık aralıklarla yapıldığında ciddi bir sistem kaynağı tüketimine yol açar. İkincisi, olaylar anlık olarak değil, tarama aralıklarına bağlı olarak gecikmeli tespit edilir. Bu, gerçek zamanlı tepki gerektiren uygulamalar için kabul edilemez bir durum olabilir. Üçüncüsü, dosyanın silinmesi veya taşınması gibi olayları sadece tarayarak tespit etmek çok daha karmaşıktır.

İşte Watchdog, bu sorunları çözmek için geliyor. İşletim sisteminin yerel dosya sistemi izleme API'larını (Linux'ta inotify, macOS'ta FSEvents, Windows'ta ReadDirectoryChangesW) kullanarak, değişiklikleri anında ve verimli bir şekilde algılayabilen bir arayüz sunuyor. Bu sayede, gereksiz kaynak tüketiminden kaçınıyor, olaylara neredeyse milisaniyeler içinde tepki verebiliyor ve dosya oluşturma, silme, değiştirme, taşıma gibi tüm temel olay türlerini güvenilir bir şekilde yakalayabiliyoruz. Sanki dosya sisteminin kendisi bize "Hey, burada bir şeyler oldu!" diye fısıldıyor gibi düşünebilirsiniz... Gerçekten de çok pratik, değil mi?

Kurulum ve Temel Bileşenler

Watchdog'u kullanmaya başlamak oldukça basit. Herhangi bir Python paketi gibi,
CODE
1pip
ile kolayca kurabilirsiniz:

CODE
12
pip install watchdog


Kurulum tamamlandıktan sonra, Watchdog'un temel çalışma prensibini anlamak gerekiyor. Bu kütüphane iki ana bileşen üzerine kuruludur:

  • Observer (Gözlemci): Bu, bir veya daha fazla dizini izlemekten sorumlu olan ana bileşendir. İşletim sisteminin olay mekanizmalarına abone olur ve bir değişiklik olduğunda bunu yakalar. Gözlemci, ayrı bir iş parçacığında (thread) çalışır ve arka planda izleme işlemini yürütür.
  • FileSystemEventHandler (Dosya Sistemi Olay İşleyici): Bu, dosya sistemi üzerinde meydana gelen belirli olaylara (oluşturma, silme, değiştirme, taşıma) nasıl tepki vereceğimizi tanımladığımız sınıftır. Kendi özel olay işleyicimizi yazmak için bu sınıftan türetme yaparız.

Yani, bir gözlemci oluşturup ona hangi dizinleri izleyeceğini söylüyoruz, ardından da bir olay işleyici tanımlayıp "şu dizinde şu olay olduğunda şunu yap" diyoruz. Mantık gayet açık, değil mi?

Basit Bir İzleme Senaryosu: Yeni Dosyaları İşleme

Şimdi gelin, basit bir senaryo üzerinden Watchdog'un nasıl kullanıldığını adım adım görelim. Diyelim ki belirli bir "gelen_dosyalar" klasörüne yeni bir TXT dosyası düştüğünde bunu algılayıp ekrana bir mesaj yazdıran bir program istiyoruz.

İlk olarak, bir olay işleyici sınıfı tanımlamamız gerekiyor:

CODE
123456789101112131415161718192021222324252627282930313233
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        # Sadece dosya oluşturma olaylarını dinliyoruz
        if not event.is_directory:
            print(f"Yeni dosya oluşturuldu: {event.src_path}")
            # Burada dosya işleme mantığınızı ekleyebilirsiniz,
            # örneğin dosyayı okumak, başka bir yere taşımak vb.

[b]İzlemek istediğimiz dizin[/b]
[b]Bu dizini projenizin olduğu yerde oluşturmanız gerekebilir.[/b]
[b]Örneğin, 'mkdir gelen_dosyalar' komutuyla.[/b]
WATCH_DIRECTORY = "gelen_dosyalar"

if [b]name[/b] == "[b]main[/b]":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, WATCH_DIRECTORY, recursive=True) # recursive=True alt dizinleri de izler
    observer.start()

    print(f"'{WATCH_DIRECTORY}' dizini izleniyor. Çıkmak için Ctrl+C'ye basın.")

    try:
        while True:
            time.sleep(1) # Ana thread'i meşgul tutuyoruz
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
    print("İzleme durduruldu.")


Bu kod parçasını kaydettikten sonra, programı çalıştırın ve gelen_dosyalar dizinine yeni bir metin dosyası (örneğin, test.txt) oluşturmaya veya kopyalamaya çalışın. Ne oluyor dersiniz? Konsolunuzda anında "Yeni dosya oluşturuldu: gelen_dosyalar/test.txt" benzeri bir çıktı göreceksiniz. Harika değil mi?

Burada dikkat etmemiz gereken birkaç nokta var:

  • MyHandler sınıfı: FileSystemEventHandler sınıfından miras alıyor. Bu sayede, bu sınıfın on_created, on_deleted, on_modified, on_moved gibi metotlarını geçersiz kılabiliriz. Biz sadece on_created metodunu implemente ettik çünkü senaryomuzda yeni dosya oluşturulmasını yakalamak istiyorduk.
  • event nesnesi: Bu metotlara parametre olarak gelen event nesnesi, olayın türü, kaynak yolu (src_path), hedef yolu (dest_path, taşıma olayları için) ve olayın bir dizin mi yoksa dosya mı olduğunu belirten is_directory gibi faydalı bilgiler içerir.
  • observer.schedule(): Bu metod, hangi olay işleyicinin hangi dizini izleyeceğini ve bu izlemenin özyinelemeli (recursive) olup olmayacağını belirtir. recursive=True demek, ana dizinle birlikte tüm alt dizinlerdeki değişiklikleri de izle demektir.
  • observer.start(): Gözlemciyi ayrı bir iş parçacığında başlatır. Artık izleme işlemi arka planda çalışıyor.
  • observer.join() ve time.sleep(1): Gözlemci ayrı bir thread'de çalıştığı için, ana programın hemen bitmesini engellemek adına bir döngü içinde time.sleep(1) ile bekletiyoruz. observer.join() ise gözlemci thread'inin bitmesini bekler. Ctrl+C ile programı sonlandırdığımızda KeyboardInterrupt yakalanır, gözlemci durdurulur ve kaynaklar serbest bırakılır.

Olay Yakalama ve Özelleştirme: FileSystemEventHandler Detayları

Watchdog'un gücü, farklı dosya sistemi olaylarına özelleştirilmiş tepkiler verebilmemizde yatıyor. FileSystemEventHandler sınıfının sunduğu ana metotları daha yakından inceleyelim ve her biri için kısa örnekler verelim:

  • on_created(self, event): Yeni bir dosya veya dizin oluşturulduğunda tetiklenir.
    CODE
    123456
        def on_created(self, event):
            if event.is_directory:
                print(f"Yeni DİZİN oluşturuldu: {event.src_path}")
            else:
                print(f"Yeni DOSYA oluşturuldu: {event.src_path}")
        

  • on_deleted(self, event): Bir dosya veya dizin silindiğinde tetiklenir.
    CODE
    123456
        def on_deleted(self, event):
            if event.is_directory:
                print(f"DİZİN silindi: {event.src_path}")
            else:
                print(f"DOSYA silindi: {event.src_path}")
        

  • on_modified(self, event): Bir dosya veya dizinin içeriği ya da meta verileri değiştiğinde tetiklenir. Bu olay, dosyanın üzerine yazıldığında veya boyutu değiştiğinde sıkça tetiklenir.
    CODE
    12345
        def on_modified(self, event):
            if not event.is_directory: # Dizin değişiklikleri genellikle daha az ilgilendirir
                print(f"DOSYA değiştirildi: {event.src_path}")
                # Dosyanın içeriğini kontrol etmek veya bir işlem tetiklemek için ideal.
        

  • on_moved(self, event): Bir dosya veya dizin başka bir konuma taşındığında veya yeniden adlandırıldığında tetiklenir. Bu olay, kaynak ve hedef yollarını içerir.
    CODE
    123456
        def on_moved(self, event):
            if event.is_directory:
                print(f"DİZİN taşındı/yeniden adlandırıldı: {event.src_path} -> {event.dest_path}")
            else:
                print(f"DOSYA taşındı/yeniden adlandırıldı: {event.src_path} -> {event.dest_path}")
        

  • on_any_event(self, event): Yukarıdaki olaylardan herhangi biri tetiklendiğinde çağrılır. Eğer tüm olay türleri için ortak bir işlem yapmak istiyorsanız bu metodu kullanabilirsiniz. Ancak genellikle daha spesifik metotları kullanmak daha iyidir.
    CODE
    1234
        def on_any_event(self, event):
            # Herhangi bir olay olduğunda çalışır
            print(f"Bir olay meydana geldi: {event.event_type} - {event.src_path}")
        

Kendi
CODE
1MyHandler
sınıfınızı yazarken, ihtiyacınız olan metotları override ederek spesifik davranışlar tanımlayabilirsiniz. Örneğin, sadece .txt uzantılı dosyaların oluşturulmasını dinlemek istiyorsanız, on_created metodu içinde bir kontrol ekleyebilirsiniz:

CODE
123456789
import os
[b]... (Diğer import'lar)[/b]

class MyFilteredHandler(FileSystemEventHandler):
    def on_created(self, event):
        if not event.is_directory and event.src_path.endswith(".txt"):
            print(f"Yeni TXT dosyası oluşturuldu: {event.src_path}")
            # TXT dosyasına özel işlemler...


Bu esneklik, Watchdog'u gerçekten güçlü kılıyor.

Gelişmiş İzleme Teknikleri

Watchdog'un sunduğu temel özellikler haricinde, daha karmaşık senaryolar için kullanabileceğiniz bazı gelişmiş teknikler de var.

  • Özyinelemeli İzleme (Recursive Monitoring):
    Yukarıdaki örnekte de gördüğünüz gibi,
    CODE
    1observer.schedule()
    metoduna
    CODE
    1recursive=True
    parametresini vererek, ana dizinle birlikte tüm alt dizinlerdeki değişiklikleri de izleyebilirsiniz. Bu, özellikle proje dizinleri, web sunucusu kök dizinleri veya büyük veri depoları gibi hiyerarşik yapıları izlerken çok işe yarar. Aksi takdirde, sadece belirttiğiniz ana dizindeki olayları yakalarsınız.

  • Olay Filtreleme (Pattern Matching):
    Sadece belirli dosya desenlerine uyan olayları dinlemek istediğinizde,
    CODE
    1PatternMatchingEventHandler
    sınıfını kullanabilirsiniz. Bu, FileSystemEventHandler'a göre daha gelişmiş bir olay işleyici türüdür ve belirli desenlere göre olayları filtrelemenizi sağlar.

    CODE
    1234567891011121314151617181920
        from watchdog.events import PatternMatchingEventHandler
    
        class MyPatternHandler(PatternMatchingEventHandler):
            def [b]init[/b](self, patterns=None, ignore_patterns=None,
                         ignore_directories=False, case_sensitive=False):
                super().[b]init[/b](patterns, ignore_patterns, ignore_directories, case_sensitive)
    
            def on_created(self, event):
                print(f"Desenle eşleşen dosya oluşturuldu: {event.src_path}")
    
        # Sadece .log veya .txt uzantılı dosyaları dinle
        patterns = ["[i].log", "[/i].txt"]
        ignore_patterns = ["*.temp"] # .temp uzantılı dosyaları yok say
        ignore_directories = True # Dizin olaylarını yok say
    
        event_handler = MyPatternHandler(patterns=patterns,
                                         ignore_patterns=ignore_patterns,
                                         ignore_directories=ignore_directories)
        observer.schedule(event_handler, WATCH_DIRECTORY, recursive=True)
        

    Burada patterns listesi, izlemek istediğiniz dosya desenlerini içerir. ignore_patterns ise göz ardı edilecek desenleri belirtir. ignore_directories parametresi, dizin oluşturma/silme/değiştirme olaylarını filtrelemek için kullanılır. Bu sayede, çok daha temiz ve odaklanmış bir izleme yapabilirsiniz.

  • Performans ve Kaynak Yönetimi:
    Çok büyük dizinleri veya çok sık değişen dosya sistemlerini izlerken performans sorunları yaşanabilir. Watchdog, işletim sisteminin yerel API'larını kullandığı için genellikle oldukça verimlidir. Ancak yine de dikkatli olmakta fayda var:
    • Gereksiz özyinelemeli izlemeden kaçının: Sadece ihtiyacınız olan dizinleri özyinelemeli olarak izleyin. Tüm kök dizini izlemek yerine, spesifik alt dizinleri hedefleyin.
    • Olay filtrelemesi kullanın: PatternMatchingEventHandler ile sadece ilgilendiğiniz dosya türlerini izleyerek olay yükünü azaltabilirsiniz.
    • Olay işleyicide uzun süren işlemler yapmayın: on_created gibi metotların içinde uzun süren (örneğin, büyük bir dosyayı okuma, ağ isteği yapma) işlemler yapmaktan kaçının. Bu, diğer olayların işlenmesini geciktirebilir. Uzun süren işlemleri ayrı bir iş parçacığına veya bir kuyruğa (queue) devretmek daha iyi bir yaklaşımdır.

Pratik Kullanım Alanları ve Senaryolar

Watchdog'u nerelerde kullanabiliriz? Hayal gücünüzle sınırlı, ama işte size birkaç popüler senaryo:

  • Otomatik Derleme ve Yeniden Yükleme: Web geliştirme yaparken, özellikle statik site üreteçleri (static site generators) veya frontend projelerinde kaynak kodunuzda bir değişiklik olduğunda otomatik olarak derleme yapmak veya geliştirme sunucusunu yeniden başlatmak isteyebilirsiniz. Watchdog, dosya değişikliklerini algılayıp bu işlemleri tetiklemek için mükemmeldir.
  • Otomatik Yedekleme ve Senkronizasyon: Belirli bir klasördeki dosyaların değiştirildiğini veya yeni dosyaların eklendiğini algılayarak otomatik olarak buluta yedekleme yapabilir veya başka bir dizinle senkronize edebilirsiniz. Bu, veri kaybını önlemek için proaktif bir yaklaşımdır.
  • Log Dosyası İzleme ve Gerçek Zamanlı Analiz: Sunucu log dosyalarını izleyerek belirli hata mesajlarını veya desenleri anında yakalayabilir ve bir uyarı sistemi tetikleyebilirsiniz. Bu, sistem sorunlarına hızlıca müdahale etmenizi sağlar.
  • Dosya İşleme Kuyrukları: Bir klasöre düşen her yeni dosyanın (örneğin, resimler, videolar) otomatik olarak bir işleme kuyruğuna eklenmesini ve arka planda işlenmesini sağlayabilirsiniz. Bu, özellikle büyük hacimli veri işleme sistemlerinde çok kullanışlıdır.
  • İçerik Yönetim Sistemleri: Bir içerik yönetim sisteminde (CMS) yeni bir medya dosyası yüklendiğinde veya mevcut bir dosya güncellendiğinde, Watchdog bu olayı yakalayıp veritabanını güncelleyebilir, önbelleği temizleyebilir veya thumbnail (küçük resim) oluşturma gibi işlemleri tetikleyebilir.

Gördüğünüz gibi, Watchdog'un uygulama alanı oldukça geniş. Neredeyse dosya sistemiyle etkileşime giren her türlü otomasyon ihtiyacınızda size yardımcı olabilir.

Dikkat Edilmesi Gerekenler ve İpuçları

Watchdog kullanırken aklınızda bulundurmanız gereken birkaç önemli nokta var:

  • İşletim Sistemi Farklılıkları: Watchdog, arkada her işletim sisteminin kendi izleme mekanizmalarını kullanır. Bu genellikle sorun yaratmaz ancak nadiren de olsa farklı işletim sistemlerinde olay tetikleme davranışlarında ufak tefek nüanslar olabilir. Örneğin, bazı sistemlerde bir dosyanın kaydedilmesi birden fazla on_modified olayı tetikleyebilir. Bu tür durumlarda, olayları bir süre bekletip (debouncing veya throttling) öyle işlemeye yönelik kendi mantığınızı eklemeniz gerekebilir. Watchdog'un kendisinde doğrudan bir debouncing mekanizması olmasa da, bunu harici bir zamanlayıcı veya kuyruk sistemiyle kolayca implemente edebilirsiniz.
  • Thread Güvenliği: Watchdog'un Observer'ı ayrı bir thread'de çalıştığı için, olay işleyicilerinizde paylaşılan verilere erişirken thread güvenliğine dikkat etmelisiniz. Genellikle, Lock veya Queue gibi mekanizmaları kullanarak veri tutarlılığını sağlamanız gerekebilir.
  • Hata Yönetimi: Olay işleyicilerinizin içinde meydana gelebilecek hataları yakalamak önemlidir. Bir hata, gözlemcinin tamamen durmasına neden olabilir. Bu nedenle, try-except bloklarını kullanarak olası sorunları ele almalısınız.
  • Kaynak Tüketimi: Özellikle yüz binlerce dosyanın bulunduğu çok büyük dizinleri özyinelemeli olarak izlemek, hem bellekte hem de CPU'da bir miktar yük oluşturabilir. İzleme kapsamınızı mümkün olduğunca dar tutmak ve sadece gerçekten ihtiyacınız olan dizinleri hedeflemek en iyisidir.
  • Süreç Sonlandırma: Programınızı düzgün bir şekilde sonlandırmak için observer.stop() ve observer.join() metotlarını kullanmayı unutmayın. Aksi takdirde, arka planda çalışan gözlemci thread'i kaynakları boş yere meşgul edebilir.

Sonuç ve Sizin Deneyimleriniz

Python Watchdog kütüphanesi, dosya sistemi değişikliklerini izleme konusunda sunduğu basit ama güçlü API'lar sayesinde, otomasyon projelerimizde bize inanılmaz bir esneklik ve verimlilik sağlıyor. İster basit bir dosya oluşturma olayını yakalayın, ister karmaşık bir dizin yapısındaki yüzlerce olayı filtreleyerek işleyin, Watchdog bu tür görevler için sağlam bir temel sunuyor.

Peki, siz Watchdog'u projelerinizde nerelerde kullandınız? Karşılaştığınız ilginç senaryolar, belki de çözmekte zorlandığınız ama üstesinden geldiğiniz durumlar oldu mu? Hangi özelliklerini daha çok sevdiniz veya hangi konularda geliştirilmesi gerektiğini düşünüyorsunuz? Deneyimlerinizi ve görüşlerinizi merak ediyorum, gelin bu konuda biraz sohbet edelim...

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi