Générer un log au format apache pour faire des statistiques personnalisées

Contenu du snippet

Ce script permet de générer, à la demande, des fichiers logs au format Apache.

Vous pouvez ainsi générer des logs qui ne sont pas encombrés par les images, feuilles CSS, et requête en Ajax.
Ou pour avoir des stats dédiées à des noms de domaines, pages ou rubriques particulières.

Çà pourra être utile pour les sites en hébergement mutualisé qui n'ont pas toujours de stats, ou qui ont un seul log pour tous les noms de domaines.

Je m'en sert aussi pour avoir des logs séparés entre mes pages Web, les pages pour mobile, les flux RSS, et les pages d'erreur 404, etc.

PARAMETRES:

Le paramètre "logFileName" du nom de fichier pour le log, peut utiliser les codes magiques de strftime(), plus le code %Host pour insérer le nom de domaine de la requête.

Le dossier du paramètre "logsFolder" doit avoir un CHMOD 777.

CONSEIL:

Utiliser ob_start(), et appeler le script à la fin pour obtenir les infos de trafic.

RAPPEL DE SéCURITé:

Un pirate peut essayer d'injecter du code Javascript ou PHP dans son user-agent ou référent. Ce script ne neutralise pas, volontairement*, les données récupérées. FAITES ATTENTION à la façon dont vous affichez le contenu du log...
(*) comportement identique à Apache.

Source / Exemple :


/* EXEMPLE */
ob_start("ob_gzhandler");

...

YMA_LogVisit('%Host-%Y-%m.log','./logs/',200);
ob_end_flush();

/* SOURCE */
function YMA_LogVisit($logFileName='%Host-%Y-%m.log',$logsFolder='./logs/',$responseHTTP='200')
	{
	$now = time();
	$output = '';
	
	$loggedData['IP'] = trim($_SERVER['REMOTE_ADDR']);
	
	$remoteAddr = gethostbyaddr($loggedData['IP']);
	// Parfois, il y a des caractères spéciaux, notamment NUL
	$remoteAddr = trim($remoteAddr,"\x00..\x1F");
	if (strlen($remoteAddr) > 120)
		{
		// Présence probable de caractères NUL
		$loggedData['REMOTE_ADDR'] = $loggedData['IP'];
		}
	else
		{
		$loggedData['REMOTE_ADDR'] = $remoteAddr;
		}
	$output .= $loggedData['REMOTE_ADDR'];
	
	$loggedData['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
	if ($loggedData['HTTP_HOST'] == '') $loggedData['HTTP_HOST'] = strtolower($_SERVER["SERVER_NAME"]);
	$output .= ' '.$loggedData['HTTP_HOST'];
	
	$loggedData['TIMESTAMP'] = $now;
	// Decalage horaire en seconde
	$decalage = date('Z',$now);
	// En heures et minutes
	$decheure = abs(ceil($decalage / 3600));
	$decminute =  abs(ceil(abs($decalage) / 60)-($decheure * 60));
	// En heures avec 2 décimales, et signé
	$decalagehoraire = sprintf('%02d',$decheure).sprintf('%02d',$decminute);
	if ($decalage >= 0)
		{
		$decalagehoraire = '+'.$decalagehoraire;
		}
	else
		{
		$decalagehoraire = '-'.$decalagehoraire;
		}
	$output .= ' - ['.gmdate('d/M/Y:H:i:s',$now).' '.$decalagehoraire.']';
	
	$loggedData['REQUEST_METHOD'] = $_SERVER['REQUEST_METHOD'];
	$loggedData['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
	$loggedData['SERVER_PROTOCOL'] = $_SERVER['SERVER_PROTOCOL'];
	$output .= ' "'.$loggedData['REQUEST_METHOD'].' '.$loggedData['REQUEST_URI'].' '.$loggedData['SERVER_PROTOCOL'].'"';
	
	$output .= ' '.$responseHTTP;
	
	if (ob_get_length() !== FALSE)
		{
		$loggedData['CONTENT_LENGTH'] = ob_get_length();
		$output .= ' '.$loggedData['CONTENT_LENGTH'];
		}
	else
		{
		$output .= ' -';
		}
		
	$loggedData['HTTP_REFERER'] = $_SERVER['HTTP_REFERER'];
	if ($loggedData['HTTP_REFERER'] != '')
		{
		$output .= ' "'.$loggedData['HTTP_REFERER'].'"';
		}
	else
		{
		$output .= ' "-"';
		}

	$loggedData['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
	$output .= ' "'.$loggedData['HTTP_USER_AGENT'].'"';
	
	$output = trim($output)."\r\n";
	
	$loggedData['logFileName'] = strftime(str_replace('%Host',$loggedData['HTTP_HOST'],$logFileName),$now);
	$logPath = $logsFolder.$loggedData['logFileName'];
	
	if ($f = @fopen($logPath, 'ab')) {
		fwrite ($f, $output, strlen($output));
		fclose($f);
		}
	
	return $loggedData;
	}

Conclusion :


Script créé pour les besoins du site Y!MobActus d'actualités sur mobile :
http://ymobactus.miaouw.net

Format des logs Apache:
http://httpd.apache.org/docs/1.3/logs.html

Advanced Log Analyzer, logiciel pour interpréter les logs sous Windows :
http://www.abacre.com

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.