Логирование в PHP с помощью Zend Log. Логирование в PHP Логирование в php

Под логированием в PHP подразумевается то, о каких типах ошибок будет сообщать вам ваше веб-приложение/сайт/php-скрипт и каким образом.

Существует 2 (3) основных способа получения ошибок от приложения:

  1. Вывод этих ошибок непосредственно на экран
  2. Запись этих ошибок в специальный лог-файл
  3. или же сразу оба варианта: вывод этих ошибок на экран и запись их в специальный лог-файл

Как правило, практикуется такое, что при разработке (на локальном окружении) все ошибки показываются прямо на экране, дабы их было легче и более оперативно отлавливать и исправлять, а в боевой среде (на продакшене) ошибки не показываются вообще (т.к. для пользователя — это бесполезная информация) и вся информация о них пишется в лог-файл, который разработчик регулярно просматривает.

Настройки для логирования ошибок

  1. error_reporting — это самый главный параметр. Он отвечает за то, сообщения об ошибках каких типов будут отображаться/писаться в лог-файл.Я считаю, что тут существует только 2 опции, которые возможно использовать:
    • -1 (или E_ALL) — сообщается обо всех типах ошибок;
    • 0 — не сообщается ни о каких типах ошибок

    Я рекомендую использовать исключительно -1 (или E_ALL).
    Т.к. приложение не должно иметь никаких ошибок, в принципе. Эту опцию можно задать через конфигурационный файл в php.ini или же прямо в php-скрипте посредством вызова функции error_reporting :

    Error_reporting(-1); error_reporting(E_ALL);

    Кстати говоря, это единственная опция, которая имеется в языке PHP в виде функции. Все остальные опции возможно задать исключительно при помощи правки конфигурационного файла php.ini или же вызова функции ini_set() передав в неё, соответственно, необходимый параметр и значение для него.

  2. display_errors — этот параметр отвечает за непосредственный показ ошибок на экране после того, как она, собственно, произошла. Данный параметр может иметь значение 0 или 1 либо On / Off. Т.е. либо показывать ошибки на экране, либо нет.
  3. display_startup_errors — эта опция отвечает за показ ошибок, произошедших после запуска PHP. Например, если в конфигурационном файле есть синтаксическая ошибка, то информация о ней будет показана. Данный параметр может иметь значение 0 или 1 либо On / Off.
  4. log_errors — данная директива отвечает за то, чтобы записывать сообщения об ошибках в лог-файл. Данный параметр может иметь значение 0 или 1 либо On / Off. Т.е. записывать ошибки в лог или же нет.
  5. error_log — данная настройка отвечает за путь к файлу (лог-файлу), в который будут записываться все произошедшие ошибки приложения
  6. html_errors — эта же опция отвечает за формат отображения ошибок приложения. Если задана как 1 или On, то ошибка будет показана при помощи HTML’а, т.е. будет trace происхождения ошибки и всё будет достаточно информативно и красочно. Если же значение этой настройки задано как 0 или Off, то ошибки будут отображаться в виде обычного текста в виде небольшого числа строк.

1. Настройки для отображения ошибок на экране




ini_set("html_errors", 1);
ini_set("log_errors", 0);

2. Настройки для записи ошибок в лог-файл

Error_reporting(-1); // ini_set("error_reporting", -1);
ini_set("display_errors", 0);
ini_set("display_startup_errors", 0);
ini_set("log_errors", 1);

3. Настройки для одновременного отображения ошибок и их записи в лог-файл

Error_reporting(-1); // ini_set("error_reporting", -1);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);
ini_set("log_errors", 1);
ini_set("html_errors", 1);
ini_set("error_log", "/var/log/php/error.log");

Так же, эти опции можно задать и в конфигурационном файле php.ini или же в файле вашего виртуального хоста.

Большинство всех вопросов на сайте начинаються "Помогите, не работает, не запускается...". Все ответы сводяться к подсказкам и советам, а вот почему мне раньше не пришло в голову написать статтью о том, как и где искать ошибки или об использовании логов я не знаю. Поэтому восполняем пробел и всем советую ознакомится с этой статье.

Лог (логи ) — (англ. log , возможно Вы встречали раньше файлы *.log ) как правило, текстовый файл в котором в хронологическом порядке идет перечень событий, журнал событий, дневник, запись, протокол т.д. Логи создаются различными программами, сервисами, операционными системами. Для каждой программы может создаваться свой лог (текстовый файл).

При разработке сайта, для веб разработчика ценными будут логи созданые:
1. логи на уровне операционной системы :
- Мой компьютер — Панель управления — Административные инструменты — Просмотр событий
- Мой компьютер — Выполнить - "eventvwr.msc"


