Показано с 1 по 4 из 4

Тема: preg_match, обработка лога

  1. #1

    Регистрация
    06.05.2007
    Адрес
    Россия
    Сообщений
    73
    Необходимо обработать log-файл HTTP-сервера Apache -
    "access.log".
    Надо разобрать каждую из строк лог-файла с помощью функции preg_match(...) на поля:
    - ip-адрес
    - время (перевести в числовой формат - количество секунд, прошедших с 1 января 1970 года по Гринвичу, и сравнения вместе с обработкой проводить уже в этом формате)
    - часть URL, идущая за адресом сайта, кроме параметров GET-запроса
    - параметры GET-запроса (часть URL после '?' включительно)
    - код результата HTTP-запроса
    - число возвращенных байтов
    Затем, отобрать только те строки, у которых код результата HTTP-запроса равен 200, время входит в указанные рамки и та часть URL, которая идет за адресом сайта, но не включает в себя параметры GET-запроса, - должна содержать вводимую ранее подстроку, если таковая задана.


    вот 2 строки из access.log:

    127.0.0.1 - - [14/May/2007:17:48:52 +0400] "POST /index.php HTTP/1.1" 200 1477
    127.0.0.1 - - [14/May/2007:17:48:53 +0400] "POST /index.php?pager HTTP/1.1" 200 1477

    Есть предложения?

  2. #2

    Регистрация
    11.02.2007
    Адрес
    Донецк, Украина
    Сообщений
    96
    тут уместнее preg_split, а не preg_match. а вобще достаточно и просто split
    в чем проблема-то?

  3. #3

    Регистрация
    06.05.2007
    Адрес
    Россия
    Сообщений
    73
    Originally posted by Scorched.dn.ua@May 15 2007, 20:16
    тут уместнее preg_split, а не preg_match. а вобще достаточно и просто split
    в чем проблема-то?
    <div align='right'>[Только зарегистрированные пользователи могут видеть ссылки. ]
    [/quote]

    Была вот в этом =) :
    1. Нарисовать HTML-форму с параметрами (заполняемыми полями):
    - "время от" в формате "YYYY-MM-DD hh:mm:ss" (YYYY - год, ММ - месяц, DD - день месяца, hh:mm:ss - час, минута и секунда, время - локальное); если время не указано, то минимальное время не ограничено
    - "время до" в том же формате; если время не указано, то максимальное время не ограничено. Время считать «невключительно».
    - «подстрока URL» - подстрока, содержащаяся в URL&#39;ax HTTP-запросов
    Эту форму отсылать HTTP-методом POST, при ошибке во введенных данных - повторно выдавать ту же самую HTML-форму с сообщением об ошибке на этой странице.
    2. При правильно введенных данных - обработать log-файл HTTP-сервера Apache -
    "access.log".
    Надо разобрать каждую из строк лог-файла с помощью функции preg_match(...) на поля:
    - ip-адрес
    - время (перевести в числовой формат - количество секунд, прошедших с 1 января 1970 года по Гринвичу, и сравнения вместе с обработкой проводить уже в этом формате)
    - часть URL, идущая за адресом сайта, кроме параметров GET-запроса
    - параметры GET-запроса (часть URL после &#39;?&#39; включительно)
    - код результата HTTP-запроса
    - число возвращенных байтов
    Затем, отобрать только те строки, у которых код результата HTTP-запроса равен 200, время входит в указанные рамки и та часть URL, которая идет за адресом сайта, но не включает в себя параметры GET-запроса, - должна содержать вводимую ранее подстроку, если таковая задана.
    3. Сохранить результат в неких SQL-таблицах, созданных Вами ранее в некой базе данных.
    Перед помещением данных в эти таблицы, они должны быть очищены. Таблицы следущие:
    - IP-адреса
    - URL до &#39;?&#39;
    - время доступа, ссылка на IP-адрес, ссылка на URL до &#39;?&#39;, GET-параметры, число байт
    4. Вывести результаты на HTML-странице в виде таблицы. У таблицы рамка вокруг и граница
    между ячейками - черная линия толщиной ровно 1 пиксель (можно использовать CSS).
    Результаты должны быть отсортированы по времени. На странице должно быть не более 50
    записей из лог-файла с полями: ip-адрес, время, URL между адресом сайта и &#39;?&#39;, URL после
    &#39;?&#39;, число возвращенных байтов.

    Внизу и вверху таблицы вывести общее число отобранных записей, номер 1-й страницы (1), номер текущей страницы, страницы до нее и после нее, а также номер последней страницы. Номер текущей страницы не должен быть ссылкой, номер же остальных страниц - ссылки с GET-параметром, указывающим номер страницы.
    Вверху таблицы - ссылка на HTML-форму с параметрами (см. пункт 1).

    В следующем посте выложу исходники чтобы этот не нагружать(думаю ругать меня не будут).

    Если будут какие-то предложения то буду очень признателен.

  4. #4

    Регистрация
    06.05.2007
    Адрес
    Россия
    Сообщений
    73
    index.php
    Код:
    <?php
    require_once("lib.php");
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Form</title>
    </head>
    
    <body>
    <?
    if($error == true){
    ****echo "".$err_mess."
    ";
    ****echo $form;
    }
    
    echo $text;
    
    ?>
    </body>
    </html>
    далее lib.php
    Код:
    <?php
    set_magic_quotes_runtime(0);
    define(&#39;BEGIN_TRANSACTION&#39;, 1);
    define(&#39;END_TRANSACTION&#39;, 2);
    require_once("mysql.php");
    $sql = new sql_db;
    $host = "localhost";
    $user = "root";
    $pass = "";
    $db = "test";
    if(isset($_POST[&#39;Start&#39;])) $start=$_POST[&#39;Start&#39;];
    if(isset($_POST[&#39;End&#39;])) $end=$_POST[&#39;End&#39;];
    
    $pattern = "/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).+([0-9]{2})\/([A-Za-z]{3})\/([0-9]{4}):([0-9]{2}):([0-9]{2}):([0-9]{2}).+\"POST.(\/.*)\s.*\"\s+([0-9]{1,3}).([0-9]*)/";
    $pattern1 = "/([0-9]{4})\-([0-9]{2})-([0-9]{2})\s([0-9]{2}):([0-9]{2}):([0-9]{2})/";
    
    $form = "
    
    Время вводится в формате YYYY-MM-DD hh:mm:ss (YYYY - год, ММ - месяц, DD - день месяца, hh:mm:ss - час, минута и секунда)</p>
    ****<form action=\"".$PHP_SELF."\" method=\"post\">\n
    ****Дата от: <input type=\"text\" maxlength=\"19\" name=\"Start\" size=\"40\" *value=\"".$start."\">
    
    ****Дата до: <input type=\"text\" maxlength=\"19\" name=\"End\" size=\"40\" value=\"".$end."\">
    
    ****подстрока URL: <input type=\"text\" maxlength=\"255\" size=\"35\" name=\"Page\">
    
    ****<input type=\"submit\" value=\"Send\" name=\"Submit\">
    ****</form>";
    
    if(isset($_POST[&#39;Submit&#39;]) && $_POST[&#39;Submit&#39;] ="Send"){
    ****$error = FALSE;
    // *
    ****if (isset($_POST[&#39;Start&#39;]) && $_POST[&#39;Start&#39;] !="" && !preg_match($pattern1,$_POST[&#39;Start&#39;],$stmatch)){
     *$start = $_POST[&#39;Start&#39;];
     *$error = true;
     *$err_mess = "Неправильно заполнено поле \"Время от: \"!";
    ****}
    ****if (isset($_POST[&#39;End&#39;]) && $_POST[&#39;End&#39;] !="" && !preg_match($pattern1,$_POST[&#39;End&#39;],$enmatch)){
     *$end = $_POST[&#39;End&#39;];
     *$error = true;
     *$err_mess = "Неправильно заполнено поле \"Время до: \"!";
    ****}
    ****if($error == false){
     *$fp = fopen("access.log","r");
     *$i = 0;
     *while (!feof ($fp)) {
     * * *$buffer = fgets($fp);
     * *if(preg_match($pattern,$buffer,$matches)){
     * *if(!is_numeric($matches[3])){
     * *****$matches[3] = eregi_replace("Jan","1",$matches[3]);
     * *****$matches[3] = eregi_replace("Feb","2",$matches[3]);
     * *****$matches[3] = eregi_replace("Mar","3",$matches[3]);
     * *****$matches[3] = eregi_replace("Apr","4",$matches[3]);
     * *****$matches[3] = eregi_replace("May","5",$matches[3]);
     * *****$matches[3] = eregi_replace("Jun","6",$matches[3]);
     * *****$matches[3] = eregi_replace("Jul","7",$matches[3]);
     * *****$matches[3] = eregi_replace("Sep","9",$matches[3]);
     * *****$matches[3] = eregi_replace("Oct","10",$matches[3]);
     * *****$matches[3] = eregi_replace("Nov","11",$matches[3]);
     * *****$matches[3] = eregi_replace("Dec","12",$matches[3]);
     * *****$matches[3] = eregi_replace("Aug","8",$matches[3]);
     * *}
     * *$time = gmmktime($matches[5],$matches[6],$matches[7],$matches[3],$matches[2],$matches[4]);
     * *****if(preg_match("/^(\/.*)(\?.*)/",$matches[8],$mat)){
     * * *$link = $mat[1];
     * *****$get = $mat[2];
     * *****} else {
     * *****$link = $matches[8];
     * *****$get = "";
     * *}
     * *$req = $matches[9];
     * *$size = $matches[10];
     * *$params[] = $matches[1].",".$time.",".$link.",".$req.",".$size.",".$get;
     * *$i++;
     * *}
     *}
     *fclose ($fp);
    ****}
    } *else {
    ****$text = $form;
    }
    ****if($stmatch) {
     *$st_time = gmmktime($stmatch[4],$stmatch[5],$stmatch[6],$stmatch[2],$stmatch[3],$stmatch[1]);
    ****}
    ****if($enmatch) $en_time = gmmktime($enmatch[4],$enmatch[5],$enmatch[6],$enmatch[2],$enmatch[3],$enmatch[1]);
    ****if(isset($_POST[&#39;Page&#39;]) && $_POST[&#39;Page&#39;] !="") $url = "/".$_POST[&#39;Page&#39;];
    ****
    ****for($j=0;$j<$i;$j++){
     *list($ip,$time,$link,$req,$size,$get) = explode(",",$params[$j]);
     *if($req != 200) continue;
     *if(is_numeric($st_time) && ($time < $st_time)) continue;
     *if(is_numeric($en_time) && ($en_time < $time)) continue;
     *if($url && $url != $link) continue;
     *$sQuerry[] = $ip.",".$time.",".$link.",".$req.",".$size.",".$get;
    ****}
    ****
    
    $res = $sql -> sql_db($host,$user,$pass,$db, "");
    
    ****if($res){
    ****
     *$trun1 = "TRUNCATE TABLE `ip`";
     *$trun2 = "TRUNCATE TABLE `url`";
     *$trun3 = "TRUNCATE TABLE `request`";
     *
     *$sql -> sql_query($trun1,1);
     *$sql -> sql_query($trun2,1);
     *$sql -> sql_query($trun3,1);
     *foreach($sQuerry as $val){
     *****list($ip,$time,$link,$req,$size,$get) = explode(",",$val);
     *****$sq1 = "INSERT INTO ip (`ip_id`, `address`) VALUES (&#39;&#39;, &#39;".$ip."&#39;)";
     *****$sq2 = "INSERT INTO url (`link_id`, `link`) VALUES (&#39;&#39;, &#39;".$link."&#39;)";
     *****$sq3 = "INSERT INTO request (`id`, `time`,`ip_id`, `link_id`, `get`, `size`) VALUES (&#39;&#39;, &#39;".$time."&#39;, &#39;".$ip."&#39;,&#39;".$link."&#39;,&#39;".$get."&#39;,&#39;".$size."&#39;)";
     *****$sql -> sql_query($sq1,2);
     *****$sql -> sql_query($sq2,2);
     *****$sql -> sql_query($sq3,2);
     *}
    ****}
    
    ?>
    mysql.php не буду сюда вставлять так как он не очень то и нужен тут +/

Похожие темы

  1. Обработка фотографий
    от raduga-deti в разделе Разовая работа. Поиск исполнителей.
    Ответов: 3
    Последнее сообщение: 29.08.2011, 13:38
  2. Обработка фото
    от Darkness в разделе Растровая графика
    Ответов: 3
    Последнее сообщение: 08.03.2008, 05:54
  3. Обработка фотографии
    от 0пасный_СпартсмЭн в разделе Растровая графика
    Ответов: 23
    Последнее сообщение: 18.01.2008, 11:30
  4. Обработка изображения
    от pancho в разделе Растровая графика
    Ответов: 4
    Последнее сообщение: 26.12.2007, 13:45
  5. обработка фото
    от lenmikh в разделе Растровая графика
    Ответов: 29
    Последнее сообщение: 31.01.2007, 12:39

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •