ค้นหาเว็บไซต์

วิธีการตั้งค่าและจัดการการหมุนบันทึกโดยใช้ Logrotate ใน Linux


หนึ่งในไดเร็กทอรีที่น่าสนใจที่สุด (และอาจเป็นหนึ่งในไดเร็กทอรีที่สำคัญที่สุดด้วย) ในระบบ Linux คือ /var/log ตามมาตรฐานลำดับชั้นของระบบไฟล์ กิจกรรมของบริการส่วนใหญ่ที่ทำงานอยู่ในระบบจะถูกเขียนลงในไฟล์ภายในไดเร็กทอรีนี้หรือหนึ่งในไดเร็กทอรีย่อย

ไฟล์ดังกล่าวเรียกว่า บันทึก และเป็นกุญแจสำคัญในการตรวจสอบว่าระบบทำงานอย่างไร (และทำงานอย่างไรในอดีต) บันทึกยังเป็นแหล่งข้อมูลแรกที่ผู้ดูแลระบบและวิศวกรตรวจสอบขณะแก้ไขปัญหา

หากเราดูเนื้อหาของ /var/log บน CentOS/RHEL/Fedora และ Debian/Ubuntu (เพื่อความหลากหลาย) เราจะเห็นว่า ไฟล์บันทึกและไดเร็กทอรีย่อยต่อไปนี้

โปรดทราบว่าผลลัพธ์อาจแตกต่างกันเล็กน้อยในกรณีของคุณ ขึ้นอยู่กับบริการที่ทำงานบนระบบของคุณและเวลาที่บริการเหล่านั้นทำงานอยู่

ใน RHEL/CentOS และ Fedora

ls /var/log

ในเดเบียนและอูบุนตู

ls /var/log

ในทั้งสองกรณี เราจะสังเกตได้ว่าชื่อบันทึกบางชื่อลงท้ายตามที่คาดไว้ใน “log ” ในขณะที่ชื่ออื่นๆ เปลี่ยนชื่อโดยใช้วันที่ (เช่น maillog-20160822 บน CentOS) หรือบีบอัด (พิจารณา auth.log.2.gz และ mysql.log.1.gz บน Debian แข็งแกร่ง>)

นี่ไม่ใช่พฤติกรรมเริ่มต้นตามการกระจายที่เลือก แต่สามารถเปลี่ยนแปลงได้ตามต้องการโดยใช้คำสั่งในไฟล์การกำหนดค่า ดังที่เราจะเห็นในบทความนี้

หากบันทึกถูกเก็บไว้ตลอดไป ในที่สุดบันทึกเหล่านั้นก็จะเต็มไปด้วยระบบไฟล์ที่มี /var/log อยู่ เพื่อป้องกันเหตุการณ์ดังกล่าว ผู้ดูแลระบบสามารถใช้ยูทิลิตีที่ดีที่เรียกว่า logrotate เพื่อล้างข้อมูลบันทึกเป็นระยะๆ

กล่าวอีกนัยหนึ่ง logrotate จะเปลี่ยนชื่อหรือบีบอัดบันทึกหลักเมื่อตรงตามเงื่อนไข (เพิ่มเติมเกี่ยวกับเรื่องนั้นในไม่กี่นาที) เพื่อให้เหตุการณ์ถัดไปได้รับการบันทึกในไฟล์เปล่า

นอกจากนี้ จะลบไฟล์บันทึก “เก่า ” และจะเก็บไฟล์ล่าสุดไว้ แน่นอนว่า เราต้องตัดสินใจว่า "เก่า" หมายถึงอะไร และเราต้องการให้ logrotate ล้างบันทึกให้เราบ่อยแค่ไหน

การติดตั้ง Logrotate ใน Linux

หากต้องการติดตั้ง logrotate เพียงใช้เครื่องมือจัดการแพ็คเกจของคุณ:

