Логирование всех POST и GET запросов



Простой способ вести логи средствами php. Статья рассчитана для новичков в программировании.
Бывают ситуации, когда необходимо посмотреть входящие запросы ко всем файлам CMS, либо к файлам в отдельно взятой директории. При большом числе посетителей сайта, анализ файлов access.log становится затруднительным.

Представленный ниже пример отлично справляется с этой задачей. Данный способ ведения логов рекомендуется использовать «здесь и сейчас», непосредственно на время отладки. В отличие от стандартного способа, предлагаемого любым нормальным хостинг-провайдером, в данном примере не предусмотрена очистка логов, а по сему его стоит использовать кратковременно, во избежание разрастания файлов post.log и get.log. Данный модуль позволяет записывать лог всех POST и GET запросов к php файлам в выбранной папке (включая вложенные папки).


1. Для начала создаём в корне сайта папку modules, в которой в свою очередь создаём папку log.

2. В ней создадим 2 файла. Назовём их post.log и get.log. В них мы будем записывать логи POST и GET запросов соответственно.

3. В этой же папке создадим файл save_log.php со следующим содержимым:

<?php
$file_get = $_SERVER["DOCUMENT_ROOT"] . "/modules/log/get.log";
$file_post = $_SERVER["DOCUMENT_ROOT"] . "/modules/log/post.log";

if (!empty($_GET)) {
    $fw = fopen($file_get, "a");
    fwrite($fw, "GET " . var_export($_GET, true));
    fclose($fw);
}

if (!empty($_POST)) {
    $fw = fopen($file_post, "a");
    fwrite($fw, "POST " . var_export($_POST, true));
    fclose($fw);
}

?>


Кратко разберем данный файл. Используя суперглобальный массив $_SERVER, определяем путь к корневой директории сервера. Затем, используя конкатенацию, получаем полный путь к файлам get.log и post.log. В итоге в переменной $file_get получаем путь вида: "/home/site/public_html/modules/log/get.log".

Затем, в зависимости от типа запроса, открываем файл post.log, либо get.log, с параметром "a". Благодаря данному параметру, при каждой последующей записи, указатель перемещается в конец файла. Таким образом, в отличие от параметра "w", при добавлении новых записей, старые не удаляются.

При помощи функции var_export, записываем информацию о POST, либо GET запросе. Не забываем закрыть файл при помощи функции fclose.

Отлично. Теперь все POST и GET запросы, приходящие на файл save_log.php, бережно сохраняются. Но как же сохранить запросы к другим файлам?

4. Для этого воспользуемся файлом .htaccess. Его необходимо создать в директории, для которой нужно вести логи. В качестве примера используем файл .htaccess, находящийся в корневой папке сайта. Допишем в начало файла следующую строчку:

php_value auto_prepend_file /home/site/public_html/modules/log/save_log.php


Где /home/site/public_html/ — путь до корневой папки сайта.

При помощи добавки php_value auto_prepend_file, мы ставим на выполнение скрипт save_log.php при запуске любого php файла, расположенного как в одной папке с файлом .htaccess, так и в любой из вложенных папок.

Как узнать полный путь до файла save_log.php? Используем для этого магическую константу __DIR__.

Создаём в нашей папке log файл, назовём его dir.php. В данном файле напишем:

<?php
echo __DIR__;
?>


Затем откроем этот файл в браузере по адресу: site.ru/modules/log/dir.php. Полученный путь вставляем в файл .htaccess

В конце на забываем удалить файл dir.php.

В результате в файле get.log сохраняется список всех GET запросов:



В файле post.log, соответственно сохраняются все POST запросы.
Выделенные серверы OVH
Выделенные серверы Hetzner

0 комментариев

Оставить комментарий