효율적인 로그 보기 환경

효율적인 로그 보기 환경

tail -f현재 로그 보기에 사용하고 있습니다 .

로그를 보는 더 효율적이고 읽기 쉽고 더 나은 방법이 있습니까?

답변1

예! perl옹호하다실용적인 추출 및 연구 언어.

다음과 같은 구문을 사용하는 대신 shell:

tail -f file | grep --line-buffered someting

또는

tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'

(참고: --line-bufferedin grep과 같은 -uin 은 sed방지하는 데 유용합니다.고정 크기 블록으로 버퍼링)

로그 보기/탐색의 perl경우그만큼언어.

에 따라당신이 무엇을 기다리고 있는지 ...당신의 필요에 정확히 일치하기 위해 작은 스크립트를 작성해야 할 수도 있습니다.

Perlfaq에서 사용 가능한 샘플을 찾을 수 있습니다 perldoc perlfaq5(또는 man perlfaq5설치하지 않은 경우 perldoc). 질문이 있습니다.Perl에서 "tail -f"를 어떻게 수행합니까?내가 이것을 찍은 곳 :

첫 시도

seek(GWFILE, 0, 1);

이 명령문은 seek(GWFILE, 0, 1)현재 위치를 변경하지 않지만 핸들의 파일 끝 조건을 지우므로 다음 명령은 <GWFILE>Perl이 무언가를 다시 읽으려고 시도하게 합니다.

그래도 작동하지 않으면(stdio 구현의 기능에 따라 다름) 다음과 같은 것이 더 필요합니다.

for (;;) {
    for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
      # search for some stuff and put it into files
    }
    # sleep for a while
    seek(GWFILE, $curpos, 0);  # seek to where we had been
  }

나는 특별한 경우를 발생시키기 위해 이미 이것을 여러 번 사용했습니다.

데모

샘플의 경우quick and dirty 실시간 로그 카운터시도 해봐! (;-에 대한 읽기 액세스가 필요함 /var/log/syslog) :

#!/usr/bin/perl -w
my %counter;

open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );

for ( ; ; ) {
    for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
        $counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
    }
    syswrite STDOUT, sprintf "\r%s\e[K",
      join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
    select undef,undef,undef,1;
    seek( FH, $curpos, 0 );
}

본 모든 내용을 포함하여 매초 자체 새로 고침되는 한 줄을 생성합니다.악마의 이름과 각각의 카운터:

smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1

답변2

F. Hauri가 제안한 것처럼 Perl을 사용하여 출력 형식을 지정할 수 있습니다.

~/.bashrc사용을 위해 Glassfish의 로그를 읽기 위해 tail에 대한 별칭을 만들었습니다 . 매우 간단하며(한 줄) 출력에 색상을 지정하여 오류/경고 줄에 밑줄을 긋습니다.

tail-color() {
    tail $* | perl -p -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;' -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' -e 's/(.*SEVERE.*)/\033[33;41;1m$1\033[0m\007/g'
}
  1. -p: 스크립트를 루프 안에 래핑하고 처리된 행을 출력합니다.
  2. -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'"WARN"이 포함된 모든 줄에 색상을 지정합니다.
    • \033[이스케이프 시퀀스 시작(형식 활성화)
    • 31빨간색 전경을 의미합니다.
    • 43노란색 배경을 의미합니다.
    • 1굵은 문자를 활성화합니다.
    • m이스케이프 시퀀스를 닫습니다
    • $1입력 라인을 포함합니다
    • \033[0m라인이 출력된 후 기본 형식을 다시 표준으로 설정하는 두 번째 시퀀스입니다.
    • \007경고음
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'"ERROR"를 포함하는 모든 줄에 색상을 지정합니다. 유일한 차이점은 색상에 관한 것입니다.
    • 31노란색 전경을 의미합니다.
    • 43빨간색 배경을 의미합니다.

내 경우에는 시각적 벨을 켜서 오류 발생 시 화면이 깜박이고 스피커에서 신호음이 울리지 않으며 오류/경고 줄을 매우 빠르게 감지할 수 있습니다.

다음에 대한 자세한 정보를 얻을 수 있습니다.

다시 말하지만, F. Hauri가 그의 답변에서 설명했듯이 Perl 덕분에 많은 일을 할 수 있으므로 필요에 따라 자신만의 로그 리더를 "개발"할 수 있습니다.

관련 정보