<?php
 
/*
 
+----------------------------------------------+
 
|                                              |
 
|         PHP apache log parser class          |
 
|                                              |
 
+----------------------------------------------+
 
| Filename   : apache-log-parser.php           |
 
| Created    : 21-Sep-05 23:28 GMT             |
 
| Created By : Sam Clarke                      |
 
| Email      : [email protected]   |
 
| Version    : 1.0                             |
 
|                                              |
 
+----------------------------------------------+
 
 
 
LICENSE
 
 
This program is free software; you can redistribute it and/or
 
modify it under the terms of the GNU General Public License (GPL)
 
as published by the Free Software Foundation; either version 2
 
of the License, or (at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
 
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
GNU General Public License for more details.
 
 
To read the license please visit http://www.gnu.org/copyleft/gpl.html
 
 
*/
 
 
class apache_log_parser
 
{
 
 
  var $bad_rows; // Number of bad rows
 
  var $fp; // File pointer
 
 
  function format_log_line($line)
 
  {
 
    preg_match("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $line, $matches); // pattern to format the line
 
    return $matches;
 
  }
 
 
  function format_line($line)
 
  {
 
    $logs = $this->format_log_line($line); // format the line
 
 
    if (isset($logs[0])) // check that it formated OK
 
    {
 
      $formated_log = array(); // make an array to store the lin info in
 
      $formated_log['ip'] = $logs[1];
 
      $formated_log['identity'] = $logs[2];
 
      $formated_log['user'] = $logs[2];
 
      $formated_log['date'] = $logs[4];
 
      $formated_log['time'] = $logs[5];
 
      $formated_log['timezone'] = $logs[6];
 
      $formated_log['method'] = $logs[7];
 
      $formated_log['path'] = $logs[8];
 
      $formated_log['protocal'] = $logs[9];
 
      $formated_log['status'] = $logs[10];
 
      $formated_log['bytes'] = $logs[11];
 
      $formated_log['referer'] = $logs[12];
 
      $formated_log['agent'] = $logs[13];
 
      return $formated_log; // return the array of info
 
    }
 
    else
 
    {
 
      $this->badRows++; // if the row is not in the right format add it to the bad rows
 
      return false;
 
    }
 
  }
 
 
  function open_log_file($file_name)
 
  {
 
    $this->fp = fopen($file_name, 'r'); // open the file
 
    if (!$this->fp)
 
    {
 
      return false; // return false on fail
 
    }
 
    return true; // return true on sucsess
 
  }
 
 
  function close_log_file()
 
  {
 
    return fclose($this->fp); // close the file
 
  }
 
 
  // gets a line from the log file
 
  function get_line()
 
  {
 
    if (feof($this->fp))
 
    {
 
       return false;
 
    }
 
    $bits='';
 
    // I find for loops much much faster
 
    for (;!feof($this->fp) && $bits != "\n";)
 
    {
 
      $bits .= fread($this->fp, 1);
 
    }
 
    return rtrim($bits, "\n");
 
  }
 
 
}
 
?>
 
 |