---------- On Debian and Ubuntu ---------- 
aptitude update && aptitude install logrotate 

---------- On CentOS, RHEL and Fedora ---------- 
yum update && yum install logrotate

เป็นเรื่องที่คุ้มค่าและควรทราบว่าไฟล์การกำหนดค่า (/etc/logrotate.conf) อาจระบุว่าการตั้งค่าอื่นๆ ที่เฉพาะเจาะจงมากขึ้นอาจถูกวางไว้ในไฟล์ .conf แต่ละไฟล์ภายใน /etc/logrotate.d

กรณีนี้จะเกิดขึ้นหากบรรทัดต่อไปนี้มีอยู่และไม่ได้ใส่เครื่องหมายความคิดเห็นไว้:

include /etc/logrotate.d

เราจะยึดแนวทางนี้ เพราะมันจะช่วยเรารักษาสิ่งต่าง ๆ ให้เป็นระเบียบ และใช้กล่อง Debian สำหรับตัวอย่างต่อไปนี้

กำหนดค่า Logrotate ใน Linux

เนื่องจากเป็นเครื่องมืออเนกประสงค์ logrotate จึงมอบคำสั่งมากมายเพื่อช่วยเรากำหนดเวลาและวิธีหมุนเวียนบันทึก และสิ่งที่จะเกิดขึ้นหลังจากนั้น

มาแทรกเนื้อหาต่อไปนี้ใน /etc/logrotate.d/apache2.conf (โปรดทราบว่าคุณจะต้องสร้างไฟล์นั้น) และตรวจสอบแต่ละบรรทัดเพื่อระบุวัตถุประสงค์:

