OSDN Git Service

add missing log_die method for Keitairc::Log
[keitairc/keitairc.git] / lib / Keitairc / Log.pm
index cd8fade..c82ae29 100644 (file)
@@ -7,9 +7,7 @@
 
 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;
 
@@ -17,13 +15,16 @@ sub new {
        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 {
@@ -31,28 +32,77 @@ 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;