Mario

WFN Üye
Konular
574
Mesajlar
574
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Zonguldak
Web Sitesi
Var
Alanı
Google Optimiz.
1/1
Konu sahibi
Eski log dosyalarını otomatik silmek için dosyaların son değiştirilme zamanını pathlib ile kontrol edip belirlediğiniz günden daha eski olanları silen bir Python betiği kullanabilirsiniz. Güvenli uygulama için önce yalnızca hangi dosyaların silineceğini listeleyin, sonuç doğruysa silme işlemini etkinleştirin ve betiği işletim sisteminin zamanlayıcısıyla düzenli çalıştırın. Böylece klasördeki güncel loglar korunurken belirlenen yaştan eski dosyalar otomatik temizlenir.

Klasördeki eski log dosyalarını silen Python betiği​


Aşağıdaki örnek, /var/log/uygulamam klasöründeki .log uzantılı dosyaları inceler ve son değiştirilme zamanı 30 günden eski olanları siler. Bu yol Linux için varsayımsaldır; Windows kullanıyorsanız LOG_DIZINI değerini örneğin C:\\Uygulama\\logs olarak değiştirin.

Python:
from pathlib import Path
from datetime import datetime, timedelta

# Temizlenecek log klasörü
LOG_DIZINI = Path("/var/log/uygulamam")

# Bu yaştan eski log dosyaları silinecek
SAKLAMA_GUNU = 30

# İlk çalıştırmada True bırakın: yalnızca silinecek dosyaları listeler.
DENEME_MODU = True

esik_tarihi = datetime.now() - timedelta(days=SAKLAMA_GUNU)

if not LOG_DIZINI.is_dir():
    raise SystemExit(f"Log klasörü bulunamadı: {LOG_DIZINI}")

for dosya in LOG_DIZINI.glob("*.log"):
    if not dosya.is_file():
        continue

    degistirilme_tarihi = datetime.fromtimestamp(dosya.stat().st_mtime)

    if degistirilme_tarihi < esik_tarihi:
        if DENEME_MODU:
            print(f"Silinecek: {dosya} | Son değişiklik: {degistirilme_tarihi}")
        else:
            try:
                dosya.unlink()
                print(f"Silindi: {dosya}")
            except OSError as hata:
                print(f"Silinemedi: {dosya} | Hata: {hata}")

Bu betikte SAKLAMA_GUNU = 30 değeri, log dosyasının son değiştirilme tarihinden itibaren en az 30 gün geçmiş olması gerektiğini belirtir. Dosyanın oluşturulma tarihine değil, işletim sisteminin tuttuğu son değiştirilme zamanına bakılır. Log dosyası eski oluşturulmuş olsa bile yakın zamanda değiştirilmişse bu koşula göre silinmez.

Betiği önce silmeden çalıştırın​


Kodda DENEME_MODU = True olduğu sürece dosyalar silinmez; yalnızca koşulu sağlayan dosyaların yolları ekrana yazdırılır. Bu çıktıyı inceleyerek klasör yolunun ve dosya deseninin doğru olduğunu kontrol edin. Hiç dosya listelenmemesi, klasörde 30 günden eski .log dosyası olmadığı anlamına gelebilir; tek başına betiğin bozuk olduğunu göstermez.

Liste beklediğinizden fazla dosya içeriyorsa LOG_DIZINI değerini, SAKLAMA_GUNU sayısını ve *.log desenini kontrol edin. Örneğin .log.gz dosyalarını da temizlemek istiyorsanız bu desen onları kapsamaz; ayrıca *.log.gz için ayrı bir tarama eklemeniz gerekir. Yanlış klasörde çalışmamak için deneme sırasında mümkünse üretim klasörünün bir kopyasını kullanın.

Sonuç doğruysa DENEME_MODU = False yapın ve betiği yeniden çalıştırın. Çıktıda Silindi: satırlarını görmeniz, dosyanın Python tarafından kaldırıldığı anlamına gelir. Silinemedi: satırı ise dosyanın yaş koşulunu karşıladığını ancak izin, dosyanın başka bir işlem tarafından kullanılması veya dosya sistemi hatası gibi bir nedenle silinemediğini gösterir. Bu durumda hata metnini saklayın; Linux'ta betiği çalıştıran kullanıcının klasör ve dosya izinlerini, Windows'ta ise dosyaya erişim izinlerini ve dosyanın başka bir program tarafından kilitlenip kilitlenmediğini kontrol edin.

Alt klasörlerdeki log dosyalarını da temizleme​


