Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/09/2008, 09:15
juanfuentes
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
Puntos: 6
Información Expresión regular para access.log de Apache

Hola!

Llevo tiempo buscando una expresión regular para poder cargar los registros del fichero de accesos de un servidor web (Apache). Al final, cómo lo que encontraba no me convencía, he decidido hacerlo yo mismo. Aquí os dejo el resultado:
Código PHP:
$str '... fila del archivo access del webserver ...';    
if (
preg_match('/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) -([\w\s]*) - \[(.*)\] "(.*) (.*) HTTP\/(.*)" (\d+) (\d+|-) "(.*)" "(.*)"/'$str$match)) {
    
$log = array();
            
    
$log['ip'] = $match[1];
    
$log['user'] = $match[2];
    
$log['datestr'] = $match[3];
    
$log['option'] = $match[4];
    
$log['url'] = $match[5];
    
$log['http'] = $match[6];
    
$log['code'] = $match[7];
    
$log['bytes'] = $match[8];
    
$log['ref'] = $match[9];
    
$log['agent'] = $match[10];

He estado haciendo pruebas, y de momento parece que funciona. Sin embargo, me gustaría asegurarme que el formato es el correcto. Si alguien encuentra algún error o alguna mejora en la expresión, por favor, indicadla aquí :)

Un ejemplo de un registro de acceso con los que he hecho las pruebas sería:
Código:
11.22.33.44 - - [01/Sep/2007:14:00:41 +0200] "GET /img/es.png HTTP/1.1" 200 271 "http://www.miservidor.com/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.1)"
Para el registro anterior, el contenido de $log sería el siguiente:
Código PHP:
    $log['ip'] = '11.22.33.44';
    
$log['user'] = '';
    
$log['datestr'] = '01/Sep/2007:14:00:41 +0200';
    
$log['option'] = 'GET';
    
$log['url'] = '/img/es.png';
    
$log['http'] = '1.1';
    
$log['code'] = 200;
    
$log['bytes'] = 271;
    
$log['ref'] = 'http://www.miservidor.com/';
    
$log['agent'] = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.1)'
Saludos ;)