Tail log file ในหลายเครื่องผ่าน ssh


36

ฉันกำลังพยายามtailล็อกไฟล์บนเครื่องระยะไกลหลายเครื่องและส่งต่อผลลัพธ์ไปยังเวิร์กสเตชันท้องถิ่นของฉัน ฉันต้องการการเชื่อมต่อกับใกล้ชิดเมื่อมีการกด-CtrlC

ตอนนี้ฉันมีฟังก์ชั่นต่อไปนี้ซึ่งเกือบจะทำงานได้ตามที่ตั้งใจไว้

function dogfight_tail() {
 logfile=/var/log/server.log
 pids=""
 for box in 02 03; do
   ssh server-$box tail -f $logfile | grep $1 &
   pids="$pids $!"
 done
 trap 'kill -9 $pids' SIGINT
 trap  wait
}

tailการเชื่อมต่อปิดและฉันได้รับผลลัพธ์จาก แต่มีการบัฟเฟอร์บางชนิดเกิดขึ้นเนื่องจากเอาต์พุตมีแบตช์

และนี่คือส่วนที่สนุก ...

ฉันสามารถเห็นพฤติกรรมการบัฟเฟอร์เดียวกันเมื่อดำเนินการต่อไปนี้และผนวก "ทดสอบ" ไปยังไฟล์/var/log/server.logบนเครื่องระยะไกล 4-5 ครั้ง ...

ssh server-01 "tail -f /var/log/server.log | grep test"

... และพบวิธีปิดใช้งานสองวิธี ...

  1. เพิ่มแฟล็ก -t ไปยัง ssh

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. ลบอัญประกาศจากคำสั่งระยะไกล

    ssh server-01 tail -f /var/log/server.log | grep test

อย่างไรก็ตามวิธีการเหล่านี้ไม่สามารถใช้งานได้กับฟังก์ชั่นที่ทำงานบนเครื่องหลายเครื่องที่กล่าวมาข้างต้น

ฉันได้ลองใช้ dsh ซึ่งมีพฤติกรรมการบัฟเฟอร์เหมือนกันเมื่อทำการดำเนินการ

dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"

กันที่นี่ถ้าฉันลบใบเสนอราคาบัฟเฟอร์หายไปและทุกอย่างทำงานได้ดี

dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test

ยังพยายามใช้parallel-sshงานได้เหมือนกันdshทุกประการ ใครสามารถอธิบายสิ่งที่เกิดขึ้นที่นี่

ฉันจะแก้ไขปัญหานี้ได้อย่างไร คงจะเหมาะsshถ้าไปทางตรงถ้าเป็นไปได้

PS ฉันไม่ต้องการที่จะใช้multitailหรือคล้ายกันเพราะฉันต้องการที่จะสามารถรันคำสั่งโดยพลการ


คุณสามารถชำระเงินdbitailและดาวน์โหลดได้จากที่นี่

คำตอบ:


36

สิ่งที่คุณเห็นคือผลกระทบของบัฟเฟอร์ stdout มาตรฐานที่grepจัดให้โดย Glibc ทางออกที่ดีที่สุดคือการปิดการใช้งานโดยใช้--line-buffered(grep GNU ฉันไม่แน่ใจว่าการใช้งานอื่น ๆ อาจสนับสนุนหรือสิ่งที่คล้ายกัน)

ด้วยเหตุนี้เกิดขึ้นเฉพาะในบางกรณี:

ssh server "tail -f /var/log/server.log | grep test"

รันคำสั่งทั้งหมดในเครื่องหมายคำพูดบนเซิร์ฟเวอร์ - จึงgrepรอให้บัฟเฟอร์เต็ม

ssh server tail -f /var/log/server.log | grep test

รันgrepบนเครื่องโลคัลของคุณบนเอาต์พุตที่tailส่งผ่านช่องสัญญาณ ssh

ส่วนสำคัญที่นี่คือที่grepปรับพฤติกรรมของมันขึ้นอยู่กับว่ามันstdinเป็นขั้วหรือไม่ เมื่อคุณรันssh -tคำสั่งรีโมตจะรันด้วยเทอร์มินัลการควบคุมและทำให้รีโมตgrepทำงานเหมือนกับโลคัลโลคัลของคุณ


ขอบคุณมากสำหรับคำอธิบายโดยละเอียด มันสมเหตุสมผลสำหรับฉันตอนนี้และสคริปต์ทำงานตามที่คาดไว้ด้วย --line-buffered
deephacks

@deephacks ในกรณีนั้นโปรดพิจารณายอมรับคำตอบ - มันให้เบาะแสกับคนอื่น ๆ ที่มีปัญหาเดียวกัน
เตอร์

1
บัฟเฟอร์ grep / glibc ขึ้นอยู่กับมันstdout ssh tail | grepเอาต์พุตไปยังโลคัลเทอร์มินัล ssh -t "tail|grep"ส่งออกไปยัง pty unbuffered ssh "tail|grep"เอาต์พุตไปยังไพพ์ (ถึงsshd), บัฟเฟอร์ (ยกเว้น--line-buffered)
dave_thompson_085

2

ลองดู: multitail

MultiTail ช่วยให้คุณสามารถตรวจสอบ logfiles และเอาท์พุทคำสั่งในหลาย windows ใน terminal, colorize, filter และ merge

หากต้องการปรับแต่งบันทึกในเซิร์ฟเวอร์หลายเครื่องให้ใช้:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'

3
แต่มันไม่อนุญาตให้คุณทำผ่าน ssh ซึ่งเป็นเงื่อนไขของคำถามนี้ (และยังคำถามโดยเฉพาะบอกว่า "ไม่ต้องการที่จะใช้ multitail".)
บิชอป

1
@ บิชอป: ฉันคิดว่าการวิจารณ์นี้ไม่เป็นธรรมเพราะในขณะที่คำถามอาจระบุว่าไม่ได้ใช้ multitail แต่ดูเหมือนว่าเกิดจากความเข้าใจผิด ตัวอย่างข้างต้นแสดงวิธีใช้คำสั่งโดยพลการและการขยายเชลล์ปกติยังทำงานได้multitail <(ssh …) <(ssh …)- ช่วยให้ได้ผลลัพธ์ตามที่ต้องการแม้ว่าจะไม่ใช่วิธีที่พวกเขาคิดว่าในตอนแรกสามารถตอบคำถามได้
Chris Adams

0

คุณสามารถชำระเงินในบันทึกด้านข้าง

เครื่องมือ Java ที่ฉันสร้างสามารถอ่านไฟล์โลคัลและรีโมตโดยใช้ SSH มันค่อนข้างใช้งานง่าย

คำอธิบายเพิ่มเติมบางส่วน: https://github.com/pschweitz/insidelog/wiki

เพียงดาวน์โหลดเวอร์ชันที่สอดคล้องกับระบบปฏิบัติการของคุณจาก native jar release ที่สามารถใช้งานได้ภายใน Java Runtime ของคุณ (ต้องใช้ java 8_40 หรือสูงกว่า):

https://github.com/pschweitz/insidelog/releases

คุณสามารถค้นหาเอกสารที่สมบูรณ์ (ฝังและในหน้า Github ด้วย)

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