Loglar ana klasörün altındaki servis veya tarih klasörlerine ayrılmışsa glob("*.log") yalnızca doğrudan ana klasördeki dosyaları bulur. Alt klasörleri de taramak için rglob("*.log") kullanın:

Python:
for dosya in LOG_DIZINI.rglob("*.log"):
    if not dosya.is_file():
        continue

    degistirilme_tarihi = datetime.fromtimestamp(dosya.stat().st_mtime)

    if degistirilme_tarihi < esik_tarihi:
        if DENEME_MODU:
            print(f"Silinecek: {dosya}")
        else:
            try:
                dosya.unlink()
                print(f"Silindi: {dosya}")
            except OSError as hata:
                print(f"Silinemedi: {dosya} | Hata: {hata}")

rglob alt klasörleri de dolaştığı için daha geniş bir alanı etkiler. Bu nedenle ana klasörün yanlış seçilmesi durumunda daha fazla dosyanın silinme riski vardır. Alt klasör taramasını yalnızca deneme çıktısını inceleyip hangi dizinlerin kapsama girdiğini doğruladıktan sonra kullanın.

Dosya uzantısı ve saklama kuralını seçme​


Silme ölçütü dosyanın adına ve yaşına bağlıdır. Uygulamanız logları döndürerek .log, .log.1 veya .log.gz gibi farklı adlarla saklıyorsa yalnızca *.log kullanmak beklediğiniz dosyaları kapsam dışı bırakabilir. Buna karşılık bütün dosyaları * deseniyle silmek tehlikelidir; aynı klasördeki yapılandırma veya kilit dosyaları da eşleşebilir.

GereksinimUygulanacak desen veya kuralDikkat edilmesi gereken nokta
Yalnızca normal log dosyaları*.logDöndürülmüş veya sıkıştırılmış loglar kapsanmayabilir.
Sıkıştırılmış eski loglar*.log.gzSıkıştırılmış dosyaların ayrıca deneme çıktısıyla doğrulanması gerekir.
Alt klasörler dâhil loglarrglob("*.log")Yanlış ana klasör seçimi daha geniş silmeye yol açar.
Belirli yaşın üzerindeki dosyalarst_mtime < esik_tarihiÖlçüt oluşturulma zamanı değil, son değiştirilme zamanıdır.

Birden fazla uzantıyı temizlemeniz gerekiyorsa her desen için ayrı döngü kurabilir veya önce eşleşen dosyaları güvenli biçimde bir kümede toplayabilirsiniz. Farklı türdeki dosyaları aynı kuralla silmeden önce her desenin deneme modundaki çıktısını ayrı ayrı inceleyin.

Otomatik çalıştırma seçenekleri​


Betiği elle çalıştırmak yerine işletim sisteminin zamanlayıcısına ekleyebilirsiniz. Linux ve macOS'ta bunun yaygın yolu cron, Windows'ta ise Görev Zamanlayıcı'dır. Zamanlayıcıya eklemeden önce betiği tam dosya yolu ile elle çalıştırın; çünkü zamanlayıcılar farklı bir çalışma dizini, kullanıcı veya ortam değişkenleriyle çalışabilir.

Linux'ta örneğin betiği /opt/scripts/log_temizle.py konumuna kaydedip şu komutla doğrudan çalıştırabilirsiniz:

Bash:
/usr/bin/python3 /opt/scripts/log_temizle.py

Komut beklediğiniz dosyaları listeliyor veya siliyorsa cron girdisine geçebilirsiniz. Her gece 03.15'te çalışacak örnek giriş şöyledir:

Kod:
15 3 * * * /usr/bin/python3 /opt/scripts/log_temizle.py >> /var/log/log_temizle.log 2>&1

Bu satırın çalışması, betiğin bulunduğu klasöre ve temizlenen log klasörüne cron kullanıcısının erişebilmesine bağlıdır. Yetki hatası alırsanız yalnızca komuta gelişigüzel yönetici yetkisi eklemeyin; önce hangi kullanıcının çalıştırdığını ve bu kullanıcının gereken klasörlere erişim iznini kontrol edin. Yönetici yetkisi gerekiyorsa, kapsamı yalnızca bu betiğin ve hedef klasörün izinleriyle sınırlı tutmak daha güvenlidir.

