stas        2002/08/30 11:08:12

  Modified:    src/docs/2.0/user/handlers handlers.pod
  Log:
  a PerlLogHandler example
  
  Revision  Changes    Path
  1.18      +84 -1     modperl-docs/src/docs/2.0/user/handlers/handlers.pod
  
  Index: handlers.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/handlers/handlers.pod,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- handlers.pod      30 Aug 2002 17:24:49 -0000      1.17
  +++ handlers.pod      30 Aug 2002 18:08:12 -0000      1.18
  @@ -894,6 +894,9 @@
     --------------------------
     package MyApache::TimeReset;
     
  +  use strict;
  +  use warnings;
  +  
     use Apache::RequestRec ();
     
     use Apache::Const -compile => 'OK';
  @@ -1051,6 +1054,9 @@
     --------------------------
     package MyApache::SendEmail;
     
  +  use strict;
  +  use warnings;
  +  
     use Apache::RequestRec ();
     use Apache::RequestIO ();
     use Apache::RequestUtil ();
  @@ -1278,6 +1284,9 @@
     --------------------------
     package MyApache::BlockByIP;
     
  +  use strict;
  +  use warnings;
  +  
     use Apache::RequestRec ();
     use Apache::Connection ();
     
  @@ -1586,6 +1595,9 @@
     --------------------------------
     package MyApache::FileExtDispatch;
     
  +  use strict;
  +  use warnings;
  +  
     use Apache::Const -compile => 'OK';
     
     use constant HANDLER  => 0;
  @@ -1714,6 +1726,9 @@
     ------------------------
     package MyApache::Deparse;
     
  +  use strict;
  +  use warnings;
  +  
     use Apache::RequestRec ();
     use Apache::RequestIO ();
     use B::Deparse ();
  @@ -1771,7 +1786,75 @@
   The handler's configuration scope is
   C<L<DIR|docs::2.0::user::config::config/item_DIR>>.
   
  -Example:
  +Imagine a situation where you have to log requests into individual
  +files, one per user. Assuming that all requests start with
  +I</users/username/>, so it's easy to categorize requests by the second
  +URI path component. Here is the log handler that does that:
  +
  +  file:MyApache/LogPerUser.pm
  +  ---------------------------
  +  package MyApache::LogPerUser;
  +  
  +  use strict;
  +  use warnings;
  +  
  +  use Apache::RequestRec ();
  +  use Apache::Connection ();
  +  use Fcntl qw(:flock);
  +  
  +  use Apache::Const -compile => qw(OK DECLINED);
  +  
  +  sub handler {
  +      my $r = shift;
  +  
  +      my($username) = $r->uri =~ m|^/users/([^/]+)|;
  +      return Apache::DECLINED unless defined $username;
  +  
  +      my $entry = sprintf qq(%s [%s] "%s" %d %d\n),
  +          $r->connection->remote_ip, scalar(localtime),
  +          $r->uri, $r->status, $r->bytes_sent;
  +  
  +      my $log_path = Apache::server_root_relative($r->pool, 
  +          "logs/$username.log");
  +      open my $fh, ">>$log_path" or die "can't open $log_path: $!";
  +      flock $fh, LOCK_EX;
  +      print $fh $entry;
  +      close $fh;
  +  
  +      return Apache::OK;
  +  }
  +  1;
  +
  +First the handler tries to figure out what username the request is
  +issued for, if it fails to match the URI, it simply returns
  +C<Apache::DECLINED>, letting other log handlers to do the
  +logging. Though it could return C<Apache::OK> since all other log
  +handlers will be run anyway.
  +
  +Next it builds the log entry, similar to the default I<access_log>
  +entry. It's comprised of remote IP, the current time, the uri, the
  +return status and how many bytes were sent to the client as a response
  +body.
  +
  +Finally the handler appends this entry to the log file for the user
  +the request was issued for. Usually it's safe to append short strings
  +to the file without being afraid of messing up the file, when two
  +files attempt to write at the same time, but just to be on the safe
  +side the handler exclusively locks the file before performing the
  +writing.
  +
  +To configure the handler simply enable the module with the
  +C<PerlLogHandler> directive, inside the wanted section, which was
  +I</users/> in our example:
  +
  +  <Location /users/>
  +      SetHandler perl-script
  +      PerlResponseHandler ModPerl::Registry
  +      PerlLogHandler MyApache::LogPerUser
  +      Options +ExecCGI
  +  </Location>
  +
  +
   
   =head2 PerlCleanupHandler
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to