ssh를 통해 여러 시스템의 테일 로그 파일


36

tail여러 원격 컴퓨터에서 로그 파일을 작성 하려고 하고 출력을 로컬 워크 스테이션으로 전달 하려고합니다 . Ctrl-를 누를 때 연결을 닫고 싶습니다 C.

현재 나는 거의 의도 된대로 작동 하는 다음 기능을 가지고 있습니다 .

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있으며 원격 시스템 의 파일 에 "test"를 4-5 번 추가합니다…

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

… 해제하는 두 가지 방법을 찾았습니다…

  1. ssh에 -t 플래그를 추가하십시오.

    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가능하면 똑바로가는 것이 이상적입니다 .

추신 : 나는 multitail임의의 명령을 실행할 수 있기를 원하기 때문에 사용 하거나 유사한 것을 원하지 않습니다 .


여기서 확인 dbitail하고 다운로드 할 수 있습니다 .

답변:


36

grepGlibc 에서 제공 하는 표준 stdout 버퍼의 효과입니다 . 가장 좋은 해결책은 --line-buffered(GNU grep, 다른 구현이 그것을 지원할 수 있는지 확실하지 않습니다.)

에 관해서는 이는 경우에 발생합니다

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

서버에서 따옴표로 전체 명령을 실행하여 grep버퍼를 채울 때까지 기다립니다.

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

ssh 채널을 통해 전송 grep된 출력에서 ​​로컬 시스템에서 실행됩니다 tail.

여기서 중요한 부분 은 터미널 grep인지 아닌지에 따라 동작 을 조정하는 것 stdin입니다. 를 실행 ssh -t하면 원격 명령이 제어 터미널과 함께 실행되므로 원격 grep은 로컬 명령 처럼 작동합니다.


자세한 설명을 주셔서 감사합니다. 그것은 나에게 의미가 있으며 스크립트는 --line-buffered와 함께 예상대로 작동합니다.
deephacks

@deephacks이 경우 답을 받아들이십시오. 같은 문제를 겪고있는 다른 사람들에게 실마리가됩니다.
peterph

1
grep / glibc의 버퍼링은 stdout에 따라 다릅니다 . ssh tail | grep버퍼링되지 않은 로컬 터미널로 출력합니다. ssh -t "tail|grep"버퍼되지 않은 pty로 출력합니다. ssh "tail|grep"파이프로 출력 (to sshd), 버퍼링 (없는 경우 --line-buffered).
dave_thompson_085

2

이것 좀 봐: multitail

MultiTail을 사용하면 터미널의 여러 창에서 로그 파일과 명령 출력을 모니터링하고 색상을 지정하고 필터링하고 병합 할 수 있습니다.

여러 서버에서 로그를 테일링하려면 다음을 사용하십시오.

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

3
그러나이 질문의 조건 인 ssh를 통해 수행 할 수는 없습니다. (또한, 질문은 구체적으로 "멀티 테일을 사용하고 싶지 않다"고 말합니다.)
주교

1
@ 비숍 : 나는이 비판이 불공평하다고 생각합니다. 왜냐하면 질문에 멀티 테일을 사용하지 않았을 수도 있지만 오해로 인한 것 같습니다. 위의 예는 임의의 명령을 사용하는 방법을 보여 주며 일반적인 셸 확장도 작동합니다. — multitail <(ssh …) <(ssh …)원래 질문에 대한 답변이 아니라고 생각하더라도 원하는 결과를 얻을 수 있습니다.
크리스 아담스

0

당신은 로그에서 체크 아웃 할 수 있습니다.

SSH를 사용하여 로컬 및 원격 로그 파일을 읽을 수있는 Java 도구입니다. 사용이 매우 간단합니다.

몇 가지 추가 설명 : https://github.com/pschweitz/insidelog/wiki

Java 런타임 내에서 기본 jar 릴리스 실행 파일의 운영 체제에 해당하는 버전을 다운로드하십시오 (java 8_40 이상 필요).

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

전체 문서를 찾을 수 있습니다 (Github 페이지에 포함되어 있음)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.