Rotasi log bebas-ruang yang didorong pada linux?

8

Seseorang hanya bertanya kepada saya 'berapa lama kita harus menyimpan log untuk aplikasi kita', dan jawaban saya adalah 'sampai disk penuh' karena tidak ada alasan untuk membuangnya selain kehabisan ruang.

Namun, standar logrotate ingin kita menentukan periode tertentu + jumlah rotasi. Adakah hal serupa yang akan membuat kita mengatakan "putar setiap hari, dan simpan sebanyak mungkin sejarah yang Anda inginkan hingga hanya ada ruang kosong 5%"?

Platformnya adalah Redhat Linux.

kdt
sumber
1
Menyimpan log sampai disk penuh dapat diterapkan pada lingkungan fisik, tetapi karena kita kebanyakan pindah ke server virtual dan cloud, ukuran sistem file harus sekecil mungkin untuk menurunkan biaya. Dalam hal ini, Anda tidak dapat menghindari mendefinisikan kebijakan penyimpanan.
jfg956

Jawaban:

9

Anda mungkin dapat menggunakan arahan firstaction atau lastaction untuk memanggil skrip shell yang menguji ruang kosong disk, dan kemudian menjalankan penghapusan pada file tertua.

   firstaction/endscript
          The lines between firstaction and endscript (both of which must appear on lines by themselves) are
          executed (using /bin/sh) once before all log files that match the wildcarded pattern are  rotated,
          before  prerotate  script  is  run  and  only if at least one log will actually be rotated.  These
          directives may only appear inside a log file definition. Whole pattern is passed to the script  as
          first  argument.  If  the script exits with error, no further processing is done. See also lastac-
          tion.

Memperbarui:

Berikut posting Stackoverflow pada jenis skrip yang dapat Anda jalankan:

/programming/7523059/remove-oldest-file-in-repository

cjc
sumber
1

logrotate sendiri tidak memiliki opsi seperti itu. Anda dapat menambahkan skrip cron yang menemukan log terlama untuk dihapus setiap kali ruang kosong berada di bawah kriteria Anda. Anda juga dapat melakukan validasi lainnya. Namun, mendapatkan disk terlalu penuh sepanjang waktu bukanlah ide yang baik karena sistem tidak akan dapat membuat file sementara yang besar dan dapat menyebabkan kegagalan aplikasi.

johnshen64
sumber
Jika Anda memiliki semuanya di satu sistem file, itu mungkin bukan ide yang baik. Namun, log saya ada di sistem file mereka sendiri, untuk menghindari cara lain.
kdt
ah ok, jika mereka memiliki satu-satunya fs mereka, itu membuat hal-hal sederhana untuk memiliki skrip untuk melakukan pembersihan, dh / fs dan menggunakan awk atau cut untuk mengekstrak% yang digunakan, dan berdasarkan angka itu, Anda dapat memulai mencari dengan eksekutif rm. saya sering tidak menulis skrip dan hanya meletakkan satu-liner di crontab itu sendiri.
johnshen64
0

Saya hanya ingin menunjukkan ada kasus di mana Anda tidak ingin log Anda mengisi semua ruang disk yang tersedia. Saya telah berurusan dengan beberapa host dengan direktori disediakan / var tipis dan menjaga log ke ukuran tertentu sangat penting. Kami menggunakan pekerjaan kroni dalam hubungannya dengan logrorate untuk menjaga ukuran. Hal serupa dapat digunakan di lingkungan Anda, meskipun server pusat log seperti splunk atau syslog-ng mungkin akan menjadi pilihan yang lebih baik.

Tim Brigham
sumber
0

Seperti yang disarankan oleh @cjc, Anda dapat menggunakan aksi pertama. Lihat contoh ini:

/mnt/user/logs/*.log  /mnt/user/logs/*/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        su root www-data
        create 760 root www-data
        firstaction
          for file in `find  -type f -size +1024M`; do
              percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
              if [ $percent -gt 50 ]; then 
                  echo "Removed $file" >> /mnt/user/logs/logrotate.log
                  rm $file
              fi
           done;
        endscript
}

Dalam contoh ini Anda menghapus file lebih besar dari 1GB dari partisi / mnt / pengguna jika ruang yang digunakan partisi lebih dari 50% .

esguti
sumber