เปลี่ยนล็อกไฟล์ให้เป็นบัฟเฟอร์แบบวงกลม


22

Folks มีวิธีการแก้ไข * nix ซึ่งจะทำให้ไฟล์บันทึกทำหน้าที่เป็นบัฟเฟอร์แบบวงกลมหรือไม่? ตัวอย่างเช่นฉันต้องการให้ไฟล์บันทึกเก็บข้อมูลสูงสุด 1Gb และยกเลิกรายการเก่าเมื่อถึงขีด จำกัด

เป็นไปได้หรือไม่? ฉันเชื่อว่าเพื่อให้บรรลุว่าไฟล์บันทึกควรเปลี่ยนเป็นอุปกรณ์พิเศษบางอย่าง ...

ป.ล. ฉันทราบเครื่องมือการล๊อคกิ้งไม่ตรงกับความต้องการของฉัน Logrotating ต้องการ IO มากมายโดยปกติแล้วจะเกิดขึ้นวันละครั้งในขณะที่ฉันต้องการโซลูชัน "runtime"


3
ฉันไม่แน่ใจว่าทำไมคุณคิดว่าการหมุนเวียนบันทึกต้องใช้ IO มากมาย การหมุน 10 logfiles คือ 10 การเปลี่ยนชื่อการดำเนินการและ HUP ของการบริการ ไม่ว่าการดำเนินการเกี่ยวกับการฆาตกรรม ... และมันเป็นวิธีมาตรฐานในการแก้ไขปัญหาของคุณ :)
pehrs

2
หนึ่งอาจใช้สคริปต์ / ปฏิบัติการซึ่งไม่ได้เล่นได้ดีกับ HUP
สกอตต์

1
นี่คือการใช้กรณีอื่นสำหรับคำถามของคุณ ฉันมีเครื่องเล่นเพลงปีศาจ ฉันต้องการบันทึกความยาวหลายบรรทัดดังนั้นฉันจึงสามารถเห็นสิ่งที่กำลังเล่นและสิ่งที่เล่นก่อนหน้านั้น tail -f somefileจะทำอย่างนั้น ฉันพยายามบันทึกที่หมุนแล้วและtail -fไม่สามารถใช้งานได้
Vorac

คำตอบ:


14

Linux มีบัฟเฟอร์วงแหวนเคอร์เนล คุณสามารถใช้dmesgในการแสดง

หรือนี่คือลินุกซ์เคอร์เนลโมดูลที่ดูเหมือนจะทำสิ่งที่คุณต้องการ

Emlog คืออะไร

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

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


1
ขอบคุณสำหรับลิงค์! BTW, emlog โฮมเพจมีลิงก์ไปยัง ulogbufd ซึ่งอาจเป็นวิธีที่เหมาะสมกว่าสำหรับฉัน
pachanga

emlogเคอร์เนลโมดูลจะยังคงอยู่ในขณะนี้บน GitHub: github.com/nicupavel/emlog
dbernard

4

สิ่งที่ฉันคิดได้ใกล้เคียงที่สุดคือ RRDTools แต่อาจไม่ใช่สิ่งที่คุณกำลังมองหา วิธีแก้ปัญหาอื่นก็คือการตรวจสอบไฟล์บันทึก (พูดทุกวินาทีหรือใน Linux ด้วย inotify) เช่นคุณเขียนสคริปต์เช่น:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

ด้วย inotify:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

+1 สำหรับการกล่าวถึง RRDtool ตัวอย่างจริงของการบันทึกโครงสร้างข้อมูลแหวน
คอรี J

ขอบคุณสำหรับตัวอย่างที่แสดงการใช้คำสั่ง inotifywait เชลล์
pachanga

4

คุณสามารถใช้Multilogจาก Daemontools ของ djb คุณท่อส่งออกบันทึกของคุณลงในมัน ใช่มันเป็นการหมุนการบันทึก แต่การหมุนเป็นเพียงแค่:

ln current $tai64nlocaltimestamp

ซึ่งในระบบไฟล์ linux ที่ทันสมัยเกือบทั้งหมดเป็นการดำเนินการที่รวดเร็วเป็นพิเศษ คุณสามารถระบุจำนวนไฟล์บันทึกที่คุณต้องการขนาดไฟล์ที่คุณต้องการ สร้างไฟล์ขนาด 10 x 1024mb และคุณจะมีบัฟเฟอร์วงแหวน 1gb ของคุณ

