มันดีไหมถ้าใช้ tail -f กับไฟล์บันทึกขนาดใหญ่


9

ฉันต้องการตรวจสอบไฟล์บันทึกขนาดใหญ่ (ใกล้ถึง 1 GB) สำหรับข้อผิดพลาด ฉันต้องการให้สิ่งนี้ใกล้เคียงกับเวลาจริง (ล่าช้าไม่กี่วินาทีก็โอเค) tail -f | grepแผนของฉันคือการใช้งาน มีปัญหาเกี่ยวกับประสิทธิภาพการใช้วิธีการดังกล่าวเมื่อใช้มันเป็นเวลานานพูดจากศูนย์ไบต์ถึง 1 GB? มีวิธีปฏิบัติมาตรฐานใด ๆ ที่ใช้สำหรับการตรวจสอบดังกล่าวหรือไม่ โปรดทราบว่าฉันต้องการทำสิ่งนี้โดยใช้คำสั่ง unix มาตรฐานที่มีอยู่ใน Solaris 10

หากเป็นไปได้ไฟล์ของฉันจะเกลือกกลิ้งและฉันมีปัญหาอีกหนึ่งข้อในการคัดแยกออก :) using tail -F( --follow=name) ไม่ใช่ตัวเลือกสำหรับฉันเพราะ-Fไม่รองรับในเซิร์ฟเวอร์ฉันต้องการเปิดใช้งาน แผนของฉันคือการใช้สคริปต์ที่จะเริ่มต้นหางนี้และแบบสำรวจความคิดเห็นเพื่อค้นหาว่าไฟล์ถูกวางทับหรือไม่ ถ้าใช่ให้ฆ่าหางและเริ่มต้นใหม่ มีวิธีไหนที่ดีกว่านี้?


คุณหมายถึง "kill the tail" ใช่ไหม
Stéphane Gimenez

ใช่ "kill tail" ไม่พบ ขอบคุณแก้ไขคำถาม
Manoj NV

1
หากไฟล์ขนาด 2 GB ไม่มีอักขระบรรทัดใหม่หางจะทำงานอย่างไร

คำตอบ:


6

ในระบบ linux ของฉัน (GNU coreutils 8.12) ฉันสามารถตรวจสอบ (ใช้strace) ที่tail -f¹ใช้การlseekเรียกระบบเพื่อข้ามไฟล์ส่วนใหญ่ได้อย่างรวดเร็ว:

lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_END)                   = 194086
lseek(3, 188416, SEEK_SET)              = 188416

ซึ่งหมายความว่าขนาดของไฟล์ที่ถูกติดตามไม่ควรมีความสำคัญ

บางทีคุณสามารถตรวจสอบว่ามีการใช้งานในระบบของคุณหรือไม่ (เห็นได้ชัดว่ามันควรเป็นกรณีนี้)

-
1. ฉันยังพยายามปิดใช้งานการแจ้งเตือนการสนับสนุนด้วยเอกสารที่ไม่มีเอกสาร---disable-inotifyในกรณี


2
Real Men อ่านต้นฉบับ (:
Gilles 'SO- หยุดความชั่วร้าย'

2
@Gilles ฉันไม่สามารถสอน OP (หรือผู้อ่าน) วิธีอ่านแหล่งที่มาได้ถ้าเขายังไม่รู้ ง่ายกว่ามากที่จะบอกให้เขาใช้strace;)
Stéphane Gimenez

ที่จริงแล้วในระบบที่tail -Fไม่ได้รับการสนับสนุนโอกาสที่straceไม่สามารถใช้ได้ ...
Stéphane Gimenez

trussเป็นโปรแกรมอรรถประโยชน์ที่สอดคล้องกันบน Solaris
Gilles 'หยุดความชั่วร้าย'

และมันแสดงให้เห็นถึงการเรียกร้องที่คล้ายกัน llseek (0, 0, SEEK_CUR) = 0, llseek (0, 0xFFFFFFFFFFF5FFF6, SEEK_END) = 7923269
jlliagre

5

หากมีการเรียกใช้ไฟล์ปกติ (ซึ่งต่างจากไพพ์) ทั้ง GNU tail และ OpenBSD tail (เว้นแต่เรียกด้วย-n +N) จะค้นหาที่ส่วนท้ายของไฟล์จากนั้นทำงานย้อนกลับเพื่อค้นหาบรรทัดที่ควรเริ่มพิมพ์ ฉันไม่รู้ว่า Solaris ทำเช่นเดียวกันหรือไม่ แต่เป็นวิธีการที่สมเหตุสมผลดังนั้นฉันคาดหวังว่าผู้ปฏิบัติงานส่วนใหญ่จะทำเช่นเดียวกัน ดังนั้นขนาดของไฟล์จึงไม่เกี่ยวข้องกับประสิทธิภาพ


2

ฉันทำสิ่งนี้ทุกวัน tail -f logs/*.{log,err,out}ฉันมักจะสแกนโหลหรือเพื่อให้เข้าสู่ระบบการทดสอบและการผลิตเซิร์ฟเวอร์ของเราใช้ การโหลดครั้งแรกนั้นค่อนข้างมาก (ขึ้นอยู่กับจำนวนไฟล์ที่ถูกทำให้กลม) แต่หลังจากนั้นการสตรีมจะเป็นแบบเรียลไทม์

แทนที่จะส่งไปที่ grep ฉันใช้execฟังก์ชั่นในscreenเนื่องจากฉันต้องการเห็นผลลัพธ์ทั้งหมด (สำหรับการสืบค้นกลับเต็มรูปแบบและข้อความที่เกี่ยวข้องกับปัญหา) ตัวอย่างเช่น,

!:sed -n s/.*Exception.*/\007/p

เพื่อทำให้เครื่องส่งเสียงบี๊บ (หรือแฟลช) เมื่อใดก็ตามที่พบคำว่า Exception

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