Search
Write a publication
Pull to refresh

Парсер логов Apache

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

Что умеет:

— парсит последние 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])
                                {
                                    $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=(int)$_POST['max'];
    $time=(int)$_POST['time'];
    $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 формы думаю всё понятно, как работает.

Конечно, функция простая и для профи может особо и не нужна, но всё же может пригодится.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.