NAME
    HTTPD::WatchLog - watching Apache AccessLog simply in realtime

SYNOPSIS
      use HTTPD::WatchLog;

      # ready..
      my $log = new HTTPD::WatchLog;

      $log->file('/usr/local/apache/logs/combined_log');
      $log->addr2host(1);    # convert ip address to hostname

      # set some options
      $log->quote(1);
      $log->ignore('localhost', '192.168.0.');
      $log->ignore('/cgi-bin/');
      $log->highlight('POST ');
      $log->highlight(' 404 ', ' 500 ');

      $log->pack(1);
      $log->width(100);
      $log->epoch2date(1);
      $log->fd($fh);

      # regist triggers
      $log->trigger( sub {
          my $line = shift;
          print STDERR "*** worm detected! \n" if $line =~ m|/root\.exe|;
        } );

      # go!
      $log->watch;

DESCRIPTION
    HTTPD::WatchLog is designed for watching Apache webserver's (or Squid's)
    AccessLog in realtime. This module provides unix command tail(1) like
    environment with more enhancement.

    At least on FreeBSD this doesn't work properly,

      shell> tail -F access_log | grep -v foo | grep -v bar | grep -v buz ...

    so I need other facile solutions.

METHOD
    new()

            Construct a object. Some values (provided as accessors)
            can be set here.

            my $log = HTTPD::WatchLog->new(
                file => '/usr/local/apache/logs/access_log',
                addr2host => 1,
              );

    file()

            File path of what you want to watch. The default path is
            '/usr/local/apache/logs/access_log'.

            $log->file('/var/httpd/logs/combined_log');

    addr2host()

            Turn on ip address to hostnam DNS lookup switch. boolean value.

            $log->addr2host(1);    # on
            $log->addr2host(0);    # off (default)

    quote()

            If true, meta characters in your regex patterns may be quoted
            using built-in quotemeta() function,

            $log->quote(1);   # on
            $log->quote(0);   # off (default)

            means these lines are ..

            $log->quote(0);
            $log->ignore('192\.168\.0\.');

            the same as below. You can set it when you don't want to put regex
            into 'ignore' or 'highlight' list.

            $log->quote(1);
            $log->ignore('192.168.0.');

    ignore()

            Set pattern(s) as scalar or array. The module ignores lines
            that cotains at least one of the pattern(s).

            $log->ignore( 'localhost', '192\.168\.0\.' );
            $log->ignore( 'Mon' );    # i hate monday of course .. ;-)

    highlight()

            Set pattern(s) as scalar or array. highlight()ed term is
            highlightly showed if you use proper terminal.

            $log->highlight( 'HEAD ', 'POST ' );
            $log->highlight( 'root\.exe' );

    trigger()

            Regist trigger subroutines as scalar or array.

            my $sub = sub {  ...  };
            my $sub2 = sub {  ...  };
            $log->trigger( $sub, $sub2 );

    pack()

            Pack MIME-encoded multibyte charactors to plain text. boolean value.

            $log->pack(1);    # on
            $log->pack(0);    # off (default)

    width()

            Truncate the tail of over lines of 'width' chars.
            This means you don't need to see folded lines.

            $log->width(80);    # showed only 80 chars from line head.
            $log->width(undef);    # off (default)

    epoch2date()

            Replace epoch-like digits to human-readable string. boolean value.
            This may be useful in squid log.

            e.g. 1068056885.612 -> 6 03:28:05

            $log->epoch2date(1);    # on
            $log->epoch2date(0);    # off (default)

    fh()

            Set filehandle object. 'STDOUT' is default.

            my $fh = new FileHandle $logfile, 'w';
            $log->fh($fh);

    watch()

            Now you can get it ! That's all.

            $log->watch;

DEPENDENCY
    File::Tail, Class::Accessor

AUTHOR
    Okamoto RYO <ryo@aquahill.net>

SEE ALSO
    perl(1), tail(1), File::Tail, Socket, Class::Accessor

