dosyaları bir dizin ve alt dizinlerinde logrotating


Yanıtlar:


87

Alt dizinleriniz ne kadar derine gidiyor?

/var/log/basedir/*.log /var/log/basedir/*/*.log {
    daily
    rotate 5
}

Tüm dönecektir .log basedir dosyaları / yanı sıra tüm .log basedir herhangi doğrudan çocukta dosyaları. Ayrıca 1 seviye daha derine inmeniz /var/log/basedir/*/*/*.loggerekiyorsa, her bir seviye kaplanana kadar bir tane daha ekleyin .

Bu, karşılanamayacak bir kısıtlama içeren (yüksek bir minimum boyut) ayrı bir logrotate yapılandırma dosyası kullanılarak test edilebilir ve daha sonra günlük çalıştırma, ayrıntılı modda kendinizi döndürün

logrotate -d testconfig.conf

-d bayrağı, döndürmeyi düşündüğü her bir günlük dosyasını listeler.


6
Teşekkürler! -dAslında kuru çalışma modunda (yani aslında hiçbir şey değiştirmez) logrotate koyar gibi görünüyor .
ithinkihaveacat

1
Gerçekten doğrudan alakalı değil ama muhtemelen biri için yararlı. -fseçenek "kuvvet vadede" için logrotate söyler. Komutun sonundaki çıplak sözcük, varsayılan yerine kullanılacak bir yapılandırma dosyasıdır. yani logrotate -f /some/config, bu yapılandırma dosyasıyla çalıştırma ve yapılandırma dosyası henüz çalıştırma zamanı gelmediğini söylese bile daima çalıştırma anlamına gelir. Eğitimsiz gözlerime ve bununla bir cron işi yapan selefime -f, sadece config dosyasını belirtiyor gibiydi . Oldukça kafa karıştırıcı.
Dan Pritts,

4

Benim durumumda, alt dizinlerin derinliği herhangi bir uyarı olmadan değişebilir, bu yüzden tüm alt dizinleri bulmak ve her dizin için bir config girişi oluşturmak için bir bash betiği kurdum.

Dönüşten sonra alt dizinlerin yapısını korumam da benim için önemlidir; ki bu joker karakterler (yani @ DanR'in cevabı) sanki görünmüyordu. Günlük günlük döndürme işlemi yapıyorsanız, bu komut dosyasını günlük bir cron işine koyabilirsiniz.

basedir=/var/log/basedir/
#destdir=${basedir} # if you want rotated files in the same directories
destdir=/var/log/archivedir/ #if you want rotated files somewhere else
config_file=/wherever/you/keep/it
> ${config_file} #clear existing config_file contents

subfolders = $(find ${basedir} -type d)

for ii in ${subfolders}
do
    jj=${ii:${#basedir}} #strip off basedir, jj is the relative path

    #append new entry to config_file
    echo "${basedir}${jj}/* {
        olddir ${destdir}${jj}/
        daily
        rotate 5
    }" >> ${config_file}

    #add one line as spacing between entries
    echo "\n" >> ${config_file}

    #create destination folder, if it doesn't exist
    [ -d ${destdir}${jj} ] || mkdir ${destdir}${jj}
done

@DanR'nin önerdiği gibi, ile test edin logrotate -d


1

Eski iş parçacığı, ancak aşağıdakileri yapabilirsiniz:

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

Bu iki yıldız sıfır veya daha fazla dizinle eşleşecek. Ancak, döndürülecek günlük dosyalarını nasıl tanımladığınıza dikkat edin, çünkü önceden döndürülmüş dosyaları döndürebilirsiniz. Burada logrotate kullanım kılavuzundan alıntı yapacağım.

Lütfen jokerleri dikkatli kullanın. * Belirtirseniz, logrotate daha önce döndürülmüş olanlar dahil tüm dosyaları döndürür. Bunun bir yolu olddir yönergesini veya daha kesin bir joker karakter kullanmaktır (* .log gibi).


3
bu joker desen benim için işe yaramadı. RHEL 7.3'deki 3.8.6 logrotat
northben

Belki globstarlogrotate çalıştırmadan önce etkinleştirmelisiniz . Bu bash için sağlayacaktır shopt -s globstar.
bat_ventzi

Bende de aynı problem var. Ubuntu 16.04.3'te 3.8.7 logrotate. /var/log/basedir/**/*.log tanımlandığı gibi çalışır, ancak logrotate çalışmaz.
frogstarr78 23

benim için de çalışmıyor, logrotate 3.11.0. Bash genişlemesinin logrotate joker karakterlerle bir ilgisi olduğunu sanmıyorum. (benzer sözdizimi hariç)
Thayne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.