logrotate
Bir dizinde ve tüm alt dizinlerinde logfiles düşünmek mümkün mü ? (yani, alt dizinleri açıkça listelemeden.)
logrotate
Bir dizinde ve tüm alt dizinlerinde logfiles düşünmek mümkün mü ? (yani, alt dizinleri açıkça listelemeden.)
Yanıtlar:
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/*/*/*.log
gerekiyorsa, 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.
-f
seç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ı.
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
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).
globstar
logrotate çalıştırmadan önce etkinleştirmelisiniz . Bu bash için sağlayacaktır shopt -s globstar
.
-d
Aslında kuru çalışma modunda (yani aslında hiçbir şey değiştirmez) logrotate koyar gibi görünüyor .