เป็นไปได้หรือไม่ที่logrotate
จะต้องพิจารณา logfiles ในไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด? (เช่นไม่มีรายการไดเรกทอรีย่อยอย่างชัดเจน)
เป็นไปได้หรือไม่ที่logrotate
จะต้องพิจารณา logfiles ในไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด? (เช่นไม่มีรายการไดเรกทอรีย่อยอย่างชัดเจน)
คำตอบ:
ไดเรกทอรีย่อยของคุณลึกแค่ไหน?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
จะหมุนไฟล์. logทั้งหมดใน basedir / รวมถึงไฟล์. logทั้งหมดในชายด์โดยตรงของ basedir หากคุณต้องการเพิ่มระดับ 1 ลึกเพียงเพิ่มอีก/var/log/basedir/*/*/*.log
จนกว่าคุณจะครอบคลุมแต่ละระดับ
สิ่งนี้สามารถทดสอบได้โดยใช้ไฟล์กำหนดค่า logrotate แยกต่างหากซึ่งมีข้อ จำกัด ที่จะไม่พบ (ขนาดเล็กมาก) แล้วเรียกใช้บันทึกการหมุนตัวเองในโหมด verbose
logrotate -d testconfig.conf
แฟล็ก -d จะแสดงรายการไฟล์บันทึกแต่ละไฟล์ที่พิจารณาว่าจะหมุน
-f
ตัวเลือกบอก logrotate การ "บังคับใช้" คำเปล่าที่ท้ายคำสั่งเป็นไฟล์กำหนดค่าที่จะใช้แทนค่าเริ่มต้น ดังนั้นlogrotate -f /some/config
หมายความว่าให้รันด้วยไฟล์ปรับแต่งนั้นและเรียกใช้เสมอแม้ว่าไฟล์กำหนดค่าจะบอกว่ายังไม่ถึงเวลาที่จะเรียกใช้ สำหรับดวงตาที่ไม่ได้รับการฝึกฝนของฉันและกับบรรพบุรุษของฉันที่ทำงาน cron ด้วยสิ่งนั้นดูเหมือนว่ามัน-f
แค่ระบุไฟล์กำหนดค่า ค่อนข้างสับสน
ในกรณีของฉันความลึกของไดเรกทอรีย่อยสามารถเปลี่ยนแปลงได้โดยไม่มีการเตือนล่วงหน้าดังนั้นฉันจึงตั้งค่าสคริปต์ทุบตีเพื่อค้นหาไดเรกทอรีย่อยทั้งหมดและสร้างรายการกำหนดค่าสำหรับแต่ละไดเรกทอรี
นอกจากนี้ยังเป็นสิ่งสำคัญสำหรับฉันที่จะรักษาโครงสร้างของไดเรกทอรีย่อยหลังจากการหมุนซึ่งอักขระตัวแทน (เช่น @ คำตอบของ @ DanR) ดูเหมือนจะไม่ทำ หากคุณกำลังหมุนบันทึกประจำวันคุณสามารถใส่สคริปต์นี้ลงใน cron-job รายวัน
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
เช่นเดียวกับ @DanR แนะนำให้ทดสอบด้วย logrotate -d
เป็นเธรดเก่า แต่คุณสามารถทำสิ่งต่อไปนี้:
/var/log/basedir/**/*.log {
daily
rotate 5
}
ดาวสองดวงนี้จะตรงกับศูนย์หรือมากกว่าไดเรกทอรี อย่างไรก็ตามคุณต้องระวังวิธีที่คุณกำหนดไฟล์บันทึกที่จะหมุนเนื่องจากคุณสามารถหมุนไฟล์ที่ถูกหมุนแล้ว ฉันจะอ้างถึงคู่มือของ logrotate ที่นี่
โปรดใช้สัญลักษณ์แทนด้วยความระมัดระวัง หากคุณระบุ *, logrotate จะหมุนไฟล์ทั้งหมดรวมถึงไฟล์ที่หมุนก่อนหน้านี้ วิธีนี้คือการใช้คำสั่ง olddir หรือ wildcard ที่แน่นอนยิ่งขึ้น (เช่น * .log)
globstar
ก่อนที่จะรัน logrotate shopt -s globstar
นี้จะเปิดใช้งานสำหรับทุบตี
-d
จะทำให้ logrotate ในโหมดแห้ง (จริง ๆ แล้วไม่ได้เปลี่ยนอะไร)