ไวยากรณ์ไฟล์กำหนดค่า logrotate - สามารถใช้สัญลักษณ์ตัวแทนหลายรายการ


83

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

man page สำหรับ logrotate แสดงตัวอย่างต่อไปนี้:

   "/var/log/httpd/access.log" /var/log/httpd/error.log {
       rotate 5
       mail www@my.org
       size 100k
       sharedscripts
       postrotate
           /usr/bin/killall -HUP httpd
       endscript
   }

ตัวอย่างทั้งหมดที่มี wildcard มีเพียงรายการเดียว ตอนนี้สิ่งที่ฉันสนใจคือไม่ว่าจะอนุญาตหรือไม่

   /var/log/httpd/*.log /var/log/httpd/*/*.log {
       # ... same as above
   }

นี่คือเหตุผล: ฉันมีหลายโฮสต์และฉันแยกพวกเขาโดยผู้ใช้ที่ "เป็นเจ้าของ" vhosts เหล่านั้น เนื่องจากไฟล์บันทึกนั้นสามารถอ่านได้ทั่วโลกฉันจึงต้องการผูกไฟล์เข้ากับโฮมไดเร็กตอรี่ของผู้ใช้ แต่ จำกัด เฉพาะไฟล์ล็อกที่ผู้ใช้ "เป็นเจ้าของ" ซึ่งทำได้ง่ายที่สุดโดยแยกล็อกออกเป็นโฟลเดอร์ (และผูก - การติดตั้งจำเป็นต้องใช้รูปแบบนั้น) ดังนั้นฉันกำลังมองหาวิธีแก้ปัญหาในการหมุนทั้งล็อกไฟล์ภายใต้/var/log/httpdตลอดจนล็อกไฟล์ทั้งหมดภายใต้ไดเร็กทอรีย่อยของไดเร็กทอรีนั้น - โดยไม่ต้องแสดงรายการแต่ละไดเร็กทอรีย่อยตามชื่อ

โดยทั่วไปแล้วหน้า man ไม่ให้ข้อมูลว่ามีหลายรายการที่เป็นไปได้สำหรับกฎไวด์การ์ดหรือสำหรับเส้นทางแบบเต็มเท่านั้น ฉันใช้ logrotate เวอร์ชั่น 3.7.8-6 ซึ่งมาพร้อมกับ Debian "Squeeze" แต่ฉันคิดว่านี่ไม่ได้เฉพาะเจาะจงกับรุ่น distro หรือโปรแกรม

คำตอบ:


119

ใช่คุณสามารถใช้ไวลด์การ์ดหลายใบได้ คุณสามารถทดสอบไฟล์ของคุณโดยไม่ทำการหมุนจริงโดยทำดังนี้

logrotate -d -f /etc/logrotate.conf
  • -d = เปิดโหมดดีบัก ในโหมดดีบั๊กจะไม่มีการเปลี่ยนแปลงใด ๆ กับไฟล์บันทึกหรือไฟล์สถานะ logrotate

  • -f = บอกว่า logrotate บังคับให้หมุนแม้ว่ามันจะไม่คิดว่ามันจำเป็นก็ตาม บางครั้งสิ่งนี้มีประโยชน์หลังจากเพิ่มรายการใหม่ลงใน logrotate หรือถ้าไฟล์บันทึกเก่าถูกลบด้วยมือเนื่องจากไฟล์ใหม่จะถูกสร้างขึ้นและการบันทึกจะดำเนินต่ออย่างถูกต้อง "


3
ขอบคุณมาก! เพียงแค่พยายามและใช้งานได้ ปรากฏขึ้นจากผลลัพธ์ที่สามารถใช้อักขระตัวแทนในการทำงานเช่นเดียวกับในเชลล์
0xC0000022L

24

ฉันแค่อยากอธิบายเพราะนั่นคือสิ่งที่ฉันได้มาที่นี่เพื่อดูวิธีการทำ

อนุญาตให้ระบุไฟล์บันทึกได้หลายไฟล์สำหรับการกำหนดค่าเดียวเช่น

/var/log/httpd/access.log
/var/log/httpd/error.log
/var/log/httpd/mysite/*.log
{
    rotate 5
    mail nobody@example.org
    size 100k
    sharedscripts
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

//, ไม่มีปัญหากับเส้นทางที่แตกต่างกันที่เกิดขึ้นในหลายบรรทัดหรือไม่?
Nathan Basanese

@NathanBasanese ฉันไม่เข้าใจคำถามของคุณอย่างเต็มที่ฉันคิดว่าคุณสามารถชี้เส้นทางไปยังไฟล์ที่ใดก็ได้บนดิสก์ที่คุณชอบพวกเขาไม่จำเป็นต้องอยู่ในคำนำหน้าไดเรกทอรีเดียวกัน
ThorSummoner

@NathanBasanese โอ้ฉันคิดว่าฉันเข้าใจว่าการมีเป้าหมายการหมุนบันทึกหลายรายการในบรรทัดที่แตกต่างกันดูเหมือนเป็นการใช้งานปกติฉันคัดลอกแบบฟอร์มนั้นจากสคริปต์ logrotate.d อื่น ๆ เช่น
/etc/logrotate.d/rsyslog

4

จาก man page สำหรับlogrotate :

โปรดทราบว่าชื่อไฟล์บันทึกอาจอยู่ในเครื่องหมายคำพูด (และต้องใส่เครื่องหมายอัญประกาศหากชื่อนั้นมีช่องว่าง) ใช้กฎการอ้างอิงเปลือกปกติโดยมีการรองรับ ', "และ \ อักขระ

โปรดจำไว้ว่าให้แก้ไขหรือลบเครื่องหมายคำพูดเมื่อไปจากรูปแบบเดียวกับหลายรูปแบบ:

งานนี้:

/var/log/*.log /var/log/*.blog {

มันก็ใช้ได้เช่นกัน:

/var/log/*.log
/var/log/*.blog {

สิ่งนี้ไม่ทำงาน:

'/var/log/*.log /var/log/*.blog' {

และไม่ใช่สิ่งนี้:

"/var/log/*.log /var/log/*.blog" {

เปรียบเทียบกับเคสตัวเดียว

งานนี้:

'/var/log/*.log' {

และสิ่งนี้ก็ใช้ได้เช่นกัน:

"/var/log/*.log" {

ทดสอบกับ logrotate 3.10.0


2
จะน่าสนใจที่จะรู้ว่างานนี้:"/var/space /log/*.log" "/var/log/*.blog"
KajMagnus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.