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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 975 fois - Téléchargée 18 fois

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

Ajouter un commentaire

Commentaire

peoplehard
Messages postés
26
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2008
-
Merci pour ce code bien pratique !

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.