cara menerapkan logrotate di skrip shell

12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Saya ingin menerapkan logrotate untuk mengontrol ukuran file log, jadi bagaimana menerapkan logrotate, jika situasinya seperti di atas?

Veerendra
sumber

Jawaban:

11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

Saya telah menghapus "&" karena dapat menyebabkan masalah.

ingin tahu
sumber
@ Vikar kita perlu meletakkan logika menggulung log di dalam loop saat Anda menjalankan loop tak terbatas ..
penasaran
@Veerendra kami posting saya sebelumnya memiliki kesalahan .. "mv" tidak akan membuat file baru tetapi Anda dapat mengubah script sesuai dengan kebutuhan Anda.
penasaran
Jadi, alih-alih cpdan mv, dapatkah saya menghapus file log, lalu apakah itu file log baru dengan nama yang sama? (Persyaratan saya adalah, jika file log mencapai batas tertentu, saya ingin menghapus file log itu dan kemudian membuat file baru )
Veerendra
Anda harus menggunakan >>untuk menambahkan file log, >akan menimpanya berulang kali.
alcik
jika saya gunakan >, saya mendapatkan tail: test.log: file truncated Hello World!.... Jika saya menggunakan >>, saya mendapatkan pesan log yang benar, tetapi ukuran file meningkat. Tidak ada syarat memeriksa kondisi ... ;-(
Veerendra
24

bagaimana kalau menggunakan savelog?

Ini tersedia di debian dan RH dan hampir semua distro linux lain yang saya tahu. Ini adalah skrip shell / bin / sh, jadi harus dijalankan pada unix lain juga.

misalnya sebelum menulis apa pun untuk test.logdijalankan savelog -n -c 7 test.log. Ini akan membuat 7 versi test.log tidak kosong terbaru. Secara default, ini akan memampatkan log yang diputar (tapi itu bisa dinonaktifkan dengan -l).

Jika perlu, Anda dapat memeriksa ukuran test.logdan hanya savelogjika ukurannya melebihi ukuran tertentu.

cas
sumber
Adakah ide paket mana yang berisi ini di AWS Linux (dekat dengan CentOS, saya percaya)? Instalasi default tidak memiliki savelog. Saya tidak dapat menemukannya dari yum baik menggunakan repos default
jhonkola
savelog tidak ditemukan di RHEL 5. Apakah Anda tahu repo yang seharusnya berada di?
Felipe Alvarez
tidak tahu tentang kemasan centos atau rhel5, tetapi Anda dapat menemukan /usr/bin/savelogskrip shell di sources.debian.net/src/debianutils/4.7
cas
2
Saya belum menemukan savelogkotak RHEL / CentOS 5/6 saya, jadi saya baru saja mengunduhnya ad hoc, dan sepertinya berfungsi dengan baik untuk kebutuhan saya.
Dale Anderson
Salah satu kelemahannya savelogadalah ia mengganti nama file tetapi kemudian membutuhkan waktu lama untuk meng-gzip yang lama sebelum selesai. Sementara itu .0 log sudah mendapatkan entri hari berikutnya di dalamnya. Idealnya waktu antara rotasi log dan pensinyalan proses untuk membuka kembali log harus minimal. Saya menonaktifkan savelogfitur kompresi karena ini.
rustyx
2

Saya menulis logrotee akhir pekan ini. Saya mungkin tidak akan jika saya sudah membaca jawaban yang bagus tentangmultilog @ JdeBP .

Saya fokus pada itu menjadi ringan dan mampu bzip2 potongan outputnya seperti:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Masih banyak yang harus dilakukan dan diuji.

Victor Sergienko
sumber
0

Karena saya belum bisa menambahkan komentar ke jawaban yang diterima , sebuah petunjuk BusyBox , di mana dutidak memiliki -bbendera:

du /var/log/file | tr -s '\t' ' ' | cut -d' ' -f1
lnksz
sumber