artem
21.11.2018
657

Логирование phpagi

В данной статье изучим структуру логирования библиотеки phpagi. Также рассмотрим возможность дополнительного логирования файла phpagi-asmanager.php.

Рассмотрим, как устроено логирование в библиотеке phpagi. Для начала рассмотрим логирование в файле phpagiasmanager.php.

Сам скрипт модно найти в открытом доступе по следующей ссылке.

В данном файле за логирование отвечает функция log. На вход подаётся два параметра:

                $message – сообщение, которое будет записано в файл лога;

                $level – уровень логирования (принимает значения от 1 до 4, по умолчанию равен 1);

Приведём код данной функции:

function log($message, $level=1)
{
    if($this->pagi != false)
        $this->pagi->conlog($message, $level);

    else

        error_log(date(‘r’) . ‘ – ‘ . $message);
}
 

Как видно, есть два пути выполнения функции. Первый подразумевает наличие объекта pagi. Если он существует, то будем использовать для логирования его метод conlog (его рассмотрим чуть позднее). В другом варианте, воспользуется стандартной функцией php записи логов: error_log. На вход данной функции подаётся строка, которая будет выведена в лог php.

По умолчанию, запись происходит в файл: /var/log/httpd/error_log.

Если, по какой-либо причине, файл логирования был изменён, посмотреть новый файл всегда можно в конфигах веб-сервера, к примеру:

fgrep ErrorLog /etc/httpd/conf/httpd.conf

В результате получим строку, вида:

ErrorLog logs/error_log

Соответственно, в конце указано имя файла, содержащего лог.

Теперь вернёмся к рассмотрению второго варианта (когда объект pagi всё же создан). В этом случае будет вызван метод conlog. Сам метод описывается в скрипте phpagi.php. Рассмотрим его:

function conlog($str, $vbl=1)

{

    static $busy = false;

    if($this->config[‘phpagi’][‘debug’] != false)

    {

        if(!$busy) // no conlogs inside conlog!!!

        {

            $busy = true;

            $this->verbose($str, $vbl);

            $busy = false;

        }

    }

}

Одним из важных моментов для работы логирования в данной ветке выполнения программы, является включённая опция дебага. Без неё запись в лог не будет производится.

Проверить (а заодно и включить) данную настройку можно в файле /etc/asterisk/phpagi.conf раздел [phpagi] debug.

Затем, если условия выполнены, скрипт пойдёт дальше, передавая параметры в функцию verbose.

function verbose($message, $level=1)

{

    foreach(explode(“n”, str_replace(“rn”, “n”, print_r($message, true))) as $msg)

    {

        @syslog(LOG_WARNING, $msg);

        $ret = $this->evaluate(“VERBOSE “$msg” $level”);

    }

    return $ret;

}

На вход также подаётся два параметра. Значения и смысл их абсолютно аналогичен параметрам функции log файла phpagiasmanager.php, рассмотренной в начале статьи.

В данной функции производится непосредственный вывод сообщения в файл лога.

По умолчанию, функция syslog записывает данные в системный лог.

Для системы CentOS 6.9 данный файл находится по пути: /var/log/messages.

Там и следует искать вывод логов.

Теперь рассмотрим возможность дополнительного логирования файла phpagi-asmanager.php.

Дополнительное логирование

Откроем для редактирования файл phpagi-asmanager.php.

В качестве дополнительного логирования, добавим результат ответов на наши запросы к сокету. По умолчанию, ответы типа «response» не пишутся в лог-файл.

Находим в файле функцию wait_response. Пропускаем первую часть, относящуюся к чтению ответов сокета и работу с буфером. Находим код:

switch($type)

{

}

В описание caseresponse добавляем код, получим:

case ‘response’:

    $this->log(‘Get response request with parameters: ‘.print_r($parameters, true));

break;

Дополнительное логирование

Теперь рассмотрим на примере, как выглядит лог с ответами. Сразу уточню, что в нашем примере объект pagi не создан, поэтому запись логов ведётся в файл /var/log/httpd/error_log.

Лог-файл

На этом скриншоте представлен стандартный сеанс обмена данными. Сперва отсылаются данные для аутентификации. В ответ получаем тип Response, со значением Success. Это означает, что авторизация пройдена успешно. Далее отправляется событие, к примеру, Originate. В данный пример включена ошибка в вызываемом номере. Характер ошибки можно увидеть в прилагаемом к ответу сообщении (Message). После выполнения всех команд разлогиневаемся, в ответ получая: Goodbye.

Если не записывать ответы типа Response, предыдущие строки в логах будут отсутствовать.

Таким образом, дебажить, имея в логах ответы с сокета гораздо удобнее.

Также могут быть интересны следующие статьи по логированию в Asterisk:

Сбор логов на одном сервере с нескольких других, посредством SysLog

Расширенное логирование звонков: CEL – Channel Event Logging

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices