home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / X11R6 / lib / X11 / procmeter / logtail next >
Text File  |  1998-10-13  |  4KB  |  133 lines

  1. #!/usr/bin/perl
  2. # copyright: Joey Hess 1997 GPL.
  3.  
  4. die q{
  5. Logtail watches one or more log files, and makes procmeter display graphs of
  6. how many lines are added to each file.
  7.  
  8. Syntax:
  9.     logtail filespec , [filespec , ... ] fifo
  10.  
  11.     fifo      Basename of the fifo file to use to communicate with
  12.               procmeter. The fifo.dat and fifo.def files will be created 
  13.               on the fly.
  14.     filespec  Specifies a file to watch and options for this file.
  15.  
  16. Filespec Format:
  17.  
  18.     file=f units=u size=s pattern=p average=n rotate=[yes|no]
  19.  
  20.     file      Watch the file specified. A required part of each
  21.               filespec. This item is required.
  22.     units     The units to use (default: "lines")
  23.     size      How many lines in this file it takes to make one 
  24.               line on the graph (default: 1)
  25.     name      Name of this item on the graph (default: basename of file)
  26.     pattern   Pattern that the line must match to be counted. See perlre(1).
  27.               (default: none specified, which matches everything)
  28.               Note that if pattern contains a () grouping, then the
  29.               value of that grouping is used for the value of the line.
  30.               Useful for doing something like displayng stats on how many K
  31.               are being transfered from your web server.
  32.     rotate    If "yes", try to figure out when the file is rotated, and
  33.               recover from that condition. (default: yes)
  34.  
  35. Example:
  36.     logtail file=/var/log/httpd/access_log units=hits size=10 , \
  37.         file=/var/log/messages rotate=yes size=2 \
  38.         /tmp/logfifo
  39.  
  40. } unless @ARGV;
  41.  
  42. $fifo_basename=pop(@ARGV);
  43. $fifo="$fifo_basename.dat";
  44. system 'mkfifo',$fifo; # perl has no mkfifo command.
  45.  
  46. open (DEF,">$fifo_basename.def") ||
  47.     die "open $fifo.def failed: $!\n";
  48. my %filespec;
  49. my $spec_counter=0;
  50. foreach $word (@ARGV) {
  51.     if ($word eq ',') {
  52.         SaveFileSpec(%filespec);
  53.         undef %filespec;
  54.     }
  55.     elsif ($word=~/(.*?)=(.*)/ ne undef) {
  56.         $filespec{$1}=$2;
  57.     }
  58.     else {
  59.         die "Unknown item found in filespec: $word\n";
  60.     }
  61. }
  62. SaveFileSpec(%filespec);
  63. undef %filespec;
  64. close DEF;
  65.  
  66. # Saves a filespec into global data hashes.
  67. sub SaveFileSpec { my %filespec=@_;
  68.     my $filespec=$spec_counter++;
  69.     if (!$filespec{file}) {
  70.         die "Filespec does not contain file name.\n";
  71.     }
  72.  
  73.     if (!$filespec{size}) {
  74.         $filespec{size}=1;
  75.     }
  76.     if (!$filespec{name}) {
  77.         ($filespec{name})=$filespec{file}=~m:.*/(.*?)$:;
  78.     }    
  79.     if (!$filespec{units}) {
  80.         $filespec{units}='lines';
  81.     }
  82.     if ($filespec{pattern}) {
  83.         $log_pattern{$filespec}=$filespec{pattern};
  84.     }
  85.     open ($filespec,"<$filespec{file}")
  86.         || die "open $filespec{file} failed: $!\n";
  87.     seek($filespec,0,2); # seek to eof.
  88.     $log_counter{$filespec}=0;
  89.     $log_filesize{$filespec}=-s $filspec{name};
  90.     $log_filename{$filespec}=$filespec{file};
  91.     print DEF "$filespec{name} $filespec{units} " .
  92.         $filespec{size} . "\n";
  93.     if ($filespec{rotate} eq 'yes') {
  94.         $rotate_protect{$filespec}=1;
  95.     }
  96. }
  97.  
  98. for (;;) {
  99.     foreach $filespec (keys %log_counter) {
  100.         if ($rotate_protect && -r $log_filename{$filespec}) {
  101.             if (-s $log_filename{$filespec} < $log_filesize{$filespec}) {
  102.                 # File size has decreased, assume the file has been
  103.                 # rotated on us.
  104.                 close $filespec;
  105.                 open ($filespec,"<$log_filename{$filespec}");
  106.                 seek($filespec,0,2); # seek to eof.
  107.             }
  108.             $log_filesize{$filespec}=-s $log_filename{$filespec};
  109.         }
  110.         while (!eof($filespec)) {
  111.             $_=<$filespec>;
  112.             if (! $log_pattern{$filespec} || 
  113.                 m/$log_pattern{$filespec}/ ne undef) {
  114.                 if ($1) {
  115.                     $log_counter{$filespec} += $1;
  116.                 }
  117.                 else {
  118.                     $log_counter{$filespec} += 1;
  119.                 }
  120.             }
  121.         }
  122.     }
  123.  
  124.     open (OUT,">$fifo") || die;
  125.     foreach $filespec (keys %log_counter) {
  126.         print OUT "$log_counter{$filespec}\n";
  127.         $log_counter{$filespec}=0;
  128.     }
  129.     close OUT;
  130.  
  131.     select(undef,undef,undef,0.25); # why is this needed?
  132. }
  133.