블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
Project 2008.03.26 19:47

[PERL] 급조 Access Log에서 검색 키워드만 뽑아서 샥샥샥...


 관리하고 있는 어느 사이트의 검색 기능을 손 봐야될 필요성이 있어서...

 일단은 어떤 걸로 검색되고 있는지 알아보려고 하던 차에...

 
사용자 삽입 이미지

떡밥 등장 : Apache Log


마침 #perl 방에서도 비슷한 떡밥이 돌아다니고 있었다.

사용자 삽입 이미지

Apache::ParseLog 쓸려고 했는데... L모님께서 "모듈씩이나..." 하는 바람에...


 싱싱하던 떡밥이 펄펄 날뛰고 있을 때 하려던 것이 시간이 지나고 지나고...
 
사용자 삽입 이미지

일단 access log는 뭐.. 이번달 분량만 해봤습니다.


 
use strict;
use warnings;
use Data::Dumper;
use Path::Class;

my $dir = Path::Class::dir("./");

my $data;
while(my $file = $dir->next) {
    next if $file->is_dir;
    next unless $file->basename =~ /^lighttpd/; # lighttpd.access_log.YYYY-mm-dd

    open my $fh, "<", $file or next;
    while(<$fh>) {
        if (/GET \/search\/\?(.*) HTTP\/1\.1/) { # 검색부분만 뽑아서
            my $url = $1;
            my @data = map { my @p = split /=/, $_; +{ name => $p[0], value => $p[1] } } split /\&/, $url;

            my $set;
            foreach my $blah (@data) {
                if ($blah->{name} eq 'keyword' && defined $blah->{value}) {
                    my $keyword = urldecode($blah->{value}); #URL_DECODE시키고...
                    $data->{$keyword}++;
                } # else blahblahblahblah... id 있음 뭐하고... 딴 거 있음 뭐하고...
            }
        }
    }
    print STDERR $file->basename." is white-catted\n";  #White-Catted 시켜서(의미없음)
}

foreach my $key (sort { $data->{$b} <=> $data->{$a} } keys %{ $data }) { # 정렬해서...
    print $key."\t".$data->{$key}."\n";   # 찍어바르기...
}

sub urldecode {
    my $value = shift;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
    $value;
}

이렇게 깨작거렸다. 결과는 제대로 나오는 데... 인코드를 보니까 BINARY로 되어있었지요.

아마 "binmode(STDOUT, ":utf8")" 을 넣으면 UTF-8으로 결과가 나올 겁니다.

걍 귀찮아서 셸에서 "nkf --utf-8 [FILE]" 해서 키워드 중에 일본어등을 보이게 해버렸습니다.

이런 거 하면서... 문제라고 느끼는 게 뭐냐면...

예전에 이런거 해놓고서는 스크립트 어디있는 지 까먹어서 다시 만들고 있다는 것입니다.

그래서 코드는 제대로 된 관리가 필요하다는 것을 새삼 깨닫고 있습니다. (그래봐야 나중에는 뭐...)
신고
TOTAL 473,374 TODAY 191

티스토리 툴바