Cronolog vs logrotate


คำตอบ:


14

จากประสบการณ์ของฉัน logrotate นั้นยอดเยี่ยม มันยืดหยุ่นมากและทำงานได้ดีกับซอฟต์แวร์ส่วนใหญ่

อย่างไรก็ตามมีปัญหาบางอย่างกับมันและเนื่องจาก cronolog เป็นหลักสิ่งอำนวยความสะดวกการหมุนบันทึกการใช้เว็บฉันจะเขียนประสบการณ์ของฉันกับ logrotate + apache ซึ่งเป็นปัญหา:

เมื่อหมุนบันทึกเราจะต้องแจ้งให้ apache ทราบว่ามีการหมุนบันทึกราวกับว่า logrotate เปลี่ยนชื่อ access.log เป็น access.log.1, apache จะเขียนไปยัง access.log.1 ต่อไปตามที่เขียนไปยัง inode และ การเปลี่ยนชื่อไฟล์ไม่มีผลกับหมายเลข inode

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

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

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

ข้อบกพร่อง logrotate / apache debian ที่เกี่ยวข้อง:

  1. Debian bug # 301702
  2. Debian bug # 400455

1
ทางออกสำหรับข้างต้นคือการใช้ตัดทอน! สิ่งที่ต้องทำคือการคัดลอกเนื้อหาของ access.log ไปยัง access.log.1 แล้วล้างข้อมูล access.log (ตามที่คุณเห็นส่วนที่เหลือของ inode ของ access_log ยังคงเหมือนเดิม) โดยปกติคุณจะไม่มีบันทึกที่ใหญ่กว่าสองสาม GB (ในกรณีที่เลวร้ายที่สุด) ดังนั้นกระบวนการทั้งหมดจะใช้เวลาไม่นาน!
Nikolaidis Fotis

3

ฉันชอบการเขียนเรียงความ แต่มันไม่ได้เป็นความพึงพอใจที่แข็งแกร่งจริงๆ

logrotate เริ่มจาก cron และหากระบบไม่ทำงานด้วยเหตุผลบางอย่างเมื่อการหมุนเกิดขึ้นไฟล์ล็อกของคุณจะไม่หมุน

ฉันยังต้องการให้ไฟล์บันทึกมีวันที่ (% Y% m.combined.access.log) ในชื่อเพราะฉันเก็บบันทึกเหล่านั้นไว้เป็นเวลานาน ในระบบส่วนใหญ่โดยค่าเริ่มต้น apache logrotate จะตั้งชื่อไฟล์ access.log, access.log.1 และอื่น ๆ อาจเป็นไปได้ที่จะใช้วันที่ใน logfiles กับ logrotate แต่ฉันไม่สามารถหาวิธีที่จะทำครั้งสุดท้ายที่ฉันดู


2
ปัญหาที่ logrotate ไม่ทำงานหากผ่านเวลา cron แล้วสามารถแก้ไขได้โดยการติดตั้งแพ็คเกจ "anacron"
andrewd18

หรือดียิ่งขึ้นคุณสามารถบันทึกบันทึกของคุณในรูปแบบที่ต้องการ - สิ่งนี้สามารถทำได้กับแม่แบบใน rsyslog - (% ปี% -% เดือน%% -% วัน% _lala.log) ในกรณีนี้คุณไม่ต้องหมุนบันทึกเพราะทุกวันมีการเปลี่ยนชื่อ!
Nikolaidis Fotis

2

เคยใช้ logrotate เท่านั้น มันเป็นสิ่งที่ Debian ใช้เป็นค่าเริ่มต้นและฉันไม่เคยมีข้อร้องเรียนใด ๆ


2

ฉันเกือบจะใช้เฉพาะในช่วง cronolog มาพร้อมกับ Debian และฉันอนุญาตให้มันทำงานต่อไปสำหรับบริการระบบเช่นบันทึกเซิร์ฟเวอร์อีเมล แต่สำหรับ Apache และไฟล์บันทึกก็ทั้งหมดlogrotatelogrotatelighttpdcronolog

หนึ่งในเหตุผลที่ฉันใช้cronologคือการกำหนดค่าทั้งหมดที่เกิดขึ้นในบรรทัดไฟล์บันทึกของการกำหนดค่าเว็บเซิร์ฟเวอร์

เช่นในlighttpdไฟล์ปรับแต่งคุณสามารถใส่:

accesslog.filename = "|/usr/bin/cronolog --symlink=/var/log/webs/access.log /var/log/webs/%Y/%W-access.log"

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

accesslog.filename = "|/usr/bin/cronolog --symlink=/var/log/webs/access.log /var/log/webs/%Y/%m/%a-access.log"

และรับไฟล์บันทึกที่แสดงปริมาณการใช้งานในแต่ละวัน เช่นทุกวันอาทิตย์ทุกวันอังคาร

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


1
ที่ดูเหมือน svlogd (ของ runit และ daemontools lineage)
Tobu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.