โปรดทราบว่าเนื่องจากการหมุนอัตโนมัติจึงเป็นแหล่งข้อมูลหนึ่งต่อหลายอินสแตนซ์ แต่คุณสามารถหลีกเลี่ยงสิ่งนั้นได้โดยเขียนเสื้อคลุมเรียบง่ายด้วย netcat หรือด้วยมือ


ขอบคุณสำหรับทิป! แน่นอนว่าฉันจะมีหลายคนเช่นกัน
pachanga

1

คุณสามารถสร้างไปป์ FIFO จากนั้นอ่านโดยใช้สคริปต์ที่แทรกไปยังฐานข้อมูล เมื่อตัวนับถึง 1,000 รีสตาร์ทหมายเลขรหัสที่ถูกแทรกลงในฐานข้อมูล จะไม่ทำงานกับขนาดของหลักสูตร แต่คุณใช้มันเป็นตัวอย่างดังนั้นฉันสมมติว่านี่เป็นคำถามเชิงทฤษฎี


1

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

  1. ส่วนหัวที่มีหมายเลขเวทย์มนตร์และ (สูงสุด) จำนวนรายการในรายการที่ใช้และรายการว่างหมายเลขลำดับสำหรับรายการประวัติถัดไปจำนวนรายการจริงในรายการที่ใช้จำนวนรายการจริงในรายการฟรี และความยาวของไฟล์ (แต่ละไฟล์มีขนาด 4 ไบต์)
  2. รายการที่ใช้แต่ละรายการให้การชดเชยและความยาว (4 ไบต์สำหรับแต่ละส่วนของแต่ละรายการ)
  3. รายการฟรีแต่ละรายการคล้ายกับรายการที่ใช้
  4. ข้อมูลหลักแต่ละเร็กคอร์ดประวัติประกอบด้วยชุดไบต์ต่อเนื่องที่ถูกยกเลิกโดยไบต์เทอร์มิเนเตอร์ null

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

รหัสประวัติรหัสหลักอยู่ในสองไฟล์, history.c และ history.h, สามารถหาได้จากแหล่งที่มาสำหรับโปรแกรม SQLCMD (เวอร์ชั่นของฉันไม่ใช่ Microsoft, รุ่นของฉันมีอยู่สิบปีหรือมากกว่าก่อนหน้า Microsoft) ซึ่งสามารถดาวน์โหลดได้จาก ของกลุ่มผู้ใช้อินเตอร์ Informix ซอฟท์แวเอกสารเก่า นอกจากนี้ยังมีโปรแกรมดัมพ์ไฟล์ประวัติ (histdump.c) และตัวทดสอบประวัติ (histtest.ec - มันอ้างว่าเป็น ESQL / C แต่ตัวมันเองเป็นรหัส C จริงๆหนึ่งในฟังก์ชั่นการสนับสนุนที่เรียกใช้ Informix ESQL / C บางอย่าง ฟังก์ชั่นห้องสมุด) ติดต่อฉันหากคุณต้องการทดสอบโดยไม่ใช้ Informix ESQL / C - ดูโปรไฟล์ของฉัน มีการเปลี่ยนแปลงเล็กน้อยที่จะทำให้คอมไพล์ฮิสท์เทสนอกสภาพแวดล้อมการออกแบบรวมถึงคุณต้องมี makefile


0

ฉันเห็นด้วยกับข้อคิดเห็นของ pehrs กับคำถามของคุณ การหมุนบันทึกไม่ยาก คุณสามารถตั้งค่า logrotate หรือสคริปต์อื่นเพื่อตรวจสอบไฟล์บันทึกเป็นระยะ ๆ ได้บ่อยเท่าที่ต้องการหากต้องการ เมื่อตรวจพบว่าไฟล์ของคุณมีขนาดถึง 1GB ระบบจะทำการเปลี่ยนชื่อซึ่งจะไม่ติด I / O ในระหว่างการเปลี่ยนชื่อกระบวนการยังคงเขียนไฟล์บันทึก ตัวหมุนบันทึกสามารถส่ง HUP ไปยัง syslog daemon ของคุณ (daemon ของคุณกำลังบันทึกผ่าน syslog ใช่ไหมถ้าไม่ควรสนับสนุนสัญญาณ HUP ถ้าเขียนดี ... ) เพื่อเปิดเส้นทางไฟล์ต้นฉบับใหม่อีกครั้ง . ณ จุดนี้มันจะเริ่มเขียนไฟล์ใหม่ที่เส้นทางเดิมและคุณสามารถลบเวอร์ชันที่หมุนได้

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