Сюда попадают записи о все события в операционной системе Windows. В том числе, здесь, на вкладках:
- Custom Views / Administrative events
- Windows Logs / System

Вы можете найти логи связаные с сервисом Apache (если веб сервер Apache запущен как сервис) и другие ошибки вызваные, например, расширениями (extension) php. По большому счету сюда заносяться все ошибки Windows. Apache, как сервис, считается часть Windows, поэтому если при запуске сервиса Apache возникает какая-угодно ошибка, Вам нужно искать расшифровку и этой ошибки здесь . Далее, если расшифровка ошибки в логах, не дает Вам понять в чем же сообственно проблема, скопируйте основные части лога в google и ищите похожие проблемы. С большой вероятностью Вы найдете ответы, которые Вам помогут. При запуске любой игры, программы, сервиса, когда возникает ошибка, в логах появляеться новая запись с более детальным описанием ошибки. Отталкиваясь от этого Вы всегда можете найти ответ в интернете.

2. логи на уровне Apache :
помимо Windows логов, сам Apache создает собственный лог в ввиде текствого файла. При установке и настройке веб сервера Apache в файле httpd.conf есть строка: ErrorLog "C:/apache/error.log" где, "C:/apache/error.log" путь к файлу-логу веб сервера Apache. Установите свой путь или просто запомните, в случае возникновения ошибок при запуске Apache, Вам нужно открыть этот файл и найти последние записи, где будут отражаться причины ошибок. Помимо этого веб сервер Apache позволяет создавать логи отдельно для каждого виртуального хоста. Пример виртуальных хостов в файле conf/extra/httpd-vhosts.conf :


DocumentRoot "C:/apache/symfony/www/web"
ServerName symfony
ServerAlias www.symfony
ErrorLog "C:/apache/symfony/error.log"
CustomLog "C:/apache/symfony/access.log" common


DocumentRoot "C:/apache/phpmyadmin"
ServerName phpmyadmin
ServerAlias www.phpmyadmin
ErrorLog "C:/apache/phpmyadmin/error.log"
CustomLog "C:/apache/phpmyadmin/access.log" common

3. логи на уровне php :
при настройке конфигурации php в файле php.ini , для настройки отображения логов, находим следующие строки:

error_reporting = E_ALL & ˜E_NOTICE & ˜E_STRICT //виды и типы логируемых отображаемых ошибок
log_errors = On //включаем логирование
log_errors_max_len = 1024 //определяем максимальный размер файла логов (1024 байт)
error_log = php_errors.log //указываем имя файла в котором будут сохраняться логи, эти файлы будут создаваться в корне Вашего виртуального хоста. Для каждого хоста будет создан свой файл.

Помимо того, что в файл будут записываться все php ошибки, Вы также можете создавать логи во время выполнения php скрипта с помошью функции error_log . Это может быть полезно, если Вы активно используете в коде try … catch, в таком случає, скрипты не будут завершаться в случае критических ошибок, а в логах всегда будут отмечены все непредвиденные ошибки.

try {
$r = 5/0;
} catch (Exception $exc) {
error_log($exc->getMessage());
}

По результатам выполнения этого кода, в файл логов php_errors.log будет вставлена строка на подобии такой:

PHP Warning: Division by zero in C:\apache\test\www\index.php on line 5

Вот и все, используйте логи везде где только можно, и Вы быстро будете находить ошибки в коде и причины неправильной обработки данных.

483

В интернете существует большое количество сервисов, предоставляющие услуги по учету посещаемости Вашего сайта. Данные услуги предоставляются как платно, так и бесплатно. К примеру, можно привести LiveInternet. Этот сервис довольно широкий в интернете и почти каждый сайт пользуется его услугами. Владелец имеет подробную статистику о посещении его сайта.

Спору нет! Данные сервисы незаменимы в учете посещаемости сайта и дальнейшего изучения поведения пользователей. Но в данной статье я хочу рассказать, как можно сделать на сервере лог-файл визитов посетителей.

Лог-файл визитов

Данный лог файл будет очень полезен, для учета визитов и просмотров посетителями Ваш сайт. Для создания лог-файла используется скрипт, написанный на языке php. Скрипт довольно простой в понимании и установке на сайт.

Скрипт php для создания лог-файла

Скрипт записывает точное время захода на сайт, определяет браузер посетителя, и что самое главное – определяет откуда пришел посетитель к Вам. Запись лог-файла происходит при каждом отображении к той или иной страницы сайта. То есть, владелец сайта может посмотреть в лог файле какие конкретно просматривал страницы сайта посетитель по определенному IP и времени, используя определенный браузер.

