Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Парсер логов Apache, log apache parser function
GET  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3883
Пользователь №: 21196
На форуме: 6 лет, 10 месяцев, 14 дней
Карма: 87




Функция может пригодиться на период отладки, чтоб не дергать логи постоянно по консоле, а видеть их из админки. Ещё может пригодится для небольших проектов, когда нагрузка не измеряется 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)


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2732
Пользователь №: 24406
На форуме: 6 лет, 3 месяца
Карма: 176




Одна проблема - какая то страсть к излишним if-else.


--------------------
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3883
Пользователь №: 21196
На форуме: 6 лет, 10 месяцев, 14 дней
Карма: 87




T1grOK
Цитата
Одна проблема - какая то страсть к излишним if-else.


ну не оптимизировал, ну пример?


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Я когда-то искал подобную тулзу. И тоже думал сам писать )
Но в итоге задача отвалилась.

По-моему не круто, что считывается весь файл логов, а не только $max последних строк.
Но на период отладки и для небольших проектов может и ничего страшного.
Ну а для прокачки собственных скиллов можно и запилить некое подобие tail.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2732
Пользователь №: 24406
На форуме: 6 лет, 3 месяца
Карма: 176




if(!is_file($file))
{
return '...';
}

if(false === ($file=@file_get_contents($file)))
{
return '...';
}

.....
if('' === $val)
{
continue;
}

Уже 3 уровня убралось.


--------------------
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
GET  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



TERRAFORMING ENGINEER
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 3883
Пользователь №: 21196
На форуме: 6 лет, 10 месяцев, 14 дней
Карма: 87




T1grOK
А ты вот о чём, ну у меня просто стиль такой в шторме привык писать там все блоки подсвечиваются.

Guest
Это не то чтоб не круто это единственный способ чтоб отфильтровать по нужным настройкам почитай про настройки внимательно.

У тому же как я уже писал это разовая админская функция поэтому особой нагрузки она не даст.


--------------------
Не тот велик, кто не падал, а тот кто падал и поднимался.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2732
Пользователь №: 24406
На форуме: 6 лет, 3 месяца
Карма: 176




Цитата (GET @ 26.04.2016 - 08:45)
А ты вот о чём, ну у меня просто стиль такой в шторме привык писать там все блоки подсвечиваются.

Это не оправдание. Код понять сложнее.


--------------------
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









T1grOK
В том то и дело что мне так логику видно лучше. Ключевое слово "мне", кто как хочет пусть так и пишет.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Чукча писатель короче smile.gif

GET
Я тебе говорю, о том, что если тебе нужно прочитать 1000 последних строк их файла – то обычно нет необходимости читать первые 100500 строк. Внимательнее нужно быть.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Guest

Хорошо отсчитал ты 1000 строк а в настройках показать только коды ошибок или логи конкретного айпи сколько логов будет на экране начальник Чукотки?
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dezigo  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Indiana Jones
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1002
Пользователь №: 5429
На форуме: 8 лет, 6 месяцев, 22 дня
Карма: 46




Код грязноватый, даже комментировать не хочется.

Возьми хотябы пример
https://github.com/kassner/log-parser
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









GET
Ты по-ходу не понимаешь концепции.

Алгоритм таков:
1. читаем одну строку с конца.
2. если она подходит под условия фильтра $found++;
3. если $found < $max – повторяем; иначе – break;
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Да я не прошу комментариев, я сделал для себя, для меня код прост и понятен. Сделал я его на раз когда в этом была необходимость, перед этим гуглил решение, но не нашел.

Использовать или нет ваше дело, я что тут на совете директор что-ли? smile.gif
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Guest
Ну почитай про производительность file и file_get_contents учитывая что там всего несколько тысяч по дефаулту влазит.

Не буду больше ничего писать laugh.gif

Заводы стоят бл* одни программисты в стране!
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Вот это правильно. Сделай паузу скушай твикс. За это уважаю.
А то что-то у тебя в каждом сообщении все меньше и меньше здравомыслия.

Ну раз уже писать не будешь – то хотя бы подумай: какая связь меду "читать по одной строке" и file/file_get_contents?
Скрытый текст
Правильно, никакой.

    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса