Apakah mungkin untuk logrotate
mempertimbangkan file log dalam direktori dan semua subdirektori? (Yaitu tanpa secara eksplisit daftar subdirektori.)
Apakah mungkin untuk logrotate
mempertimbangkan file log dalam direktori dan semua subdirektori? (Yaitu tanpa secara eksplisit daftar subdirektori.)
Jawaban:
Seberapa dalam subdirektori Anda pergi?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
Akan memutar semua file .log di berbasisir / serta semua file .log pada anak langsung dari basisir. Jika Anda juga perlu masuk 1 level lebih dalam, tambahkan saja /var/log/basedir/*/*/*.log
sampai Anda memiliki level masing-masing.
Ini dapat diuji dengan menggunakan file config logrotate terpisah yang berisi batasan yang tidak akan terpenuhi (minsize tinggi) dan kemudian menjalankan log, putar diri Anda dalam mode verbose
logrotate -d testconfig.conf
flag -d akan menampilkan setiap file log yang sedang dipertimbangkan untuk diputar.
-f
pilihan memberitahu logrotate untuk "memaksa run". kata kosong di akhir perintah adalah file konfigurasi untuk digunakan, bukan default. jadi logrotate -f /some/config
artinya jalankan dengan file konfigurasi itu, dan selalu jalankan walaupun file konfigurasi mengatakan belum waktunya untuk menjalankannya. Untuk mata saya yang tidak terlatih, dan kepada pendahulu saya yang melakukan pekerjaan cron dengan itu, sepertinya -f
hanya menentukan file konfigurasi. Cukup membingungkan.
Dalam kasus saya, kedalaman subdirektori dapat berubah tanpa peringatan, jadi saya membuat skrip bash untuk menemukan semua subdirektori dan membuat entri konfigurasi untuk setiap direktori.
Ini juga penting bagi saya untuk menjaga struktur subdirektori setelah rotasi, yang wildcard (yaitu jawaban @ DanR) tampaknya tidak dilakukan. Jika Anda melakukan rotasi log harian, Anda bisa meletakkan skrip ini di cron-job harian.
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
Seperti yang disarankan @DanR, tes dengan logrotate -d
Ini utas lama, tetapi Anda dapat melakukan hal berikut:
/var/log/basedir/**/*.log {
daily
rotate 5
}
Dua bintang ini akan cocok dengan nol atau lebih direktori. Anda harus berhati-hati, bagaimana Anda mendefinisikan file log yang akan diputar, karena Anda dapat memutar file yang sudah diputar. Saya akan mengutip manual logrotate di sini.
Silakan gunakan wildcard dengan hati-hati. Jika Anda menentukan *, logrotate akan merotasi semua file, termasuk yang diputar sebelumnya. Cara untuk mengatasi ini adalah dengan menggunakan direktif olddir atau wildcard yang lebih tepat (seperti * .log).
globstar
sebelum menjalankan logrotate. Ini akan memungkinkannya untuk bash shopt -s globstar
.
-d
menempatkan logrotate dalam mode menjalankan kering (yaitu tidak benar-benar mengubah apa pun) sebenarnya.