Logging to a DBI Database

Log directly to a DBI database without having to open a pipe and parse STDIN.

Configuration Entry

<Location /DBI_logged>
   PerlLogHandler Apache::LogDBI  
</Location>

Script III.6.2: Apache::LogDBI

 package Apache::LogDBI;
 # file: Apache/LogDBI.pm
 use Apache::Constants ':common';
 
 use strict 'vars';
 use vars qw($DB $STH);
 use DBI;
 use POSIX 'strftime';
 
 use constant DSN       => 'dbi:mysql:www';
 use constant DB_TABLE  => 'access_log';
 use constant DB_USER   => 'nobody';
 use constant DB_PASSWD => '';
 
 $DB = DBI->connect(DSN,DB_USER,DB_PASSWD) || die DBI->errstr;
 $STH = $DB->prepare("INSERT INTO ${\DB_TABLE} VALUES(?,?,?,?,?,?,?,?,?)") 
      || die $DB->errstr;
 
 sub handler {
     my $r = shift;
     my $date    = strftime('%Y-%m-%d %H:%M:%S',localtime);
     my $host    = $r->get_remote_host;
     my $method  = $r->method;
     my $url     = $r->uri;
     my $user    = $r->connection->user;
     my $referer = $r->header_in('Referer');
     my $browser = $r->header_in("User-agent");
     my $status  = $r->status;
     my $bytes   = $r->bytes_sent;
     $STH->execute($date,$host,$method,$url,$user,
                   $browser,$referer,$status,$bytes);
     return OK;
 }
 
 1;

<< Previous
Contents >> Next >>

Lincoln D. Stein, lstein@cshl.org
Cold Spring Harbor Laboratory
Last modified: Sun Aug 16 15:33:06 EDT 1998