다섯째 날: use Logfile::Tail;

저자

@luzlunz - C,Perl 엔지니어. 근래엔 Ops에 더 가까운 DevOps. PostgreSQL 성능 최적화의 공동 역자, luzluna at gmail.com

시작하며

실시간으로 로그를 분석하는 프로그램을 만들다보면 마지막으로 본 로그 위치에서부터 로그를 다시 분석하고 싶을 때가 많습니다. 요구사항은 간단한데 막상 해보려면 꽤 귀찮고 어려운 문제에 직면합니다. 이럴 때엔 CPAN의 Logfile::Tail 모듈을 사용하면 쉽게 처리할 수 있습니다.

준비물

필요한 모듈은 다음과 같습니다. 다른 모듈과 의존성이 없는 아주 간단한 모듈인 것이 장점입니다.

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Logfile::Tail

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Logfile::Tail

사용 방법

사용할 메소드는 다음과 같습니다.

사용하는 예제는 다음과 같습니다.

#!/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

blog comments powered by Disqus