file logrotating dalam direktori dan subdirektori

62

Apakah mungkin untuk logrotatemempertimbangkan file log dalam direktori dan semua subdirektori? (Yaitu tanpa secara eksplisit daftar subdirektori.)

ithinkihaveacat
sumber

Jawaban:

87

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/*/*/*.logsampai 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.

Dan R
sumber
6
Terima kasih! Sepertinya -dmenempatkan logrotate dalam mode menjalankan kering (yaitu tidak benar-benar mengubah apa pun) sebenarnya.
ithinkihaveacat
1
Tidak benar-benar relevan secara langsung tetapi mungkin bermanfaat bagi seseorang. yang -fpilihan memberitahu logrotate untuk "memaksa run". kata kosong di akhir perintah adalah file konfigurasi untuk digunakan, bukan default. jadi logrotate -f /some/configartinya 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 -fhanya menentukan file konfigurasi. Cukup membingungkan.
Dan Pritts
4

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

craq
sumber
1

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).

bat_ventzi
sumber
3
pola wildcard ini tidak berhasil untuk saya. Logrotate 3.8.6 pada RHEL 7.3
northben
Mungkin Anda harus mengaktifkan globstarsebelum menjalankan logrotate. Ini akan memungkinkannya untuk bash shopt -s globstar.
bat_ventzi
Saya memiliki masalah yang sama. Logrotate 3.8.7 di Ubuntu 16.04.3. ls /var/log/basedir/**/*.log berfungsi seperti yang dijelaskan, tetapi logrotate tidak.
frogstarr78
tidak bekerja untuk saya juga, pada logrotate 3.11.0. Saya tidak berpikir bahwa ekspansi bash ada hubungannya dengan wildcard logrotate. (Kecuali untuk sintaks yang sama)
Thayne