/var/log/apache2/* {
    weekly
    rotate 3
    size 10M
    compress
    delaycompress
}

บรรทัดแรกระบุว่าคำสั่งภายในบล็อกใช้กับบันทึกทั้งหมดภายใน /var/log/apache2:

  • รายสัปดาห์ หมายความว่าเครื่องมือจะพยายามหมุนเวียนบันทึกเป็นรายสัปดาห์ ค่าที่เป็นไปได้อื่นๆ คือรายวันและรายเดือน
  • หมุน 3 บ่งชี้ว่าควรเก็บบันทึกที่หมุนแล้วเพียง 3 รายการเท่านั้น ดังนั้นไฟล์ที่เก่าที่สุดจะถูกลบออกในการรันครั้งต่อไปครั้งที่สี่
  • size=10M กำหนดขนาดขั้นต่ำสำหรับการหมุนที่จะเกิดขึ้นเป็น 10M กล่าวอีกนัยหนึ่ง แต่ละบันทึกจะไม่ถูกหมุนเวียนจนกว่าจะถึง 10MB
  • การบีบอัด และ delaycompress ใช้เพื่อบอกว่าบันทึกที่หมุนเวียนทั้งหมด ยกเว้นบันทึกล่าสุด ควรถูกบีบอัด

เรามาลองรันแบบแห้งเพื่อดูว่า logrotate จะทำอะไรหากถูกดำเนินการจริงตอนนี้ ใช้ตัวเลือก -d ตามด้วยไฟล์การกำหนดค่า (คุณสามารถเรียกใช้ logrotate ได้โดยละเว้นตัวเลือกนี้):

logrotate -d /etc/logrotate.d/apache2.conf

ผลลัพธ์แสดงไว้ด้านล่าง:

แทนที่จะบีบอัดบันทึก เราสามารถเปลี่ยนชื่อหลังวันที่ วันที่ เมื่อมีการหมุนเวียน ในการทำเช่นนั้น เราจะใช้คำสั่ง dateext หากรูปแบบวันที่ของเราเป็นอย่างอื่นที่ไม่ใช่ค่าเริ่มต้น yyyymmdd เราสามารถระบุได้โดยใช้ dateformat

โปรดทราบว่าเราสามารถป้องกันการหมุนเวียนได้หากบันทึกว่างเปล่าโดยมี notifempty นอกจากนี้ ให้เราแจ้งให้ logrotate ส่งบันทึกการหมุนเวียนไปยังผู้ดูแลระบบ ([email  ในกรณีนี้) เพื่อเป็นข้อมูลอ้างอิง (ซึ่งจะต้องมีการตั้งค่าเซิร์ฟเวอร์อีเมล ซึ่งก็คือ นอกขอบเขตของบทความนี้)

หากคุณต้องการรับอีเมลเกี่ยวกับ logrotate คุณสามารถตั้งค่าเซิร์ฟเวอร์อีเมล Postfix ดังที่แสดงไว้ที่นี่: ติดตั้งเซิร์ฟเวอร์อีเมล Postfix

ครั้งนี้เราจะใช้ /etc/logrotate.d/squid.conf เพื่อหมุนเฉพาะ /var/log/squid/access.log:

/var/log/squid/access.log {
    monthly
    create 0644 root root
    rotate 5
    size=1M
    dateext
    dateformat -%d%m%Y
    notifempty
    mail [email 
}

ดังที่เราเห็นในภาพด้านล่าง บันทึกนี้ไม่จำเป็นต้องหมุน อย่างไรก็ตาม เมื่อตรงตามเงื่อนไขขนาด (ขนาด=1M) บันทึกที่หมุนเวียนจะถูกเปลี่ยนชื่อเป็น access.log-25082020 (หากบันทึกถูกหมุนเวียนในวันที่ เดือนสิงหาคม วันที่ 25 กันยายน 2020) และบันทึกหลัก (access.log) จะถูกสร้างขึ้นใหม่โดยตั้งค่าสิทธิ์การเข้าถึงเป็น 0644 และด้วย root เป็นเจ้าของและเจ้าของกลุ่ม

สุดท้าย เมื่อจำนวนบันทึกถึง 6 ในที่สุด บันทึกที่เก่าที่สุดจะถูกส่งไปยัง [ป้องกันอีเมล]

ตอนนี้ สมมติว่าคุณต้องการเรียกใช้คำสั่งที่กำหนดเองเมื่อมีการหมุนเกิดขึ้น หากต้องการทำเช่นนั้น ให้วางบรรทัดที่มีคำสั่งดังกล่าวระหว่างคำสั่ง postrotate และ endscript

ตัวอย่างเช่น สมมติว่าเราต้องการส่งอีเมลไปที่รูทเมื่อบันทึกใดๆ ภายใน /var/log/myservice ได้รับการหมุนเวียน มาเพิ่มบรรทัดสีแดงใน /etc/logrotate.d/squid.conf:

/var/log/myservice/* {
	monthly
	create 0644 root root
	rotate 5
	size=1M
    	postrotate
   		echo "A rotation just took place." | mail root
    	endscript
}

สุดท้ายแต่ไม่ท้ายสุด สิ่งสำคัญที่ควรทราบคือตัวเลือกที่มีอยู่ใน /etc/logrotate.d/*.conf จะแทนที่ตัวเลือกในไฟล์การกำหนดค่าหลักในกรณีที่มีข้อขัดแย้ง

Logrotate และ Cron

ตามค่าเริ่มต้น การติดตั้ง logrotate จะสร้างไฟล์ crontab ภายใน /etc/cron.daily ชื่อ logrotate เช่นเดียวกับไฟล์ crontab อื่นๆ ภายในไดเร็กทอรีนี้ ไฟล์จะถูกดำเนินการทุกวันโดยเริ่มต้นเวลา 6:25 น. หากไม่ได้ติดตั้ง anacron

มิฉะนั้น การดำเนินการจะเริ่มประมาณ 7:35 น. หากต้องการยืนยัน ให้ดูบรรทัดที่มี cron.daily ใน /etc/crontab หรือ /etc/anacrontab

สรุป

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

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

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