<?php
/**
 
  USE :   php parseLogApacheError.php
  Makes : /tmp/errors404.inc.html
 
 
  [EN]
 
  Count the most frequent 404 errors on a web server.
 
  Makes an html file you can open or include into an admin.
 
  Apache logs aren't readable, so chmod them or use this as root.
 
  You may cron this script for about every 4 days.
 
  I use the previous logfile, so current logfile dans still be written by apache.
  So most likely, you'll see last week's errors.
 
 
 
 
  [FR]
 
  Regarde les erreurs 404 les plus frequentes sur ce serveur web.
 
  Cree un fichier html a regarder ou inclure dans une page de vision.
 
  Les logs apache sont pas accessibles de base. Chmodez-les, ou lancez ce script en Root
 
  Conseil: lancer le script tous les 2-4 jours par cron.
 
  J'ouvre le log précédent pour ne pas empecher d'écrire dedans celui en cours pdt le travail.
  Il s'agira donc, par exemple, des erreurs de la semaine derniere.
 
 
 
 
  GPL
  Salagir 2007
*/
 
define('DEBUG', false);
$log = '/var/log/apache/error.log.1';
 
if (DEBUG) {
	$debugfilesize = `wc -l $log`;
	$debugfilesize = (int) preg_replace('/ .*$/', '', $debugfilesize);
	$cpt=0;
}
 
$F = fopen($log, 'r');
 
if (!$F) die("Could not open error log.\n");
 
$erreurs = array();
 
while (!feof($F)) {
	// [Sun Sep 16 06:51:41 2007] [error] [client 83.203.233.241] File does not exist: /var/www/monsite.com/images/titre.jpg
	$l = fgets($F);
	if (preg_match('/File does not exist. (\S+)/', $l, $M)) {
		$k = str_replace('/var/www/', '', $M[1]);
		$erreurs[$k]++;
	}
	if (DEBUG) echo "Avancement: ".round(100*($cpt++)/$debugfilesize)."%     \r";
}
fclose($F);
 
arsort($erreurs);
 
$erreurs = array_slice($erreurs, 0, 50);
 
$F = fopen('/tmp/errors404.inc.html', 'w');
fwrite($F, "<table border>\n");
foreach($erreurs as $url => $nombre) {
	fwrite($F, "<tr><td>$nombre<td>$url</tr>\n");
}
fwrite($F, "<tr><td>...<td>...</tr></table>\n");
fclose($F);
 
if (DEBUG) echo "\nTerminé\n";
 
?>