package Keitairc::Log;
use Keitairc::Config;
-use Keitairc::Log::Syslog;
-use Keitairc::Log::File;
-use Keitairc::Log::Stdio;
+use POSIX qw(strftime locale_h);
use strict;
use warnings;
my ($proto, $arg) = @_;
my $me = {};
+ bless $me;
+
if (defined $arg->{config}) {
$me->config($arg->{config});
} else {
+ require Keitairc::Log::Stdio;
$me->{writer} = new Keitairc::Log::Stdio();
}
- bless $me;
+ return $me;
}
sub config {
$me->{Config} = $cf;
($me->{type}, undef) = split(':', $me->{Config}->log(), 2);
+ my $fallback = 0;
if ($me->{type} =~ /^syslog$/i) {
- $me->{writer} = new Keitairc::Log::Syslog({config => $me->{Config}});
- } elsif ($me->{type} =~ /^file$/i ) {
+ if (eval "use Sys::Syslog") {
+ require Keitairc::Log::Syslog;
+ $me->{writer} = new Keitairc::Log::Syslog({config => $me->{Config}});
+ } else {
+ # force fallback to file writer
+ $me->{type} = 'file';
+ $fallback = 1;
+ }
+ }
+
+ if ($me->{type} =~ /^file$/i ) {
+ require Keitairc::Log::File;
$me->{writer} = new Keitairc::Log::File({config => $me->{Config}});
+ } else {
+ require Keitairc::Log::Stdio;
+ $me->{writer} = new Keitairc::Log::Stdio({config => $me->{Config}}) if (!defined $me->{writer} || !$me->{writer});
+ }
+ if ($fallback) {
+ $me->log_error('Sys::Syslog is missing, fallback to file log writer');
+ }
+}
+
+sub log_access {
+ my ($me, $ip, $request, $response) = @_;
+ my $old_locate = setlocale(LC_TIME);
+ setlocale(LC_TIME, 'POSIX');
+ $me->{writer}->log_access(sprintf('%s %s %s [%s] "%s" %s %s "%s" "%s"',
+ $ip || '-',
+ '-',
+ $request->header('Remote-User') || '-',
+ strftime('%d/%b/%Y:%T %z', localtime()),
+ $request->method() . ' ' . $request->uri() || '-',
+ $response->code,
+ length($response->content),
+ $request->header('referer') || '-',
+ $request->header('User-Agent') || '-'));
+ setlocale(LC_TIME, $old_locate);
+}
+
+sub _format {
+ my ($me, $m) = @_;
+ if (!defined $me->{type} || $me->{type} !~ /^syslog$/i) {
+ my $old_locate = setlocale(LC_TIME);
+ setlocale(LC_TIME, 'POSIX');
+ $m = strftime('%b %d %T ', localtime()) . $m;
+ setlocale(LC_TIME, $old_locate);
}
- $me->{writer} = new Keitairc::Log::Stdio({config => $me->{Config}}) if (!defined $me->{writer} || !$me->{writer});
+ return $m;
}
sub log {
my ($me, $m) = @_;
- $me->{writer}->log_info($m);
+ $me->{writer}->log_info($me->_format($m));
}
-sub log_die {
+sub log_error {
my ($me, $m) = @_;
- $me->{writer}->log_error($m);
- exit 1;
+ $me->{writer}->log_error($me->_format($m));
}
-sub log_debug{
+sub log_debug {
+ my ($me, $m) = @_;
+ $me->{writer}->log_debug($me->_format($m));
+}
+
+sub log_die {
my ($me, $m) = @_;
- $me->{writer}->log_debug($m);
+ $me->log_error($m);
+ die;
}
1;