@luzlunz - C,Perl 엔지니어. 근래엔 Ops에 더 가까운 DevOps. PostgreSQL 성능 최적화의 공동 역자, luzluna at gmail.com
실시간으로 로그를 분석하는 프로그램을 만들다보면 마지막으로 본 로그 위치에서부터 로그를 다시 분석하고 싶을 때가 많습니다. 요구사항은 간단한데 막상 해보려면 꽤 귀찮고 어려운 문제에 직면합니다. 이럴 때엔 CPAN의 Logfile::Tail 모듈을 사용하면 쉽게 처리할 수 있습니다.
필요한 모듈은 다음과 같습니다. 다른 모듈과 의존성이 없는 아주 간단한 모듈인 것이 장점입니다.
직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.
$ sudo cpan Logfile::Tail
사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.
$ cpan Logfile::Tail
사용할 메소드는 다음과 같습니다.
new()
: 파일의 경로를 파라미터로 받아서 tail을 준비합니다.getline()
: 마지막 읽었던 라인에서부터 한줄씩 읽어들입니다.사용하는 예제는 다음과 같습니다.
#!/usr/bin/env perl use strict; use warnings; use Logfile::Tail; while (1) { my $file=Logfile::Tail->new( "./test.log" ); # # 로그 처리전 시간을 기억해둡니다. # my $start_time = time; my $cnt = 0; # # 한줄씩 로그를 처리합니다. 파일의 끝에 도달하면 끝납니다. # while ( defined( my $tmp = $file->getline ) ) { $cnt++; } $file->close(); # # 로그처리에 걸린 시간을 계산합니다. # my $end_time = time; my $duration = $end_time - $start_time; print "duration: $duration ($cnt lines)\n"; # # 10초 간격으로 처리하기 위해 기다릴 시간을 계산합니다. # my $sleep_delay = 10 - $duration; if ( $sleep_delay > 0 ) { sleep( $sleep_delay ); } else { print "processing time exceed: $sleep_delay\n" } }
실행결과는 다음과 같습니다.
[test@cent5 ~]$ ./tail.pl duration: 0 (16887 lines) duration: 0 (16903 lines) duration: 0 (16916 lines) ^C [test@cent5 ~]$ sleep 10 [test@cent5 ~]$ ./tail.pl duration: 0 (33870 lines) duration: 0 (16929 lines) ...
Ctrl+C
를 누른 후 다시 실행시켰을 때 마지막 처리했던 곳에서부터
이어서 다시 진행을 한다는 사실을 확인할 수 있습니다. :-)
로그를 실시간으로 처리하려면 꽤 복잡하고 어려운 플랫폼을
필요로 할 수도 있지만, 그냥 간단한 처리만을 원할 때에는
tail.pl
로 얻은 정보를 시간 단위로 처리해 원하는 결과를 얻을 수도 있습니다.
Logfile::Tail 모듈을 이용하면 프로그램을 실행해 놓지않고
그냥 crontab에 등록해서 주기적으로 처리하는 것도 가능합니다.
특별한 것은 아니지만 누군가에게 긴요하게 쓰였으면 좋겠네요! ;-)
EOT
X-mas tree
& Llama
ASCII Art by ASCII Art Farts.
Computer ASCII Art by Chris.com.
Font ASCII Art by TAAG.
Artwork by
Inkyung Park
& Keedi Kim.
Designed by
Hojung Youn
& Keedi Kim.
Articles by
Seoul Perl Mongers.
Edited by
Luzluna Park
& Keedi Kim.
Hosting generously sponsored by
Yuni Kim.
Sponsored by
SILEX.
.-''' __ __ / \/ \/ \ =-_- | \. -____- / \ // /|| '' //| //|| == = == ==