Mais conteúdo relacionado Semelhante a Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon (20) Mais de Masahiro Nagano (20) Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon2. Me
• 長野雅広 Masahiro Nagano
• @kazeburo
• PAUSE: KAZEBURO
• Operations Engineer, Site Reliability
• LINE Corp.
Development support
on LINE Familly, livedoor
8. my $code = <<EOF;
sub {
my ($env,$res,$length,$reqtime,$time) = @_;
$time = time() if ! defined $time;
my @lt = localtime($time);;
my $t = sprintf '%02d/%s/%04d:%02d:%02d:%02d %s', $lt[3],
$abbr[$lt[4]], $lt[5]+1900, $lt[2], $lt[1], $lt[0], $tz;
q!! . ($env->{REMOTE_ADDR} || '-')
. q! ! . '-'
. q! ! . ($env->{REMOTE_USER} || '-')
. q! ! . "[" . $t . "]"
. q! "! . _safe($env->{REQUEST_METHOD}) . " " . _safe($env-
>{REQUEST_URI}) . " " . $env->{SERVER_PROTOCOL}
. q!" ! . $res->[0]
. q! ! . (defined $length ? $length : '-')
. q!!
}
EOF
12. my $log_handler = Apache::LogFormat::Compiler->new(
'%h %l %u %t "%r" %>s %b'
);
warn $log_handler->log_line($env,$res);
13. use Plack::Builder;
use Time::HiRes qw/gettimeofday tv_interval/;
use Apache::LogFormat::Compiler;
my $log_handler = Apache::LogFormat::Compiler->new(
'%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i" %D'
);
my $compile_log_app = builder {
enable sub {
my $app = shift;
sub {
my $env = shift;
my $t0 = [gettimeofday];
my $res = $app->();
my $reqtime = int(tv_interval($t0) * 1_000_000);
$env->{psgi.error}->print($log_handler->log_line(
$env,$res,6,$reqtime, $t0->[0]));
}
};
$app
};
45. my %char_handler = (
h = sub { $env-{REMOTE_ADDR} || '-' },
t = sub { [ . $strftime-('%d/%b/%Y:%H:%M:%S %z', localtime) . ] },
r = sub { _safe($env-{REQUEST_METHOD}) .
. _safe($env-{REQUEST_URI}) .
. $env-{SERVER_PROTOCOL} },
);
my $char_handler = sub {
my $char = shift;
exists $char_handler{$char}
? $char_handler{$char}-($char) : -;
};
$fmt =~ s!
(?:
%{(.+?)}([a-z]) |
%(?:[])?([a-zA-Z%])
)
! $1 ? $block_handler-($1, $2) : $char_handler-($3) !egx;
56. if ( $self-{format} eq 'common' ) {
$log_line = _string($env-{REMOTE_ADDR}) .
. '- '
. _string($env-{REMOTE_USER}) .
. q![!. $t . q!] !
. _safe(q!! . $env-{REQUEST_METHOD} .
. $env-{REQUEST_URI} .
. $env-{SERVER_PROTOCOL} . q! !)
. $res-[0] .
. (defined $length ? $length : '-');
} elsif ( $self-{format} eq 'ltsv' ) {
...
}
95. A few hours later,
Ops released
Apache::LogFormat::Compiler
(2013-03-01)
140. sub call {
my ($self,$env) = @_;
my $time = time(); #before app
my $res = $self-app-($env);
$self-log_line($env,$res,$length,$time);
}
sub call {
my ($self,$env) = @_;
my $res = $self-app-($env);
my $time = time(); #after app
$self-log_line($env,$res,$length,$time);
}
PM::AxsLog
PM::AccessLog