Windows'ta Görev Zamanlayıcı üzerinden Python çalıştırılırken eylem olarak Python yorumlayıcısının tam yolu, bağımsız değişken olarak da betiğin tam yolu verilir. Örneğin Python C:\\Python312\\python.exe, betik ise C:\\Scripts\\log_temizle.py konumundaysa bu iki yol ayrı alanlarda tanımlanır. Görevi önce isteğe bağlı çalıştırarak çıktı ve hata günlüklerini kontrol edin; başarılı çalışması, yalnızca çalıştırma işleminin tamamlandığını gösterir, yanlış klasörde dosya olmadığı anlamına gelmez.

Silme işlemini daha güvenli hâle getirme​


Log temizleme betiğini doğrudan silmek yerine önce karantina klasörüne taşıma yaklaşımı, yanlış eşleşmelerde geri dönüş imkânı sağlar. Bunun için unlink() yerine shutil.move() kullanılabilir; ancak karantina klasörünün aynı disk üzerinde yeterli alanı olmalı ve karantinadaki dosyaların da ayrıca temizlenmesi gerekir.

Üretim ortamında şu kontrolleri özellikle uygulayın:
  • Temizleme klasörünü sabit ve açık bir yol olarak tanımlayın; boş veya kök dizine işaret eden bir değişkenle silme işlemi yapmayın.
  • Dosya adını doğrudan * ile eşleştirmek yerine beklenen uzantıyı kullanın.
  • İlk çalıştırmada deneme modunu açık bırakıp silinecek dosyaları kaydedin.
  • Çalışan uygulamanın hâlen yazdığı aktif log dosyasını yaş koşulu sağlasa bile korumak için dosya adında current, active veya benzeri bir kural varsa ayrıca hariç tutun.
  • Silme ve hata çıktılarını ayrı bir log dosyasına yönlendirin.
  • Betiğin çalıştığı kullanıcıyı ve hedef klasör izinlerini zamanlayıcı ayarlarıyla birlikte kontrol edin.
Bu betik yalnızca dosyaları siler; silinen içeriği geri getirmez, yedek oluşturmaz ve uygulamanın log döndürme politikasını kendiliğinden düzeltmez. Mevcut log yönetimi başka bir araç tarafından yapılıyorsa iki sistemin aynı dosyaları aynı anda işleme ihtimalini dikkate alın. Saklama süresi yasal, operasyonel veya hata inceleme gereksinimleriyle belirleniyorsa SAKLAMA_GUNU değerini yalnızca disk alanına göre seçmeyin.

Sık sorulan sorular​

Dosyanın oluşturulma tarihine göre silme yapabilir miyim?​

Python örneği son değiştirilme zamanını kullanır; bu bilgi log dosyasının en son ne zaman yazıldığını gösterir. Oluşturulma zamanı işletim sistemine ve dosya sistemine göre farklı davranabildiği için genel bir saklama kuralında son değiştirilme zamanını kullanmak daha öngörülebilirdir. Oluşturulma zamanını özellikle kullanmanız gerekiyorsa hedef işletim sisteminin bu zaman bilgisini güvenilir biçimde sağlayıp sağlamadığını ayrıca doğrulamanız gerekir.

Betiği her gün çalıştırmak dosyaları erken siler mi?​

Hayır; eşik tarihi her çalıştırmada o anki zamandan SAKLAMA_GUNU kadar geriye hesaplanır. Günlük çalıştırma, yalnızca eşiği geçen dosyanın o gün silinmesini sağlar. Saat farkları nedeniyle kesin saat duyarlılığı gerekiyorsa saklama kuralını gün yerine saat veya zaman dilimiyle tanımlamanız gerekir.

Bazı eski dosyalar neden silinmiyor?​

Önce dosyanın gerçekten seçtiğiniz desenle eşleştiğini, alt klasördeyse rglob kullanıldığını ve son değiştirilme tarihinin eşik tarihten eski olduğunu kontrol edin. Eşleştiği hâlde silinmiyorsa çıktıdaki Silinemedi hata metnini inceleyin; bu metin izin, kilit veya dosya sistemi sorununu ayırt etmenize yardımcı olur. Zamanlayıcı kullanıyorsanız aynı betiği elle çalıştıran kullanıcıyla zamanlayıcının çalıştırdığı kullanıcı farklı olabilir.

Silinen log dosyaları geri getirilebilir mi?​

unlink() ile silinen dosya için bu betik bir geri alma işlemi sağlamaz. Geri dönüş ihtiyacı varsa önce karantina klasörüne taşıma veya bağımsız yedekleme politikası uygulayın; ancak bu yöntemler de yedekleme alanının ve saklama süresinin ayrıca yönetilmesini gerektirir.
 
Moderatör tarafında düzenlendi:

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic