ฉันจะ จำกัด ขนาดของไฟล์บันทึกที่เขียนด้วย>>
200MB ได้อย่างไร
$ run_program >> myprogram.log
ฉันจะ จำกัด ขนาดของไฟล์บันทึกที่เขียนด้วย>>
200MB ได้อย่างไร
$ run_program >> myprogram.log
คำตอบ:
หากแอปพลิเคชันของคุณ (เช่น. run_program
) ไม่สนับสนุนการ จำกัด ขนาดของไฟล์บันทึกคุณสามารถตรวจสอบขนาดไฟล์เป็นระยะในลูปด้วยแอปพลิเคชันหรือสคริปต์ภายนอก
คุณยังสามารถใช้logrotate(8)
เพื่อหมุนบันทึกของคุณมันมีsize
พารามิเตอร์ที่คุณสามารถใช้เพื่อวัตถุประสงค์ของคุณ:
ด้วยวิธีนี้ไฟล์บันทึกจะถูกหมุนเมื่อถึงขนาดที่ระบุ ขนาดอาจระบุเป็นไบต์ (ค่าเริ่มต้น), กิโลไบต์ (sizek) หรือเมกะไบต์ (sizem)
postscript
ตัวเลือกเพื่อให้การกำหนดค่า logrotate ส่งSIGHUP
ไปยังโปรแกรม
ถ้าโปรแกรมของคุณไม่จำเป็นต้องเขียนไฟล์อื่น ๆ ที่จะมีขนาดใหญ่กว่าขีด จำกัด นี้คุณสามารถแจ้งเคอร์เนลของขีด จำกัด ulimit
นี้โดยใช้ ก่อนที่คุณจะรันคำสั่งให้รันสิ่งนี้เพื่อตั้งค่าขีด จำกัด ขนาดไฟล์ 200MB สำหรับกระบวนการทั้งหมดที่รันในเชลล์เซสชั่นปัจจุบันของคุณ:
ulimit -f $((200*1024))
สิ่งนี้จะปกป้องระบบของคุณ แต่อาจเป็นเรื่องที่ jaring สำหรับโปรแกรมที่เขียนไฟล์ ตามที่eyazici แนะนำให้พิจารณาตั้งค่าlogrotate
ให้ตัดไฟล์บันทึกเมื่อถึงขนาดหรืออายุที่แน่นอน คุณสามารถทิ้งข้อมูลเก่าหรือเก็บถาวรเป็นระยะเวลาหนึ่งในชุดของไฟล์บีบอัด
คุณสามารถสร้างอิมเมจระบบไฟล์ใหม่ติดตั้งโดยใช้อุปกรณ์วนรอบและวางไฟล์บันทึกในระบบไฟล์นั้น:
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
คุณอาจใช้tmpfs
แทนไฟล์หากคุณมีหน่วยความจำเพียงพอ
คุณสามารถตัดทอนผลลัพธ์ด้วยhead
:
size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
SIGPIPE
) เมื่อถึงขีด จำกัด ขนาดแทนที่จะทิ้งข้อมูล
dd
มายากล แต่ใช่ @ Random832 ถูกต้องคุณจะได้รับSIGPIPE
เป็นhead
/ dd
/ whatever
หยดมัน
trap '' SIGPIPE
?
{ head -c "$size" >> log; cat > /dev/null; }
หรือท่อแทน
ในแพ็คเกจapache2-utils
เป็นยูทิลิตี้ที่เรียกว่าrotatelogs
อาจเป็นประโยชน์สำหรับคุณ
สรุป:
rotatelogs [-l] [-L linkname ] [-p โปรแกรม ] [-f] [-t] [-v] [-e] [-e] [-c] [-n จำนวนไฟล์ ] logfile การหมุนเวลา | ขนาดไฟล์ (B | K | M | G) [ offset ]
ตัวอย่าง:
your_program | rotatelogs -n 5 /var/log/logfile 1M
คู่มือฉบับเต็มคุณสามารถอ่านได้ที่ลิงค์นี้
ฉันแน่ใจว่าผู้โพสต์ดั้งเดิมได้พบวิธีการแก้ปัญหา นี่คืออีกหนึ่งสำหรับคนอื่น ๆ ที่อาจอ่านกระทู้นี้ ...
Curtail จำกัด ขนาดของเอาต์พุตของโปรแกรมและเก็บรักษาเอาต์พุต 200MB สุดท้ายด้วยคำสั่งต่อไปนี้:
$ run_program | curtail -s 200M myprogram.log
หมายเหตุ:ฉันเป็นผู้ดูแล repo ด้านบน เพียงแบ่งปันโซลูชัน ...
เนื่องจากเป็นข้อความฉันจะเขียนสคริปต์ในภาษาที่คุณโปรดปรานและไพพ์ลงไป มีมันจัดการไฟล์ I / O (หรือเก็บไว้ในหน่วยความจำแล้วถ่ายโอนข้อมูลในSIGHUP
หรือคล้ายกัน) สำหรับสิ่งนั้นแทนที่จะเป็น 200MB ฉันจะคิดถึงจำนวนบรรทัด 'ที่สมเหตุสมผล' เพื่อติดตาม
syslog
logrotate
สคริปต์ต่อไปนี้ควรทำงาน
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
มันมีทางลัดที่เห็นได้ชัดสองอย่าง แต่โดยรวมแล้วมันก็เป็นสิ่งที่คุณต้องการ มันจะแบ่งล็อกเป็นชิ้นส่วนที่มีขนาด จำกัด และจำนวนชิ้นนั้นก็มี จำกัด เช่นกัน สามารถระบุได้ทั้งหมดผ่านอาร์กิวเมนต์บรรทัดคำสั่ง ไฟล์บันทึกจะถูกระบุด้วยบรรทัดคำสั่ง
หมายเหตุ gotcha ขนาดเล็กถ้าคุณใช้กับ daemon ที่ส้อมเป็นพื้นหลัง การใช้ไพพ์จะป้องกันไม่ให้ภูตไปที่พื้นหลัง ในกรณีนี้จะมีไวยากรณ์ (โดยเฉพาะ bash เฉพาะ) เพื่อหลีกเลี่ยงปัญหา:
my_daemon | ( logger.sh /var/log/my_log.log <&0 & )
สังเกตใน<&0
ขณะที่ซ้ำซ้อนดูเหมือนว่ามันจะไม่ทำงานหากไม่มีสิ่งนี้