Pull to refresh

Логирование всех 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 запросов:

image

В файле post.log, соответственно сохраняются все POST запросы.
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.