Tệp nhật ký đuôi trên nhiều máy qua ssh


37

Tôi đang cố gắng để tailmột tệp nhật ký trên nhiều máy từ xa và chuyển tiếp đầu ra đến máy trạm cục bộ của tôi. Tôi muốn đóng kết nối khi nhấn Ctrl- C.

Hiện tại tôi có chức năng sau gần như hoạt động như dự định.

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
}

Các kết nối đóng và tôi nhận được đầu ra từ tail. NHƯNG, có một số loại bộ đệm đang diễn ra bởi vì đầu ra đến theo đợt.

Và đây là phần thú vị

Tôi có thể thấy hành vi đệm tương tự khi thực hiện các thao tác sau và nối "kiểm tra" vào tệp /var/log/server.logtrên các máy từ xa 4-5 lần.

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

Mạnh mẽ và tìm thấy hai cách để vô hiệu hóa nó

  1. Thêm cờ -t vào ssh.

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. Xóa trích dẫn từ lệnh từ xa.

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

Tuy nhiên, cả hai cách tiếp cận này đều không hoạt động đối với chức năng thực thi trên nhiều máy được đề cập ở trên.

Tôi đã thử dsh, có hành vi đệm giống nhau khi thực thi.

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

Tương tự ở đây, nếu tôi loại bỏ trích dẫn, bộ đệm sẽ biến mất và mọi thứ hoạt động tốt.

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

Cũng đã thử parallel-sshmà hoạt động chính xác như dsh. Ai đó có thể giải thích những gì đang xảy ra ở đây?

Làm sao để giải quyết vấn đề này? Sẽ là lý tưởng để đi thẳng sshnếu có thể.

PS Tôi không muốn sử dụng multitailhoặc tương tự vì tôi muốn có thể thực thi các lệnh tùy ý.


Bạn có thể kiểm tra dbitailvà tải về từ đây .

Câu trả lời:


36

Những gì bạn thấy là hiệu ứng của bộ đệm tiêu chuẩn tiêu chuẩn grepđược cung cấp bởi Glibc. Giải pháp tốt nhất là vô hiệu hóa nó bằng cách sử dụng --line-buffered(GNU grep, tôi không chắc những triển khai nào khác có thể hỗ trợ nó hoặc một cái gì đó tương tự).

Về lý do tại sao điều này chỉ xảy ra trong một số trường hợp:

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

chạy toàn bộ lệnh trong dấu ngoặc kép trên máy chủ - do đó grepchờ để điền vào bộ đệm của nó.

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

chạy greptrên máy cục bộ của bạn trên đầu ra tailđược gửi qua kênh ssh.

Phần quan trọng ở đây là, grepđiều chỉnh hành vi của nó tùy thuộc vào việc nó có phải stdinlà thiết bị đầu cuối hay không. Khi bạn chạy ssh -t, lệnh từ xa đang chạy với một thiết bị đầu cuối điều khiển và do đó, điều khiển từ xa grephoạt động giống như thiết bị cục bộ của bạn.


Cảm ơn rất nhiều cho lời giải thích chi tiết. Nó có ý nghĩa với tôi bây giờ và kịch bản hoạt động như mong đợi với - line-buffered.
Deephacks

@deephacks Trong trường hợp đó, vui lòng xem xét chấp nhận câu trả lời - nó đưa ra manh mối cho những người khác có cùng vấn đề.
peterph

1
Bộ đệm của grep / glibc phụ thuộc vào thiết bị xuất chuẩn của nó . ssh tail | grepđầu ra cho thiết bị đầu cuối địa phương, không có bộ đệm. ssh -t "tail|grep"đầu ra cho một pty, không có bộ đệm. ssh "tail|grep"đầu ra cho một đường ống (đến sshd), được đệm (trừ khi --line-buffered).
dave_thndry_085

2

kiểm tra này multitail

MultiTail cho phép bạn giám sát logfiles và lệnh đầu ra trong nhiều cửa sổ trong một thiết bị đầu cuối, tô màu, lọc và hợp nhất.

Để theo dõi nhật ký trong nhiều máy chủ, hãy sử dụng:

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

3
Nhưng nó không cho phép bạn làm điều đó qua ssh, đó là một điều kiện của câu hỏi này. (Và, đồng thời, câu hỏi đặc biệt nói "không muốn sử dụng đa nhiệm".)
giám mục

1
@bishop: Tôi nghĩ rằng sự chỉ trích này là không công bằng một phần bởi vì trong khi câu hỏi có thể đã quy định không sử dụng đa nhiệm, thì dường như là do hiểu lầm. Ví dụ trên cho thấy cách sử dụng các lệnh tùy ý và mở rộng shell thông thường cũng hoạt động - multitail <(ssh …) <(ssh …)- cho phép kết quả mong muốn ngay cả khi đó không phải là cách ban đầu họ nghĩ câu hỏi có thể được trả lời.
Chris Adams

0

Bạn có thể kiểm tra trong nhật ký của bên.

Một công cụ Java do tôi tạo, có thể đọc các tệp nhật ký cục bộ và ở xa bằng SSH. Nó khá đơn giản để sử dụng.

Một số giải thích thêm: https://github.com/pschweitz/insidelog/wiki

Chỉ cần tải xuống phiên bản tương ứng với hệ điều hành của bạn, của bản phát hành jar gốc có thể thực thi được trong Thời gian chạy Java của bạn (yêu cầu java 8_40 trở lên):

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

Bạn có thể tìm thấy một tài liệu hoàn chỉnh (cũng được nhúng trong và trong trang của Github)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.