perl anyevent socketモニタリングwebログclient
このスクリプトはclient側のcodeで、主にログの中のいくつかのキーワードを読み取るフィルタリングを実現し、以下にいくつかのモジュールの用途を紹介します.
File::Tailはログの読み取りに使用され、linuxのtailに似た機能を持ち、最新のログのみを読み込む
AnyEvent非同期イベントの処理
AnyEvent::Socket socket接続の確立
AnyEvent::Handle処理Socketのハンドル
Config::Tiny iniプロファイルの読み込み
以下はlog_grep.pmモジュール
プロファイルは次のとおりです.
File::Tailはログの読み取りに使用され、linuxのtailに似た機能を持ち、最新のログのみを読み込む
AnyEvent非同期イベントの処理
AnyEvent::Socket socket接続の確立
AnyEvent::Handle処理Socketのハンドル
Config::Tiny iniプロファイルの読み込み
#!/usr/bin/perl
#use warnings;
#use strict;
use File::Tail;
use AnyEvent;
use AnyEvent::Socket;
use AnyEvent::Handle;
use Config::Tiny;
use FindBin;
use lib "$FindBin::Bin/../module";
use log_grep;
main();
sub main {
my $client_config_file = "$FindBin::Bin/../etc/config.ini";
my $config = Config::Tiny->new;
my $client_config = $config->read($client_config_file);
my $client_log_info = $client_config->{'client_config_info'};
my $log_type = $client_log_info->{'log_type'};
my $user = $client_log_info->{'user'};
my $port = $client_log_info->{'port'};
my $log_path = $client_log_info->{'log_path'};
my $remove_ip = $client_log_info->{'remove_ip'};
my $local_ip = $client_log_info->{'local_ip'};
my $apache_reglar =
qr/^((?:\d{1,3}\.){3}\d{1,3})[^[]+\[([^]]+)\]\s+\"([^"]+)\"\s+(\d+).*\"([^"]+)\"$/;
my $nginx_reglar =
qr/^((?:\d{1,3}\.){3}\d{1,3})[^[]+\[([^]]+)\]\s+\"([^"]+)\"\s+(\d+).*\"([^"]+)\"$/;# ,
my $log_grep = log_grep->new();
my $cv = AnyEvent->condvar;
{
tcp_connect $remove_ip, $port, sub {
my ($fh) = @_
or die "tcp_connect: $!";
my $hdl = new AnyEvent::Handle fh => $fh;
my $file = File::Tail->new(
name => $log_path,
maxinterval => 1,
adjustafter => 3
);
while ( defined( my $log_line = $file->read ) ) {
if ( $log_line =~ $apache_reglar ) {
my $date = $log_grep->date_grep($2);
my @actions = $log_grep->default_grep($3);
my @clients = $log_grep->default_grep($5);
my $base =
"t:$log_type|me:$actions[1]|so:$1|lo:$local_ip|date:$date|opt:$actions[0]|of:$4|u:$user
";
$hdl->push_write($base);
}
}
}
}
$cv->recv;
}
以下はlog_grep.pmモジュール
package log_grep;
use strict;
use warnings;
sub new {
my $self = {};
my $class = shift;
bless $self;
return $self;
}
#date format
sub date_grep {
my $self = shift;
my $str = shift;
my %month = (
"Jan" => 1,
"Feb" => 2,
"Mar" => 3,
"Apr" => 4,
"May" => 5,
"Jun" => 6,
"Jul" => 7,
"Aug" => 8,
"Sep" => 9,
"Oct" => 10,
"Nov" => 11,
"Dec" => 12
);
my ( $day, $mon, $year, $hour, $minute, $sec ) =
( split /\/|:|\s+/, $str )[ 0, 1, 2, 3, 4, 5 ];
my $format_date = "$year-$month{$mon}-$day $hour:$minute:$sec";
return $format_date;
}
#default format
sub default_grep{
my $self =shift;
my $str = shift;
return split" ",$str;
}
1;
プロファイルは次のとおりです.
[client_config_info]
remove_ip=192.168.6.2
port=9981
local_ip=192.168.6.2
log_path=/var/log/httpd/access_log
log_type=Apache
user= 01
[server_config_info]
username=root
password=*******
host=localhost
database=w3a_system
server_ip=192.168.6.2
server_port=9981