Листинг скрипта записи данных в лог-файл

Установка скрипта

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

В каждом реальном PHP приложений время от времени возникают ошибки и исключения, выскакивают предупреждения, сообщения. Если мы не будим записывать эту информацию (логировать), то в один прекрасный момент станет невозможным понять, в какой же части приложения возникают эти ошибки и исключения, и, соответственно, не сможем решить их. К тому же, существуют такие ситуации, когда логирование событий, действий просто необходимо, как в случае, с входом пользователя в систему и выходом из нее, например.

В PHP уже существуют необходимые средства для журналирования : функция error_log() – для отправки сообщения в системный журнал, функция set_error_handler() , для перехвата предупреждений и ошибок. Эти функции могут быть использованы для пользовательского управления ошибками, давая разработчику кода возможность самостоятельного управления логикой обработки и фильтрации ошибок.

Однако такой низкоуровневый доступ приводит к частому дублированию кода, и что еще более важно, такой код более подвержен ошибкам. Поэтому на помощь программисту приходят уже готовые компоненты, хорошо протестированные и зарекомендовавшие себя в “боевых” условиях.

К таким компонентам относится компонент zend-log из фреймворка Zend . Компонент zend-log может быть использован в качестве многоцелевого компонента логирования, эдакий мастер на все руки. Он поддерживает множество форматов журнальных сообщений и разновидностей баз логирования (файлы, базы данных), плюс ко всему имеет проработанную систему фильтрации сообщений и много чего еще. Также zend-log совместим с PSR-3 стандартом логирования. Устанавливается так:

Сomposer require zendframework/zend-log

Используется следующим образом (для примера используется файл index.php в корне проекта):

Require "vendor/autoload.php";

Use Zend\Log\Logger;
use Zend\Log\Writer\Stream;

$logger = new Logger;

// отправляем ошибки в консоль
$writer = new Stream("php://ouput");

$logger -> addWriter($writer);
$logger -> log(Logger::INFO,"Некая информация");

Результат выполнения кода выше:

2017-09-26T10:40:34+03:00 INFO(6): Некая информация

Итоговая строка включает время события, приоритет и сообщение. Формат выводимого сообщения, безусловно, может быть изменен, в случае необходимости с помощью метода setFormatter() . По умолчанию, строка лога описывается следующим шаблоном:

%timestamp% %priorityName% (%priority%): %message% %extra%

  1. %timestamp% - это метка времени
  2. %priorityName% - текстовая метка приоритета
  3. %priority% - числовая метка приоритета
  4. %message% - сообщение
  5. %extra% - необязательное значение для дополнительной информации

Если Вы захотите изменить формат сообщения, то это делается следующим образом:

$formatter = new Zend\Log\Formatter\Simple("сообщение %message%" . PHP_EOL);
$writer -> setFormatter($formatter);

Компонент zend-log может быть также использован для логирования ошибок и исключений самого интерпретатора PHP. Для этого в классе Logger существую два статических метода: Logger::registerErrorHandler($logger) – для перехвата ошибок и Logger::registerExceptionHandler($logger) - для перехвата исключений.

Use Zend\Log\Logger;
use Zend\Log\Writer;

$logger = new Logger;
$writer = new Writer\Stream(__DIR__ . "/test.log");
$logger->addWriter($writer);

// Логировать ошибки
Logger::registerErrorHandler($logger);

// Логировать исключения
Logger::registerExceptionHandler($logger);

Как упоминалось ранее, zend-log предоставляет нам возможность фильтрации сообщений для логирования, т.е. перед тем как записать сообщение в лог, мы может посмотреть удовлетворяет ли оно нашим критериям, и если да, то записываем.

Вот пример:

$filter = new Zend\Log\Filter\Priority(Logger::CRIT);

// метод addFilter интерфейса Writer
$writer->addFilter($filter);

В данном примере, мы будем логировать только те сообщения, чей приоритет меньше или равен критическому (Logger::CRIT ).

Полный список приоритетов, определенных в классе Zend\Log\Logger :

Const EMERG = 0; // Авария: система непригодна для использования
const ALERT = 1; // Тревога: срочно необходимо принимать меры
const CRIT = 2; // Критическая ситуация
const ERR = 3; // Ошибка
const WARN = 4; // Предупреждение
const NOTICE = 5; // Внимание
const INFO = 6; // Информация
const DEBUG = 7; // Дебаг, отладка

Мы также можем фильтровать сообщения на основе регулярных выражений, временных меток и т.д. Таким образом, логирование в PHP – это важная и порой необходимая вещь при разработке web-приложений .



error: Контент защищен !!