SSH를 통해 여러 시스템의 테일 로그 파일 보기

SSH를 통해 여러 시스템의 테일 로그 파일 보기

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.

multitailPS 임의의 명령을 실행할 수 있기를 원하기 때문에 또는 이와 유사한 것을 사용하고 싶지 않습니다 .

답변1

grep여러분이 보고 있는 것은 Glibc에서 제공하는 표준 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로컬 명령처럼 작동합니다.

답변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를 사용하여 로컬 및 원격 로그 파일을 읽을 수 있는 Java 도구를 만들었습니다. 사용하는 것은 매우 간단합니다.

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

운영 체제에 해당하는 버전, Java 런타임에서 실행 가능한 기본 jar 버전을 다운로드하세요(Java 8_40 이상 필요).

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

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

관련 정보