hlog
changeset 12 066e61c3785b
parent 11 b43a7dc491c2
child 16 ce482bda336e
child 18 1cbbf08157ba
--- a/hlog	Wed Jan 28 20:29:46 2009 +0100
+++ b/hlog	Wed Jan 28 20:56:13 2009 +0100
@@ -29,7 +29,7 @@
 my $opt_port  = 8080;
 my $opt_lines = 10;
 my $logfile   = "hlog.log";
-my $FILE;
+my %FILE;
 
 sub handle_request($);
 sub date1123(;$);
@@ -49,7 +49,15 @@
     open(LOG, ">>$logfile");
     print LOG localtime() . " started\n";
 
-    $FILE = shift or pod2usage();
+    pod2usage() if not @ARGV;
+
+    foreach (@ARGV) {
+        $_ = "default=$_" if not /=/ or /^\//;
+        my ($tag, $file) = split /=/, $_, 2;
+        die "tag $tag already exists with file $FILE{$tag}\n"
+          if exists $FILE{$tag};
+        $FILE{$tag} = $file;
+    }
 
     my $listener = new IO::Socket::INET(
         LocalAddr => $opt_addr,
@@ -60,16 +68,16 @@
     ) or die "Can't create listener socket: $!\n";
 
     $SIG{CHLD} = sub {
-	while ((my $pid = waitpid(-1, WNOHANG)) > 0) { 
-	    print LOG localtime() . " child $pid died\n";
-	}
+        while ((my $pid = waitpid(-1, WNOHANG)) > 0) {
+            print LOG localtime() . " child $pid died\n";
+        }
     };
 
     warn "listener $$ $opt_addr:$opt_port\n";
 
     while (1) {
-	my $client = $listener->accept;
-	next if not defined $client;	# may be because of signal
+        my $client = $listener->accept;
+        next if not defined $client;    # may be because of signal
 
         print LOG $_ =
             localtime()
@@ -82,7 +90,7 @@
         my $pid = fork();
         die "Can't fork: $!\n" if not defined $pid;
         if ($pid == 0) {
-	    $SIG{CHLD} = "DEFAULT";
+            $SIG{CHLD} = "DEFAULT";
             $listener->close;
             handle_request($client);
             exit 0;
@@ -107,16 +115,23 @@
         $client->print(http "400 Bad Request" => bad_request);
     }
 
-    my $lines = /(\d+)$/ ? $1 : $opt_lines;
+    # number of lines and tag to show
+    my $lines = (s/(\d+)$//    ? $1 : $opt_lines);
+    my $tag   = (s/^\/*(\w+)// ? $1 : "default");
 
     # read the header(s) and discard
     while (<$client>) { last if /^\s*$/ }
 
-    # number of lines to show
+    if (not exists $FILE{$tag}) {
+        $client->print(http "500 unknown file tag",
+            "Sorry, unknown file tag \"$tag\"");
+        print LOG " unknown tag $tag";
+        return;
+    }
 
-    my %file = analyze($FILE);
+    my %file = analyze($FILE{$tag});
     if (!%file) {
-        $client->print(http "500 internal error");
+        $client->print(http "500 internal error", "internal error");
         print LOG $@;
         return;
     }
@@ -214,6 +229,7 @@
 =head1 SYNOPSIS
     
     hlog [-p|--port port] [-a|--address address] [--lines n] file
+    hlog [-p|--port port] [-a|--address address] [--lines n] tag=file ...
     hlog [-h|--help] [-m|--man]
 
 =head1 DESCRIPTION
@@ -239,4 +255,19 @@
 
 =back
 
+=head1 EXAMPLES
+
+Using tags makes it possible to access more then one log file
+via the same running instance by specifying the tag in the URL.
+
+Once started as:
+
+    hlog error=/var/log/apache/error.log access=/var/log/apache/access.log
+
+The following URLs are valid:
+
+    http://<server>:8080/error
+    http://<server>:8080/access?10
+
+
 =cut