การบันทึกไฟล์ในไดเรกทอรีและไดเรกทอรีย่อย


62

เป็นไปได้หรือไม่ที่logrotateจะต้องพิจารณา logfiles ในไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด? (เช่นไม่มีรายการไดเรกทอรีย่อยอย่างชัดเจน)

คำตอบ:


87

ไดเรกทอรีย่อยของคุณลึกแค่ไหน?

/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 จะแสดงรายการไฟล์บันทึกแต่ละไฟล์ที่พิจารณาว่าจะหมุน


6
ขอบคุณ! ดูเหมือนว่า-dจะทำให้ logrotate ในโหมดแห้ง (จริง ๆ แล้วไม่ได้เปลี่ยนอะไร)
ithinkihaveacat

1
ไม่เกี่ยวข้องโดยตรงจริงๆ แต่อาจเป็นประโยชน์กับใครบางคน -fตัวเลือกบอก logrotate การ "บังคับใช้" คำเปล่าที่ท้ายคำสั่งเป็นไฟล์กำหนดค่าที่จะใช้แทนค่าเริ่มต้น ดังนั้นlogrotate -f /some/configหมายความว่าให้รันด้วยไฟล์ปรับแต่งนั้นและเรียกใช้เสมอแม้ว่าไฟล์กำหนดค่าจะบอกว่ายังไม่ถึงเวลาที่จะเรียกใช้ สำหรับดวงตาที่ไม่ได้รับการฝึกฝนของฉันและกับบรรพบุรุษของฉันที่ทำงาน cron ด้วยสิ่งนั้นดูเหมือนว่ามัน-fแค่ระบุไฟล์กำหนดค่า ค่อนข้างสับสน
Dan Pritts

4

ในกรณีของฉันความลึกของไดเรกทอรีย่อยสามารถเปลี่ยนแปลงได้โดยไม่มีการเตือนล่วงหน้าดังนั้นฉันจึงตั้งค่าสคริปต์ทุบตีเพื่อค้นหาไดเรกทอรีย่อยทั้งหมดและสร้างรายการกำหนดค่าสำหรับแต่ละไดเรกทอรี

นอกจากนี้ยังเป็นสิ่งสำคัญสำหรับฉันที่จะรักษาโครงสร้างของไดเรกทอรีย่อยหลังจากการหมุนซึ่งอักขระตัวแทน (เช่น @ คำตอบของ @ 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


1

เป็นเธรดเก่า แต่คุณสามารถทำสิ่งต่อไปนี้:

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

ดาวสองดวงนี้จะตรงกับศูนย์หรือมากกว่าไดเรกทอรี อย่างไรก็ตามคุณต้องระวังวิธีที่คุณกำหนดไฟล์บันทึกที่จะหมุนเนื่องจากคุณสามารถหมุนไฟล์ที่ถูกหมุนแล้ว ฉันจะอ้างถึงคู่มือของ logrotate ที่นี่

โปรดใช้สัญลักษณ์แทนด้วยความระมัดระวัง หากคุณระบุ *, logrotate จะหมุนไฟล์ทั้งหมดรวมถึงไฟล์ที่หมุนก่อนหน้านี้ วิธีนี้คือการใช้คำสั่ง olddir หรือ wildcard ที่แน่นอนยิ่งขึ้น (เช่น * .log)


3
รูปแบบไวด์การ์ดนี้ไม่ได้ผลสำหรับฉัน Logrotate 3.8.6 ใน RHEL 7.3
northben

บางทีคุณควรเปิดใช้งานglobstarก่อนที่จะรัน logrotate shopt -s globstarนี้จะเปิดใช้งานสำหรับทุบตี
bat_ventzi

ผมมีปัญหาเดียวกัน. Logrotate 3.8.7 บน Ubuntu 16.04.3 ls /var/log/basedir/**/*.log ทำงานได้ตามที่อธิบายไว้ แต่ logrotate ไม่ทำงาน
frogstarr78

ไม่ได้ผลสำหรับฉันเช่นกันใน logrotate 3.11.0 ฉันไม่คิดว่าการขยายตัวของ bash นั้นเกี่ยวข้องกับสัญลักษณ์ตัวแทนการทำ logrotate (ยกเว้นสำหรับไวยากรณ์ที่คล้ายกัน)
Thayne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.