Check

apache logの統合

| | コメント(0) | トラックバック(0)

非連続的にバックアップしたログをひとつのファイルにしたい。
各ログファイルは期間的に重複している。
単純に全部まとめると300MBくらい。

use strict;
use warnings;

my %mons = (
'May' => '05',
'Jun' => '06',
'Jul' => '07',
'Aug' => '08',
'Sep' => '09',
);

my $DIR = 'hogehoge/hugahuga/';
my $ALL = $DIR.q[all.txt];

open( my $all_fh, '>', $ALL ) or die( $ALL, $! );
my %all_check;
my $trex = qr{ \[ (\d+) / (\w+) / (\d+) : ([\d:]+) \s+ \+ \d+ \] }mosix;
foreach my $base ( get_dirs( $DIR, sub { -d shift } ) ) {
my $dir = qq[$DIR$base/var/log/httpd/];
foreach my $file ( get_dirs( $dir, sub { ( shift ) =~ m{^access} } ) ) {
open( my $fh, qq[$dir$file] ) or die( qq[$dir$file], $! );
while ( !eof( $fh ) ) {
my $line = scalar <$fh>;
next if $all_check{$line}++;
print $all_fh $line;
}
close( $fh );
}
}
close( $all_fh );

sub get_dirs {
my $dir = shift;
my $yield = shift;
opendir( DIR, $dir ) or die( $dir, $! );
my @dirs = grep { &$yield( $_ ) } ( grep !m{^\.\.?$}, readdir( DIR ) );
closedir( DIR );
return @dirs;
}

まずこんな感じのコードにかける。
ちなみに、このとき使用メモリは最大140MBくらい。
結果出力したファイルは60MBくらいになった。
(291313行)

後は適当にソートしてひとつのファイルにしてanalyzerにかけておしまい。
hashにガンガン値を突っ込むからメモリ的にきついかと思ってたけど、
思ったより現実的な時間で終わった。
(実ファイルの二倍ちょいのメモリ使用量って結構少ない)

なんでfindとsortとuniq使わなかったんだろうねぇ。。。

トラックバック(0)

このブログ記事を参照しているブログ一覧: apache logの統合

このブログ記事に対するトラックバックURL: http://0-9.sakura.ne.jp/mt/mt-tb.cgi/122

コメントする