Bagaimana saya bisa membatasi ukuran file log yang ditulis dengan >>
200MB?
$ run_program >> myprogram.log
Bagaimana saya bisa membatasi ukuran file log yang ditulis dengan >>
200MB?
$ run_program >> myprogram.log
Jawaban:
Jika aplikasi Anda (mis. run_program
) Tidak mendukung pembatasan ukuran file log, maka Anda dapat memeriksa ukuran file secara berkala dalam satu lingkaran dengan aplikasi atau skrip eksternal.
Anda juga dapat menggunakan logrotate(8)
untuk memutar log Anda, ia memiliki size
parameter yang dapat Anda gunakan untuk tujuan Anda:
Dengan ini, file log diputar ketika ukuran yang ditentukan tercapai. Ukuran dapat ditentukan dalam bytes (default), kilobytes (sizek), atau megabytes (sizem).
postscript
opsi untuk mengirim konfigurasi logrotate SIGHUP
ke program.
Jika program Anda tidak perlu menulis file LAINNYA yang akan lebih besar dari batas ini, Anda dapat menginformasikan kernel menggunakan batas ini ulimit
. Sebelum Anda menjalankan perintah Anda, jalankan ini untuk menyiapkan batas ukuran file 200MB untuk semua proses yang dijalankan di sesi shell Anda saat ini:
ulimit -f $((200*1024))
Ini akan melindungi sistem Anda, tetapi mungkin jaring untuk program yang menulis file. Seperti yang disarankan eyazici , pertimbangkan untuk mengatur logrotate
untuk memangkas file log setelah mereka mencapai ukuran atau usia tertentu. Anda dapat membuang data lama atau mengarsipkannya untuk jangka waktu tertentu dalam serangkaian file terkompresi.
Anda dapat membuat image sistem file baru, pasang menggunakan perangkat loop dan letakkan file log pada sistem file itu:
dd if=/dev/zero of=./200mb.img bs=1024 count=200000 # create new empty 200MB file
mkfs.ext2 200mb.img # or ext3, or whatever fits your needs
mkdir logs
sudo mount -t ext2 -o loop 200mb.img logs # only root can do '-o loop' by default
run_program >>logs/myprogram.log
Anda juga dapat menggunakan tmpfs
sebagai ganti file, jika Anda memiliki cukup memori.
Anda dapat memotong output dengan head
:
size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
SIGPIPE
) setelah telah mencapai batas ukuran, daripada membuang data.
dd
sihir tapi ya @ Random832 benar, Anda akan mendapatkan SIGPIPE
sebagai head
/ dd
/ whatever
menjatuhkannya.
trap '' SIGPIPE
?
{ head -c "$size" >> log; cat > /dev/null; }
.
Dalam paket apache2-utils
disebut utilitas saat ini rotatelogs
, mungkin bermanfaat bagi Anda.
Ringkasan:
rotatelogs [-l] [-L linkname ] [-p program ] [-f] [-t] [-v] [-e] [-c] [-n jumlah-of-file ] logfile waktu rotasi | filesize (B | K | M | G) [ offset ]
Contoh:
your_program | rotatelogs -n 5 /var/log/logfile 1M
Manual lengkap bisa Anda baca di tautan ini .
Saya yakin poster asli telah menemukan solusi. Berikut ini satu lagi untuk orang lain yang dapat membaca utas ini ...
Curtail membatasi ukuran output program dan mempertahankan 200MB output terakhir dengan perintah berikut:
$ run_program | curtail -s 200M myprogram.log
CATATAN: Saya adalah pengelola repo di atas. Hanya berbagi solusinya ...
Karena ini adalah teks, saya akan menulis skrip dalam bahasa favorit Anda dan mengirimkannya ke situ. Apakah itu menangani file I / O (atau menyimpan semuanya dalam memori dan kemudian membuangnya SIGHUP
atau serupa). Untuk itu, alih-alih 200MB saya akan memikirkan jumlah baris yang 'masuk akal' untuk dilacak.
syslog
dan logrotate
.
Skrip berikut harus melakukan pekerjaan itu.
LOG_SIZE=500000
NUM_SEGM=2
while getopts "s:n:" opt; do
case "$opt" in
s)
LOG_SIZE=$OPTARG
;;
n)
NUM_SEGM=$OPTARG
;;
esac
done
shift $((OPTIND-1))
if [ $# == 0 -o -z "$1" ]; then
echo "missing output file argument"
exit 1
fi
OUT_FILE=$1
shift
NUM=1
while :; do
dd bs=10 count=$(($LOG_SIZE/10)) >> $OUT_FILE 2>/dev/null
SZ=`stat -c%s $OUT_FILE`
if [ $SZ -eq 0 ]; then
rm $OUT_FILE
break
fi
echo -e "\nLog portion finished" >> $OUT_FILE
mv $OUT_FILE $OUT_FILE.n$NUM
NUM=$(($NUM + 1))
[ $NUM -gt $NUM_SEGM ] && NUM=1
done
Ini memiliki beberapa jalan pintas yang jelas, tetapi secara keseluruhan itu melakukan apa yang Anda minta. Ini akan membagi log menjadi potongan dengan ukuran terbatas, dan jumlah potongan juga terbatas. Semua dapat ditentukan melalui argumen baris perintah. File log juga ditentukan melalui baris perintah.
Catat gotcha kecil jika Anda menggunakannya dengan daemon yang bercabang ke latar belakang. Menggunakan pipa akan mencegah daemon masuk ke latar belakang. Dalam hal ini ada sintaks (kemungkinan khusus untuk bash) untuk menghindari masalah:
my_daemon | ( logger.sh /var/log/my_log.log <&0 & )
Perhatikan <&0
, meskipun tampak berlebihan, tidak akan berfungsi tanpa ini.