คงขนาดของไฟล์บันทึกไว้โดยไม่ต้องมี logrotate


13

มีวิธีใดบ้างในการรักษาขนาดไฟล์ล็อกไฟล์ให้คงที่โดยไม่ต้องหมุนโดยใช้ไฟล์เปล่าใหม่และลบ (หรือเก็บถาวร) ไฟล์เก่า ตัวอย่างเช่นถ้าฉันตั้งค่าขนาดสูงสุดของไฟล์บันทึกเป็น 1MB หลังจากที่ขนาดไฟล์เพิ่มขึ้นเกินขีด จำกัด นั้นจะถูก จำกัด โดยอัตโนมัติข้อความจะถูกเพิ่มที่ 'หาง' และส่วนที่เก่าแก่ที่สุดของข้อความจะปรากฏขึ้นเพื่อให้ขนาดไฟล์ 1MB .


ใช้ logrotate ดังนั้นrm -f *.tar.gz.*
Marco Ceppi

1
มีเหตุผลใดที่ทำให้คุณไม่ต้องการหมุนเวียนบันทึกหรือใช้ logrotate? สิ่งที่คุณต้องการจะเกิดขึ้น? เก็บบันทึกเก่าที่ 1M และเริ่มใหม่หรือไม่ คำถามเริ่มต้นของคุณไม่เข้ากันได้กับตอนจบ
David Thornley

สิ่งที่โผล่ออกมาหมายความว่าอย่างไร
tshepang

คำตอบ:


4

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

จากman tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

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

0

ทางออกเดียวของคุณอาจจะเขียนระบบไฟล์ userspace ของคุณเองหรือมีส่วนร่วมกับระบบที่มีอยู่ ดูรายการบางส่วนที่ระบบไฟล์ใน Userspace

หากคุณไม่มีทักษะในการสนับสนุนให้เสนอโครงการหรือ $$$ หรือทั้งสองอย่างเพื่อเพิ่มให้กับคุณ

ฉันหวังว่าฉันจะมีเวลาที่จะทำมันฉันต้องการบางสิ่งเช่นนี้เสมอ


0

คุณสามารถทำสิ่งที่คล้ายกันโดยใช้ FIFO ซึ่งเป็นไฟล์ขนาดศูนย์ไบต์

อย่างไรก็ตามโปรดทราบว่าหากไม่มีสิ่งใดที่กำลังอ่านจากไฟล์นี้กระบวนการ syslog อาจถูกบล็อกและจะหยุดเขียนลงใน logfiles ทั้งหมดของคุณ ฉันไม่แน่ใจว่าพฤติกรรมนี้เปลี่ยนไปกับ Ubuntu / CentOS เวอร์ชั่นใหม่กว่านี้หรือไม่

ตัวอย่างหนึ่งที่นี่

อีกตัวอย่างลองแบบนี้

สร้าง FIFO ของคุณ:

sudo mkfifo /var/log/everything.fifo

และเพิ่มไปยัง (r) syslog.conf จากนั้นเริ่ม syslog ใหม่:

*.*     |/var/log/everything.fifo

จากนั้นดู FIFO จากหน้าต่างเดียว:

cat /var/log/everything.fifo

และในหน้าต่างอื่นส่งบางสิ่งไปยัง syslog:

logger Test1
logger Test2
logger Test3

คุณควรเห็นบรรทัด "Test *" ในเอาต์พุตcatด้านบน

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

grep -vi "kernel: .* on wan" /var/log/everything.fifo

0

นี่คือคำตอบที่สองของฉัน นี่มันช่างแฮก

ใช้ watch (1) เพื่อดำเนินการซ้ำ ๆtail --bytes=1024(1024 ไบต์สุดท้ายของ logfile ขอบคุณ @jjclarkson สำหรับคำตอบนั้น)

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

จากนั้นดูไฟล์ด้วย:

less --raw-control-chars /tmp/messages.watch

ความแตกต่างระหว่างwatchและขณะที่ลูปคือwatchจะอัพเดต /tmp/messages.watch เท่านั้นหากมีการเปลี่ยนแปลงเป็น / var / log / ข้อความ

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

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


0
 * พรุน - ตัดส่วนบนของรายการไฟล์ที่อธิบายไว้ใน
 * ไฟล์ / etc / default / พรุน ออกแบบมาให้ทำงานเป็นระยะ
 * จาก cron ความคิดคือการตัดทอนบันทึกโดยอัตโนมัติ
 * ไฟล์ที่เติบโตตลอดไป ไฟล์นี้มีรายการ
 ไฟล์ * (ชื่อพา ธ เต็ม) และจำนวนบล็อกที่
 * ควรเก็บไว้ เพื่อรักษาสติให้ดี
 * คลิปไฟล์หลังจากขึ้นบรรทัดใหม่ถัดไป ไฟล์
 * / etc / default / พรุนควรมีลักษณะดังนี้:
 * * * *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / ข้อความ 200
 * / usr / adm / sup_log 5
 * * * *
 * รายการ crontab บน infoswx สำหรับลูกพรุนดูเหมือนว่า:
 * * * *
 * 0 5 * * * / etc / พรุน> /usr/adm/prune.log 2> & 1
 * * * *
 * คอมไพล์ด้วย: cc -O -o พรุนพรุน
 * * * *
 * คำจำกัดความต่อไปนี้อาจปรับให้เหมาะกับรสนิยมของคุณ
 * และขนาดบล็อกระบบของคุณ
 * * * *
 * Ray Davis infoswx! bees 09/25/85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=en&ie=UTF-8&q=prune+log+file&pli=1

daemons (ส่วนใหญ่? ทั้งหมด?) จำนวนมากจะเปิดล็อกไฟล์อีกครั้งหากส่งสัญญาณ HUP (เช่นงาน cron เดียวกันกับที่รันลูกพรุน)


0

ฉันแน่ใจว่าผู้โพสต์ดั้งเดิมได้พบวิธีการแก้ปัญหาหลังจาก 8 ปี นี่คืออีกหนึ่งสำหรับคนอื่น ๆ ที่อาจอ่านหัวข้อนี้ ...

curtail จำกัด ขนาดของเอาต์พุตของโปรแกรมและเก็บรักษาเอาต์พุต 200MB สุดท้ายด้วยคำสั่งต่อไปนี้:

run_program | curtail -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

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