[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер логов Apache
GET
Функция может пригодиться на период отладки, чтоб не дергать логи постоянно по консоле, а видеть их из админки. Ещё может пригодится для небольших проектов, когда нагрузка не измеряется 100 уников в минуту, а еще, когда у юзера вдруг отключен JS или метрики вырезаны Ghostery (и прочими блокировщиками) можно быстро отследить что он делает на сайте.

user posted image

Что умеет:

— парсит последние N логов по заданным настройкам
— более-менее читабельно их оформляет и подкрашивает, рекодит кириллицу

Настройки:

— выбор количества логов, по умолчанию 1000
— указать разницу в часах с сервером, чтоб видеть домашнее время логов
— показывать в логах только конкретный IP
— скрывать свои логи (хозяина админки)
— скрывать логи ботов
— показывать логи только с кодами 4-xx и 5-xx



function log_apache_parser($file,$time=3,$max=1000,$ip=false,$bot=true,$admin=true,$error=false)
{
if(is_file($file))
{
if($file=@file_get_contents($file))
{
$admin_IP=$_SERVER['REMOTE_ADDR'];//IP админа
$time=$time*3600;//разница часов во времени с сервером (UTC)
$result='';
$file=preg_replace( "#\r\n|\r|\n#",PHP_EOL,$file);//унификация делителя для разных ОС
$file=explode(PHP_EOL,$file);
$file=array_reverse($file);

$n=1;//определитель нечетной строки лога
$max++;
foreach($file as $i=>$val)
{
if($i==$max)break;

if($val!=='')
{
preg_match_all('~"(.*?)(?:"|$)|([^"]+)~',$val,$m,PREG_SET_ORDER);
$temp=[];
$break=false;//не было отмены парса строки
foreach($m as $ii=>$val2)
{
$val2[0]=trim($val2[0]);//echo $ii.'<br>';
if($val2[0]=='')continue;
if($ii==0)//IP и дата
{
$temp2=explode(' - - ',$val2[0]);
$temp2[0]=trim($temp2[0]);
if(($ip) && $ip!==$temp2[0])//показ конкретного IP
{
$max++;
$break=true;
break;
}
if(!$admin && $temp2[0]==$admin_IP)//исключаем показы админа
{
$max++;
$break=true;
break;
}
$temp[]='<b>'.$temp2[0].'</b>';//IP
$DATE=str_replace(['[',']'],'',$temp2[1]);
$DATE=explode(':',$DATE);
$temp[]='Когда: '.date('Y-m-d H:i:s',strtotime(str_replace('/',' ',$DATE[0]).' '.$DATE[1].':'.$DATE[2].':'.$DATE[3])+$time);//дата+ time часов
}
else
{
if($ii==1)//Запрос
{
if(strstr($val2[0],'%'))$val2[0]=urldecode($val2[0]);
$temp[]='Запрос: '.trim($val2[0],'"');
}
else
{
if($ii==2)//Код ответа
{
$temp2=(int)$val2[0];
if($temp2<300)
{
if($error)//исключаем показы 2-XX
{
$max++;
$break=true;
break;
}
$temp[]='Код ответа: <b style="color:#2dc314">'.$temp2.'</b>';
}
else
{
if($temp2<400)
{
if($error)//исключаем показы 3-XX
{
$max++;
$break=true;
break;
}
$temp[]='Код ответа: <b style="color:#9b9a17">'.$temp2.'</b>';
}
else
{
if($temp2<500)$temp[]='Код ответа: <b style="color:#e85e50">'.$temp2.'</b>';
else $temp[]='Код ответа: <b style="color:#c24615">'.$temp2.'</b>';
}
}
}

else
{
if($ii==3)//откуда
{
if(strstr($val2[0],'%'))$val2[0]=urldecode($val2[0]);//перекодируем кириллицу если есть
$temp[]='Откуда: '.trim($val2[0],'"');
}
else
{
if($ii==5)//браузер
{
$val2[0]=trim($val2[0],'"');
if(strstr($val2[0],'bot'))
{
if(!$bot)//исключаем показы ботов
{
$max++;
$break=true;
break;
}
$temp[]='<b style="color:#6fa3e9">Бот</b>-Браузер: '.$val2[0];
}
else $temp[]='Браузер: '.$val2[0];
}
else
{
$temp[]=trim($val2[0],'"');
}
}
}
}
}
}

if(!$break)
{
if($n==1)
{
$color='';
$n=2;
}
else//красим четные строки
{
$color=' style="background-color:#d5f0f4"';
$n=1;
}
$result.='<div'.$color.'>'.implode('<br>',$temp).'</div><br><br>';
}
}

else $max++;
}
}

else $result='Файл не читается';
}
else $result='Не найден файл логов';
return $result;
}


Пример подключения:


$file_log='../../logs/mysite.com.access.log';//путь для ваших логов
$max=(isset($_POST['max'])?(int)$_POST['max']:1000);
$time=(isset($_POST['time'])?(int)$_POST['time']:3);
$admin=(isset($_POST['admin'])?true:false);
$bot=(isset($_POST['bot'])?true:false);
$error=(isset($_POST['error'])?true:false);
$ip=(!empty($_POST['ip'])?$_POST['ip']:false);

$result=log_apache_parser($file_log,$time,$max,$ip,$bot,$admin,$error);

echo $result;


        <form method="post">
<br>
Максимум строк: <input type="text" name="max" value="1000">
<br>
Разница в часах: <input type="text" name="time" value="3">
<br>
Искать конкретный IP: <input type="text" name="ip" value="">
<br><input
type="checkbox" name="admin" checked="checked"> Показывать админа
<br><input type="checkbox" name="bot" checked="checked"> Показывать ботов
<br><input type="checkbox" name="error"> Только страницы с ошибками
<br>
<br><input
type="submit" value="Ok">
</form>


Ну, из HTML формы думаю всё понятно, как работает.

Конечно, функция простая и для профи может особо и не нужна, но всё же может пригодится.

Особо не оптимизировал т.к. это разовый инструмент.

Тестил на OpenServer/VPS(Debian)

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.