Меню

Как посмотреть ошибки asterisk

Configure Asterisk logging

1. Edit the logger.conf file to enable specific logger channels to output to your filesystem. The word «debug_log_123456» can be changed to anything you want, as that is the filename the logging will be written to.

Modify the file name «debug_log_123456» to reflect your issues.asterisk.org issue number.

Asterisk 13+

Icon

 In Asterisk 13 and later, you can dynamically create log channels from the CLI using the logger add channel command. For example, to create the log file above, you would enter:

logger add channel debug_log_123456 notice,warning,error,debug,verbose,dtmf

The new log channel persists until Asterisk is restarted, the logger module is reloaded, or the log files are rotated. If using this CLI command, do not reload/restart/rotate the log files in Step 2.

Configure verbosity levels and rotate logs

2. From the Asterisk CLI, set the verbose and debug levels for logging (this affects CLI and log output) and then restart the logger module:

Optionally, if you’ve used this file to record data previously, then rotate the logs:

Enable channel tech or feature specific debug

2.1. Depending on your issue and if a protocol level trace is requested, be sure to enable logging for the channel driver or other module.

Module (version) CLI Command
New PJSIP driver (12 or higher)
pjsip set logger on
SIP (1.6.0 or higher)
sip set debug on
SIP (1.4)
sip set debug
IAX2 (1.6.0 or higher)
iax2 set debug on
IAX2 (1.4)
iax2 set debug
CDR engine cdr set debug on

Issue reproduction and clean up

3. Now that logging is configured, enabled and verbosity is turned up you should reproduce your issue.

4. Once finished, be sure to disable the extra debugging:

4.1. Again, remember to disable any extra logging for channel drivers or features.

SIP (1.4 or higher)

IAX2 (1.4 or higher)

5. Disable logging to the filesystem. Edit the logger.conf file and comment out or delete the line you added in step 1. Using a semi-colon as the first character on the line will comment out the line.

Then reload the logger module (or restart Asterisk) as you did in step 2:

Provide debug to the developers

6. Upload the file located in /var/log/asterisk/debug_log_123456 to the issue tracker.

Icon

  1. Do NOT post the output of your file as a comment. This clutters the issue and will only result in your comment being deleted.
  2. Attach the file with a .txt extension to make it easy for the developers to quickly open the file without downloading.
    Files are attached on the issue page with following menu items: ( More > Attach files )

Данная статья посвящена работе с log-файлами, инструментам для работы с log-файлами и модули FreePBX способные помочь в работы с log-файлами.

Log-файлы

Log-файлы. Для чего они нужны, где их искать и как использовать?

Файлы логов

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

В конфигурационном каталоге asterisk (по умолчанию /etc/asterisk) находится несколько файлов, отвечающих за логи:
1.Файл asterisk.conf содержит переменную astlogdir, которая указывает местоположение логов asterisk (по умолчанию — /var/log/asterisk)

2.Файл конфигурации логов — logger.conf. В нем можно прописывать различные опции для ведения логов, а также указать, какие виды информации в эти логи должны будут сохранять. Так же для каждого вида информации можно предусмотреть свой файл логов.

Полный список и расположение лог файлов следующий:

  •  /var/log/asterisk/fail2ban — Лог-файл событий модуля fail2ban
  •  /var/log/asterisk/freepbx.log — Лог-файл событий событий модулей FreePBX
  •  /var/log/asterisk/freepbx_security.log — Лог-файл событий событий безопасности
  •  /var/log/asterisk/full — Лог-файл событий Asterisk всех уровней. Этот файл чаще всего используется для поиска старых звонков.
  •  /var/log/dmesg — Лог-файл событий событий уровня ядра
  •  /var/log/httpd/access_log — Лог-файл событий доступа к Apache
  •  /var/log/httpd/error_log — Лог-файл где можно посмотреть ошибки web сервера Apache
  •  /var/log/messages — Системный журнал событий Linux
  •  /var/log/yum.log — Лог-файл где записаны действия выполненных через yum

Обратите внимание, что в зависимости от используемого дистрибутива Linux место расположение log-файлов может отличаться.Тем не менее, настраивать какие-то дополнительные условия для логирования мы не будем. Как было написано выше – стандартный путь логов следующий: /var/log/asterisk. Перейдем туда

Путь к логам

Как можете видеть – здесь содержится огромное количество логов очередей, фаервола и много чего еще, но в данном случае нас интересует полный лог станции с одноименным названием full. Есть два способа прочесть содержимое:

1 С помощью текстового редактора (vi/vim/nano)
2 С помощью утилиты grep

И мы даже не будем рассматривать просмотр лога с помощью текстового редактора. Вне зависимости от того, какой текстовый редактор вы будите использовать открывать весь лог-файл не оптимальное решение и удобнее использовать для этого утилиту grep. Grep это утилита командной строки которая используется для фильтрации текста по заданному шаблону. Пример: предположим, что интересующий момент произошел сегодня ночью (20 августа) в 04:42:58.

Используем следующую команду # grep ’04:42:58′ full


Grep_1

Как можете видеть утилита вывела все события которые произошли в указанное время, однако нам нужен полный лог связанный с этим событием и есть возможность его вывести игнорируя все остальные события. Для этого обратите внимание на значение [C-00004aec]
Детальный лог

Это UID звонка и для каждого он уникален и позволяет по нему просмотреть все события связанные с этим звонком.

Теперь, если вы сделали все правильно, то вы можете посмотреть полный лог этого звонка от начала и до его завершения. На этом, конечно, функции grep не заканчиваются и вы ниже можете найти пару полезных ключей для grep.

Некоторые дополнительные ключи команды grep:

  •   -v : Выводи реверсивные результаты. Вместо того чтобы вывести строки где искомое было найдено — выводи те строки где искомой подстроки нет.
  •   -c : Отключает стандартный способ вывода результата и вместо этого отображает только число обозначающее количество найденых строк.
  •   -i : Делает поиск регистронезависимым
  •   -w : Ведет поиск по цельным словам. Например, при обычном поиске строки ‘200’ grep может найти слово ‘81002002020. А если используется данный ключ то будут найдены только строки где есть слово ‘200’.
  •   -l : Выводит только имена файлов, где была найдена строка.
  •   -r : Производит поиск рекурсивно по всем поддиректориям.

Этого будет более чем достаточно для просмотра логов. Подробнее по мониторингу системы вы можете узнать по следующей ссылке

Просмотр логов через Web-интерфейс

По каким-то причинам у вас не может оказаться доступа на АТС по ssh и в таком случае вы можете просмотреть логи на web-интерфейсе FreePBX с помощью модуля Asterisk Log Files. Этот модуль расположен по следующему пути: Reports — Asterisk Log Files

Путь к логу

После попадаем мы на следующую страничку


Главное меню модуля

Как можете видеть, уже без каких либо манипуляций модуль подгрузил последние логи со станции без каких либо фильтров


Просмотр логов 1

Есть возможность просматривать все логи не только за сегодняшнее число, но и за прошлые, а так же конкретно какой-то log-файл просмотреть.
Просмотр логов 2

Давайте для примера посмотрим подробную статистику по одному из звонков.


Filtre

Как можете видеть поле Filtre выполняет ту же роль что и утилита grep

Тем не менее, советуем при возможности просматривать логи подключившись к серверу напрямую используя терминальный клиент PuTTy который, к примеру, поддерживает операцию копировать/вставить, что упрощает работу при анализе лога.

Модуль Support FreePBX

Обратите внимание, что данный модуль был включен в дистрибутив начиная с 13 версиии FreePBX.

Это очень полезная секция, которая позволяет получить доступ к логам. Благодаря ей можно скачать zip-файл, который будет содержать отчет с необходимой информацией, а так же логами для дальнейшего их исследования. Чтоб попасть на страничку модуля нужно пройти по следующему пути: Admin — System Admin


Путь к модулю 1


Путь к модулю 2

И мы попадаем в System Admin.


System Admin
Здесь множество полезных утилит для администратора, но в данной статье нас интересует модуль Support.  вниз и выбираем раздел


Support 1

Выбираем раздел «Support»


Support 2

На этой странице и можно скачать zip-архив с отчетом. Путем выбора ответа Yes/No можно сформировать свой отчет. Пункты выбора следующие:

  • FreePBX Versions — Список всех установленных модулей и их версии
  • System Information — Информация об операционной системе
  • Asterisk Logs — Журналы событий Asterisk за последние 24 часа
  • Firewall Setting — Вывод текущих настроек ip-tables
  • ASTDB Dump — Полный дамп ASTBD (Не путать с MySQL)
  • License Information — Информация о лицензировании и статусе сервера
  • Dialplan — Полный дайл-план, созданный FreePBX (включая кастомные файлы _custom)
  • SIP Settings — Настройки SIP (Может содержать секретную информацию)
  • PJSIP Settings — Настройки PJSIP (Может содержать секретную информацию)
  • IAX Settings — Настройки IAX (Может содержать секретную информацию)

После того, как мы включили интересующие нас пункты чтоб сформировать отчет и скачать достаточно нажать download и загрузить архив к себе компьютер. Для теста, давайте, соберем наиболее полный отчет выставив на всех пунктах Yes.


Загрузка файлика лога

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


Просмотр содержимого

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

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

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

Сбор статистики звонков по региональным направлениям 

Глава 21

Системный мониторинг и журналирование

Хаос
присущ всем сложным вещам.

Стремитесь
с усердием.


Будда

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

logger.conf

При устранении неполадок в
системе Asterisk, вы найдете очень полезной
возможность обратиться к записям истории
о том, что происходило в системе в момент
появления проблем. Параметры для хранения
этой информации определяются в
/etc/asterisk/logger.conf.

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

Файл /etc/asterisk/logger.conf
позволяет вам определить различные
уровни журналирования для многих файлов,
если нужно. Он обладает великолепной
гибкостью, но это может привести к
запутанности.

Формат записей в файле
logger.conf следующий:

filename =>
type[,type[,type[,…]]]

Это простой файл logger.conf,
который идет с исходниками Asterisk, но не
стоит просто копировать файл примера,
мы рекомендуем использовать следующее
в вашем начальном файле logger.conf:

[general]

[logfiles]

console => notice,warning,error,dtmf

messages => notice,warning,error

;verbose => notice,warning,error,verbose

После сохранения файла, вам
нужно перезагрузить logger используя
следующую команду из оболочки:

$ asterisk -rx ‘logger reload’

или из Asterisk CLI:

*CLI> logger reload

Детализация журналирования: полезна, но опасна

Мы боролись с желанием
рекомендовать добавление следующей
строки в ваш logger.conf:

verbose => notice,warning,error,verbose

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

Используйте это. Это
фантастика. Но помните, что это нужно
отключить после завершения!

Вы можете указать любое имя
файла, но специальное имя
файла console
фактически будет
производить вывод в Asterisk CLI, а не в любой
файл на жестком диске. Все остальные
имена будут храниться в файловой системе
в каталоге /var/log/asterisk. Типы logger.conf
описаны в Таблице 24-1.

Таблица
24-1. Типы logger.conf

Тип Описание
notice Вы увидите много сообщений
во время перезагрузки, а также они
будут приходить во время обычных
вызовов. notice
просто любое событие, о котором
Asterisk хотел бы проинформировать вас.
warning Warning
(предупреждение) представляет собой
проблему, которая может быть достаточно
серьезной чтобы повлиять на вызов (в
том числе отключение вызова, потому
что поток вызова не может продолжаться).
Предупреждения нужно устранять.
error Errors
(ошибки) представляют собой значительные
проблемы в системе, которые должны
быть решены немедленно.
debug Отладка полезна только
если вы пытаетесь устранить проблемы
с кодом Asterisk. Вы не будете использовать
отладку для устранения проблем в
диалплане, но вы должны использовать
её если разработчики Asterisk попросили
вас предоставить журнал для отчетности
о проблеме. Не используйте отладку в
продакшене, поскольку количество
сохраненных записей может заполнить
жесткий диск в течение нескольких
дней.a
verbose Это один из самых полезных
типов протоколирования, но он также
является одним из наиболее рискованных;
если его оставить без присмотра, то
велика вероятность заполнения жесткого
диска.b
dtmf Журналирование DTMF может
быть полезно если вы получаете жалобы,
что вызовы неправильно маршрутизируются
от автосекретаря.
fax Этот тип протоколирования
обрабатывает сообщения связанные с
технологией факса (res_fax_spandsp
или res_fax_digium)
сохраняемые факс-регистратором.
* Будет протоколировать ВСЁ
(EVERYTHING) (и мы подразумеваем всё). Не
используйте это, если вы не представляете
последствия хранения такого объема
данных. Ничем хорошим это не закончится.

a Это не теория. Это
произошло с нами и было невесело.

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

Существует
особенность у системы логирования
Asterisk, которая может вызвать у вас
некоторое замешательство, если вы не
знаете о ней. Уровень журналирования
для типов verbose
и debug
связан с детализацией, установленной
в консоли. Это означает, что если вы
пишете лог в файл с типом verbose
или debug,
а кто-то зашел в консоль CLI и дает команду
core set verbose 0, или core set debug 0
журналирование в ваш файл журнала будет
остановлено.

Просмотр журналов Asterisk

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

Для начала, вам нужно иметь
приблизительное представление о времени,
когда возникла проблема. После того как
вы узнали приблизительное время, нужно
найти улики, которые помогут определить
вызов в запросе. Очевидно, чем больше у
вас информации о вызове, тем быстрее вы
сможете его найти.

В Asterisk 11 введена функция
ведения журнала, которая помогает с
отладкой конкретного вызова.
Протоколирование записей связанных с
вызовом в настоящее время включает
идентификатор вызова (call ID) в записи
журнала. Этот call ID может использоваться
с grep, чтобы найти все записи, связанные
с этим вызов. В следующем примере журнал
с идентификатором вызова С-00000004.

[Dec 4 08:22:32]
WARNING[14199][C-00000004]: app_voicemail.c:6286

leave_voicemail: No entry in voicemail
config file for ‘234123452’

В более ранних версиях
Asterisk, есть еще одна уловка, которую вы
можете использовать. Если, например, вы
делаете детальное ведение журнала
следует отметить, что каждый отдельный
вызов имеет идентификатор потока,
который при использовании grep часто
может помочь вам отфильтровать все, что
не относится к вызову. Например, в
следующем подробном журнале у нас есть
несколько вызовов, и поскольку вызовы
происходят одновременно, трассировка
одного вызова может быть очень запутанной:

$ tail —1000
verbose

[Mar 11 …] VERBOSE[31362] logger.c: —
IAX2/shifteight-4 answered Zap/1-1

[Mar 11 …] VERBOSE[2973] logger.c: —
Starting simple switch on ‘Zap/1-1’

[Mar 11 …] VERBOSE[31362] logger.c: ==
Spawn extension (shifteight, s, 1)

exited non-zero on ‘Zap/1-1’

[Mar 11 …] VERBOSE[2973] logger.c: —
Hungup ‘Zap/1-1’

[Mar 11 …] VERBOSE[3680] logger.c: —
Starting simple switch on ‘Zap/1-1’

[Mar 11 …] VERBOSE[31362] logger.c: —
Hungup ‘Zap/1-1’

Для фильтрации одного вызова,
мы можем произвести grep в потоке ID.
Например:

$ grep 31362
verbose

который дал бы нам следующее:

[Mar 11 …] VERBOSE[31362] logger.c: —
IAX2/shifteight-4 answered Zap/1-1

[Mar 11 …] VERBOSE[31362] logger.c: ==
Spawn extension (shifteight, s, 1)

exited non-zero on ‘Zap/1-1’

[Mar 11 …] VERBOSE[31362] logger.c: —
Hungup ‘Zap/1-1’

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

Логирование демоном Linux
syslog

Linux содержит очень мощный
движок логирования, которым Asterisk способен
воспользоваться. Сейчас обсуждаются
различные варианты syslog и описание
всех возможных способов логирования
Asterisk выходит за рамки этой книги,
достаточно сказать, что если вы хотите
вести протокол Asterisk демоном syslog,
вам просто необходимо указать следующую
строку в файле /etc/asterisk/logger.conf:

syslog.local0 => notice,warning,error ;
или любые типы, которые хотите

; регистрировать

Вы должны иметь запись в вашем
конфигурационном файле1
системного журнала (syslog) с именем
local0, которая должна
выглядеть примерно так:

local0.* /var/log/asterisk/syslog

Вы можете для
этого использовать local0
до local7, но проверьте
ваш syslog.conf чтобы убедиться что ничего
другого не использует один из этих
каналов syslog.

syslog2
это гораздо более мощный инструмент
регистрации, но он требует больше знаний,
чем логирование Asterisk напрямую в файлы.

Проверка логирования

Вы можете просмотреть статус
всех ваших настроек logger.conf через
консоль Asterisk CLI используя команду:

*CLI> logger show channels

Вы должны увидеть примерно
следующее:

Channel
Type Status Configuration

——- —- ——
————-

syslog.local0
Syslog Enabled — NOTICE WARNING ERROR VERBOSE

/var/log/asterisk/verbose
File Enabled — NOTICE WARNING ERROR VERBOSE

/var/log/asterisk/messages
File Enabled — NOTICE WARNING ERROR

Console Enabled — NOTICE
WARNING ERROR DTMF=

Ротация логов

Существует некоторая поддержка
ротации, встроенная в Asterisk, когда Asterisk
протоколирует в файлы. Ротация журналов
будет выполнена в следующих случаях:

  • Если
    вы запустили ротацию журналов в Asterisk
    CLI командой.

    • Во
      время перезагрузки конфигурации, если
      существующие файлы журнала больше 1
      Гб.
    • Если
      Asterisk получает сигнал SIGXFSZ,
      указывающий что файл для записи слишком
      велик.

    Call Detail Records (CDR) — детальная
    запись вызовов

    Система CDR в Asterisk используется
    для логирования истории вызовов в
    системе. В некоторых решениях эти записи
    используются для биллинга. В других —
    запись вызовов используется для анализа
    количества вызовов во времени.
    Её можно
    также использовать как инструмент
    отладки администратора Asterisk.

    Содержание CDR

    CDR имеет несколько полей,
    которые включены по умолчанию. Таблица
    24-2 приводит их список.

    Таблица
    24-2. Поля CDR по умолчанию

    Опция Значение/Пример Примечание
    accountcode 12345 Идентификатор учетной
    записи. Это поле определяется
    пользователем и пустое по умолчанию.
    src 12565551212 ID вызывающего абонента. Он
    устанавливается автоматически и
    доступен только для чтения.
    dst 102 Добавочный номер назначения
    для вызова. Это поле устанавливается
    автоматически и доступно только для
    чтения.
    dcontext PublicExtensions Контекст назначения для
    вызова. Это поле устанавливается
    автоматически и доступно только для
    чтения.
    clid «Big
    Bird» <12565551212>
    Полный идентификатор
    вызывающего абонента, включая имя
    вызывающего абонента. Это поле
    устанавливается автоматически и
    доступно только для чтения.
    channel SIP/0004F2040808-a1bc23ef Канал вызывающей
    стороны. Это поле устанавливается
    автоматически и доступно только для
    чтения.
    dstchannel SIP/0004F2046969-9786b0b0 Канал
    вызываемой стороны. Это поле
    устанавливается автоматически и
    доступно только для чтения.
    lastapp Dial Последнее приложение
    диалплана, которое было выполнено.
    Это поле устанавливается автоматически
    и доступно только для чтения.
    lastdata SIP/0004F2046969,30,tT Аргументы переданные в
    lastapp.
    Это поле устанавливается автоматически
    и доступно только для чтения.
    start 2010-10-26
    12:00:00
    Время начала вызова. Это
    поле устанавливается автоматически
    и доступно только для чтения.
    answer 2010-10-26
    12:00:15
    Время ответа на вызов. Это
    поле устанавливается автоматически
    и доступно только для чтения.
    end 2010-10-26
    12:03:15
    Время окончания вызова. Это
    поле устанавливается автоматически
    и доступно только для чтения.
    duration 195 Количество секунд между
    началом вызова и окончанием. Это поле
    устанавливается автоматически и
    доступно только для чтения.
    billsec 180 Количество секунд между
    ответом на вызов и окончанием вызова.
    Это поле устанавливается автоматически
    и доступно только для чтения.
    disposition ANSWERED Индикатор того, что случилось
    с вызовом. Это может быть NO
    ANSWER, FAILED,
    BUSY, ANSWERED
    или UNKNOWN.
    amaflags DOCUMENTATION Automatic Message Accounting (AMA) флаг
    связанный с этим вызовом. Он может
    быть одним из следующего: OMIT,
    BILLING, DOCUMENTATION
    или Unknown.
    userfield PerMinuteCharge:0.02 Поле пользователя общего
    назначения. По умолчанию это поле
    пусто и может быть задано в виде
    пользовательской строки.a
    uniqueid 1288112400.1 Уникальный ID
    канала src. Это
    поле устанавливается автоматически
    и доступно только для чтения.

    a
    userfield не так
    актуально в настоящее время, как это
    было раньше. Пользовательские переменные
    CDR являются более гибким способом
    получить пользовательские данные в
    CDR.

    Все поля записи CDR можно
    получить в диалплане Asterisk с помощью
    функции CDR(). Функция
    CDR() также используется
    для установки полей CDR, которые определяются
    для пользователя.

    exten => 115,1,Verbose(Call start time:
    ${CDR(start)})

    same => n,Set(CDR(userfield)=zombie
    pancakes)

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

    exten => 115,1,NoOp()

    same =>
    n,Set(CDR(mycustomfield)=coffee)

    same => n,Verbose(I need some more
    ${CDR(mycustomfield)})

    Если вы решите
    использовать пользовательские переменные
    CDR убедитесь что реализация CDR способна
    их регистрировать.

    Для просмотра встроенной
    документации по функции CDR(),
    выполните следующую команду в консоли
    Asterisk:

    *CLI> core show function CDR

    В дополнение к функции CDR(),
    есть приложения в диалплане, которые
    могут использоватся для обработки CDR
    записей. Мы рассмотрим эти приложения
    далее.

    Приложения диалплана

    Есть несколько приложений
    диалплана, которые могут обрабатывать
    CDR для текущего вызова. Для получения
    списка приложений CDR, которые загружаются
    в текущую версию Asterisk, мы можем использовать
    следующую команду CLI:

    *CLI> core show applications like CDR

    -= Matching Asterisk Applications =-

    ForkCDR: Forks the Call Data Record.

    NoCDR: Tell Asterisk to not
    maintain a CDR for the current call

    ResetCDR: Resets the Call Data Record.

    -= 3 Applications Matching =-

    Каждое приложение имеет
    встроенную в Asterisk документацию, которую
    можно просмотреть с помощью следующей
    команды:

    *CLI> core show application
    <application name>

    cdr.conf

    Файл cdr.conf имеет раздел
    [general], который
    содержит параметры, применяемые ко всей
    системе CDR. Дополнительные необязательные
    разделы могут существовать в этом файле,
    они применяются к конкретному логированию
    CDR модулей. Таблица 24-3 приводит список
    доступных опций раздела [general].

    Таблица
    24-3. Раздел cdr.conf [general]

    Опция Значение/Пример Примечание
    enable yes Включает логирование CDR. По
    умолчанию — yes.
    unanswered no Протоколирует неотвеченные
    вызовы. Обычно только отвеченные
    вызовы попадают в CDR. Протоколирование
    всех попыток вызова может привести к
    большому числу дополнительных записей
    о вызовах, а в большинстве своем они
    не нужны. По умолчанию — no.
    end before
    hexten
    no Закрывает вывод CDR до запуска
    расширения h в
    диалплане Asterisk. Обычно CDR не прекращается
    пока диалплан полностью не завершит
    работу. По умолчанию — no.
    initiated
    seconds
    no При вычислении поля billsec
    всегда округляется вверх. Например,
    если разница между ответом и завершением
    составляет 1 секунду и 1 микросекунду,
    billsec будет
    установлен на 2 секунды. Это помогает
    гарантировать поведение CDR Asterisk
    аналогичному поведению телекоммуникационных
    компаний. По умолчанию — no.
    batch no Очередь записей CDR будет
    протоколирована в пакетах, а не
    синхронизирована по завершению каждого
    вызова. Это предотвращает протоколирование
    CDR блокированных завершенных вызовов
    с разрушенным процессом Asterisk.
    Использование режима batch
    может быть невероятно полезно при
    работе с базой данных, которая может
    быть медленной для обработки запросов.
    Значение по умолчанию — no,
    но мы рекомендуем его включить.a
    size 100 Устанавливает число записей
    CDR, находящихся в очереди прежде чем
    они запишутся в пакетном режиме. По
    умолчанию значение — 100.
    time 300 Устанавливает максимальное
    количество секунд, которое CDR записи
    будут ждать в очереди, прежде чем пакет
    будет сохранен. Процесс регистрации
    пакета CDR будет выполнен по завершению
    этого периода времени, даже если размер
    не был достигнут. Значение по умолчанию
    составляет 300
    секунд.
    scheduler only no Устанавливает когда процесс
    пакетной обработки CDR должен порождать
    новый поток или запланировано новое
    содержимое пакета CDR. Значение по
    умолчанию — no и
    мы рекомендуем не менять его.
    safe shutdown yes Блокирует выключение
    Asterisk, чтобы убедиться, что все в очереди
    записей CDR сохранены в журнал. По
    умолчанию — yes и
    мы рекомендуем оставить его таким,
    так как эта опция предотвращает потери
    важных данных.

    a
    Недостатком включения этой опции есть
    то, что если Asterisk слетит или умреть по
    какой-либо причине, записи CDR будут
    потеряны, так как они хранятся только
    в памяти, а процесса Asterisk уже не существует.
    См. safeshutdown для получения дополнительной
    информации.

    Конечные решения (Backends)

    Модули конечных решений
    Asterisk CDR реализуют различные пути
    логирования CDR. Большинство конечных
    решений CDR требуют определенной
    конфигурации для своего запуска.

    cdr_adaptive_odbc

    Как следует из названия модуль
    cdr_adaptive_odbc позволяет
    сохранять CDR в
    базе данных через ODBC. Часть имени
    «adaptive» указывает на то, что он
    приспосабливается к структуре таблицы:
    нет статической структуры таблицы,
    которая должна быть использована с этим
    модулем. При загрузке модуля (или
    перезагрузке) он читает структуру
    таблицы. При логировании CDR, он ищет
    переменную CDR, которая соответствует
    каждому имени столбца. Это относится
    как к встроенным CDR переменным, так и
    пользовательским. Если вы хотите
    логировать CDR переменные канала, просто
    создайте столбец с названием channel.

    Добавление содержания
    пользовательских CDR это так просто, как
    установить их в диалплане. Например,
    если мы хотим логировать User-Agent
    предоставляемый устройством SIP, мы можем
    добавит пользовательскую переменную
    CDR:

    exten =>
    105,n,Set(CDR(useragent)=${CHANNEL(useragent)})

    Для того, чтобы эта переменная
    CDR записывалась в базу данных
    cdr_adaptive_odbc, все,
    что нужно сделать — это создать столбец
    с именем useragent.

    Несколько таблиц могут быть
    настроены в файле конфигурации
    cdr_adaptive_ odbc. Каждая
    имеет в свой собственный раздел
    конфигурации. Название раздела может
    быть каким угодно, модуль не использует
    его. Вот пример простой таблицы
    конфигурации:

    [mytable]

    connection = asterisk

    table = asterisk_cdr

    Более подробный
    пример установок базы данных для
    логирования CDR может быть найден в
    «Хранение
    записей деталей вызовов (CDR)».

    Таблица 24-4, содержит список
    опций, которые можно определить для
    таблицы в разделе конфигурационного
    файла cdr_adaptive_odbc.conf.

    Таблица
    24-4. Таблица конфигурационных опций
    cdr_adaptive_odbc.conf

    Опция Значение/Пример Примечание
    connection pgsql1 Соединение с базой данных,
    которая будет использоваться. Это
    ссылка на настроеное соединение в
    res_odbc.conf. Поле является обязательным.
    table asterisk_cdr Имя таблицы. Это поле является
    обязательным.
    usegmtime no Указывает, следует ли
    временные метки логирования использовать
    по GMT, а не местному времени. По умолчанию
    значение этой опции — no.

    В дополнение к паре полей
    ключ/значение (key/value), которые показаны
    в предыдущей таблице, cdr_adaptive_odbc.conf
    позволяет использовать несколько других
    элементов конфигурации. Во-первых, это
    псевдоним столбца. Обычно, переменные
    CDR записываются в столбцах с одноименным
    названием. Псевдоним позволяет изменять
    имя, которое будет отображаться в колонке
    с другим именем. Синтаксис такой:

    alias <CDR variable> =>
    <column name>

    Вот пример отображение
    колонки, используя параметр alias:

    alias src => source

    Кроме того, можно задать
    фильтр контента. Это позволяет определить
    критерии, которым должны соответствовать
    записи, вставленные в таблицу. Синтаксис:

    filter <CDR variable> =>
    <content>

    Вот пример фильтра содержания:

    filter accountcode => 123

    Наконец, cdr_adaptive_odbc.conf
    позволяет определять статическое
    содержание для столбцов. Это может быть
    полезно когда используется вместе с
    набором filters.
    Статический контент может помочь
    дифференцировать записи, которые были
    вставлены в одну таблицу по различным
    разделам конфигурации. Синтаксис для
    статического содержимого:

    static <«Static Content Goes
    Here»>
    => <column name>

    Это пример определения
    статического содержания для вставки с
    CDR:

    static «My Content» =>
    my_identifier

    cdr_csv

    cdr_csv —
    это очень простой модуль CDR, который
    протоколирует CDR в CSV файл (значения
    разделены запятыми). Файл
    /var/log/asterisk/cdr-csv/Master.csv. Пока логирование
    CDR включено в cdr.conf и этот модуль
    загружен, CDR будет логироваться в файл
    Master.csv.

    Таблица
    24-5. Параметры раздела cdr.conf [csv]

    Опция Значение/Пример Примечание
    usegmtime no Записывает временные метки
    по GMT, а не по локальному времени. По
    умолчанию — no.
    loguniqueid no Записывает переменную CDR
    uniqueid. По умолчанию
    — no.
    loguserfield no Записывает переменную CDR
    userfield. По умолчанию
    — no.
    accountlogs yes Создает отдельный файл CSV
    для каждого значения переменной CDR
    accountcode. По
    умолчанию — yes.

    Порядок переменных CDR в
    CSV-файлах создаваемых модулем cdr_csv:

    <accountcode>,<src>,<dst>,<dcontext>,<clid>,<channel>,<dstchannel>,<lastapp>,

    <lastadata>,<start>,<answer>,<end>,<duration>,<billsec>,<disposition>,

    <amaflags>[,<uniqueid>][,<userfield>]

    cdr_custom

    Этот модуль CDR позволяет
    задавать пользовательский формат CDR
    записей в файле протоколирования. Этот
    модуль наиболее часто используется для
    индивидуальных выводов CSV. Файл
    конфигурации для этого модуля
    /etc/asterisk/cdr_custom.conf. В этом файле должен
    быть один раздел под названием [mappings].
    Этот раздел содержит соответствия между
    именем файла и шаблоном для CDR. Шаблон
    задается с помощью функций диалплана
    Asterisk.

    В следующем примере показана
    конфигурация для cdr_custom,
    она включает логирование в файл CDR —
    Master.csv. Этот файл будет создан в
    /var/log/asterisk/cdr-custom/Master.csv. Шаблон, который
    был определен, использует две функции
    диалплана CDR() и
    CSV_QUOTE(). CDR()
    извлекает значения из сохраненого CDR.
    Функция CSV_QUOTE()
    гарантирует, что значения экранируются
    для формата файла CSV:

    [mappings]

    Master.csv =>
    ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},

    ${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},

    ${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},

    ${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},

    ${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},

    ${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},

    ${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},

    ${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},

    ${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})}

    В реальном файле
    конфигурации значение в Master.csv должно
    быть в одной строке.

    cdr_manager

    Модуль cdr_manager записывает в
    CDR события Asterisk Manager Interface (AMI), которые
    мы детально обсуждали в Главе 20. Этот
    модуль настраивается в файле
    /etc/asterisk/cdr_manager.conf. Первый раздел в
    этом файле [general],
    который содержит простой параметр для
    включения этого модуля (по умолчанию
    значение — no):

    [general]

    enabled = yes

    Другой раздел в cdr_manager.conf
    — это раздел [mappings].
    Он позволяет добавлять пользовательские
    переменные CDR для событий менеджера.
    Синтаксис такой:

    <CDR variable> => <Header
    name>

    Это пример добавления двух
    пользовательских переменных CDR:

    [mappings]

    rate => Rate

    carrier => Carrier

    При такой конфигурации, записи
    CDR будут отображаться как события в
    интерфейсе менеджера. Чтобы создать
    пример события менеджера, мы используем
    следующий пример диалплана:

    exten => 110,1,Answer()

    same => n,Set(CDR(rate)=0.02)

    same => n,Set(CDR(carrier)=BS&S)

    same => n,Hangup()

    Эта команда используется для
    выполнения этого расширения и генерирует
    образец события менеджера:

    *CLI> console dial [email protected]

    В итоге, вот пример события
    менеджера, образующегося в результате
    этого тестового вызова:

    Event: Cdr

    Privilege: cdr,all

    AccountCode:

    Source:

    Destination: 110

    DestinationContext: testing

    CallerID:

    Channel: Console/dsp

    DestinationChannel:

    LastApplication: Hangup

    LastData:

    StartTime: 2010-08-23 08:27:21

    AnswerTime: 2010-08-23 08:27:21

    EndTime: 2010-08-23 08:27:21

    Duration: 0

    BillableSeconds: 0

    Disposition: ANSWERED

    AMAFlags: DOCUMENTATION

    UniqueID: 1282570041.3

    UserField:

    Rate: 0.02

    Carrier: BS&S

    cdr_mysql

    Этот модуль позволяет размещать
    CDR в базе данных MySQL. Мы рекомендуем
    использовать в новой инсталляции
    cdr_adaptive_odbc вместо
    него.

    cdr_odbc

    Этот модуль обеспечивает
    старый интерфейс ODBC для логирования
    CDR. Новые установки должны использовать
    вместо него cdr_adaptive_odbc.

    cdr_pgsql

    Этот модуль позволяет размещать
    CDR в базе данных PostgreSQL. Мы рекомендуем
    использовать в новой инсталляции
    cdr_adaptive_odbc вместо
    него.

    cdr_radius

    Модуль cdr_radius
    позволяет размещать CDR на сервере RADIUS.
    Когда используется это модуль, каждая
    CDR сообщается RADIUS серверу как одно
    событие останова. Этот модуль настраивается
    в файле /etc/asterisk/cdr.conf. Опции для этого
    модуля размещены в разделе с именем
    [radius]. Доступные
    параметры перечислены в Таблице 24-6.

    Таблица
    24-6. Параметры раздела cdr.conf [radius]

    Опция Значение/Пример Примечание
    usegmtime no Включает логирование с
    временными метками по GMT, а не по
    локальному времени. По умолчанию —
    yes.
    log unique id no Включает логирование
    переменной CDR uniqueid.
    По умолчанию — yes.
    loguserfield no Включает логирование
    переменной CDR userfield.
    По умолчанию — yes.
    radiuscfg /etc/radiusclient-ng/radiusclient
    .conf
    Задает расположение файла
    конфигурации radiusclient-ng. По умолчанию
    /etc/radiusclient-ng/radiusclient.conf

    cdr_sqlite

    Этот модуль позволяет размещать
    CDR в базе данных SQLite используя SQLite версии
    2. Если у вас нет особой необходимости
    в SQLite версии 2 вместо 3, мы рекомендуем,
    чтобы все новые установки использовали
    cdr_sqlite3_custom.

    Этот модуль не требует
    настройки работы. Если модуль был
    скомпилирован и загружен в Asterisk, он
    будет вставлять CDR в таблицу называемую
    cdr в базе данных размещенной в
    /var/log/asterisk/cdr.db.

    cdr_sqlite3_custom

    Этот модуль CDR вставляет CDR в
    базу данных SQLite используя SQLite версии
    3. База данных, созданная этим модулем
    находится в /var/log/asterisk/master.db. Этот
    модуль требует наличия конфигурационного
    файла /etc/asterisk/cdr_sqlite3_custom.conf.
    Конфигурационный файл определяет имя
    таблицы, а также настраивает какие
    переменные CDR будут вставлены в базу
    данных:

    [master]

    table = cdr

    ;

    ; Список имен столбцов,
    используемых при вставке CDRs.

    ;

    columns => calldate, clid, dcontext,
    channel, dstchannel, lastapp, lastdata,

    duration, billsec, disposition, amaflags, accountcode, uniqueid,
    userfield,

    test

    ;

    ; Сопоставьте содержимое
    CDR с ранее указанными столбцами.

    ;

    values =>
    ‘${CDR(start)}’,’${CDR(clid)}’,’${CDR(dcontext)}’,’${CDR(channel)}’,

    ‘${CDR(dstchannel)}’,
    ‘${CDR(lastapp)}’,’${CDR(lastdata)}’,’${CDR(duration)}’,

    ‘${CDR(billsec)}’,’${CDR(disposition)}’, ‘${CDR(amaflags)}’,

    ‘${CDR(accountcode)}’,’${CDR(uniqueid)}’,’${CDR(userfield)}’,’${CDR(test)}’

    В файле cdr_
    sqlite3_custom.conf
    содержимое столбцов
    (columns)
    и значения каждой опции (values)
    должны быть в одной строке.

    cdr_syslog

    Этот модуль позволяет
    логировать CDR используя syslog. Для его
    включения сперва добавьте конфигурационный
    файл системы syslog — /etc/syslog.conf.
    Например:

    local4.* /var/log/asterisk/asterisk-cdr.log

    Asterisk модуль также имеет
    конфигурационный файл. Добавьте следующий
    раздел в /etc/asterisk/cdr_syslog.conf:

    [cdr]

    facility = local4

    priority = info

    template = «We received a call from
    ${CDR(src)}»

    Вот пример вывода syslog с
    помощью этой конфигурации:

    $ cat
    /var/log/asterisk/asterisk-cdr.log

    Aug 12 19:17:36 pbx cdr: «We received
    a call from 2565551212»

    cdr_tds

    Модуль cdr_tds
    использует библиотеку FreeTDS чтобы получить
    возможность отправлять CDR в Microsoft SQL
    Server и Sybase базу данных. Можно использовать
    FreeTDS с unixODBC поэтому
    мы рекомендуем использовать
    cdr_adaptive_odbc вместо
    этого модуля.

    Пример Call Detail Records

    Мы будем использовать модуль
    cdr_custom для иллюстрации
    нескольких примеров CDR записей для
    различных сценариев вызова. Конфигурация
    для /etc/asterisk/cdr_custom.conf показана в
    разделе «cdr_custom».

    Односторонний вызов

    В этом примере мы покажем как
    CDR выглядит для простого одностороннего
    вызова. В частности, мы будем использовать
    пример пользовательского вызова и
    проверим свою голосовую почту. Вот
    расширение из /etc/asterisk/extensions.conf:

    exten =>
    *98,1,VoiceMailMain(@${GLOBAL(VOICEMAIL_CONTEXT)})

    Эта запись CDR из
    /var/log/asterisk/cdr-custom/Master.csv была создана
    как результат вызова этого номера:

    «»»Console»»
    <2565551212>»,»2565551212″,»*98″,»UserServices»,

    «Console/dsp»,»»,
    «VoiceMailMain»,»@shifteight.org»,»2010-08-16
    01:08:44″,

    «2010-08-16 01:08:44″,»2010-08-16
    01:08:53″,»9″,»9″,»ANSWERED»,

    «DOCUMENTATION»,»»,»1281935324.0″,»»,0

    Двухсторонний вызов

    В следующем примере мы покажем
    как выглядит CDR для простого двухстороннего
    вызова. Мы имеем один SIP телефон, вызывающий
    другой SIP телефон. Ответ на вызов, а затем
    повешенную трубку после короткого
    периода времени. Вот расширение, которое
    было вызвано:

    exten => 101,1,Dial(SIP/0000FFFF0002)

    Вот CDR, который был запротоколирован
    в Master.csv в результате этого вызова:

    «»»Console»»
    <2565551212>»,»2565551212″,»101″,»LocalSets»,»Console/dsp»,

    «SIP/0000FFFF0002-00000000″,»Dial»,»SIP/0000FFFF0002″,»2010-08-16
    01:16:10″,

    «2010-08-16 01:16:16″,»2010-08-16
    01:16:29″,»19″,»13″,»ANSWERED»,

    «DOCUMENTATION»,»»,»1281935770.2″,»»,2

    Предостережения

    Система CDR в Asterisk работает
    очень хорошо для достаточно простых
    сценариев вызова. Однако, когда сценарии
    вызова становятся более сложными,
    включая звонки на нескольких сторон,
    трансфер, парковку и другие подобные
    функции, система CDR начинает быстро
    падать. Многие пользователи сообщают,
    что записи не показывают всей информации,
    которую они ожидали. Многие исправления
    ошибок были сделаны для решения некоторых
    вопросов, но стоимость ошибки или
    изменения в поведении при внесении
    изменений в этой области очень высока,
    так как эти записи используются при
    выставлении счета.

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

    CEL (Channel Event Logging)

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

    Типы событий канала

    Каждая запись CEL представляет
    событие, которое произошло для канала
    в системе Asterisk. Таблица 24-7 содержит
    список событий, которые генерирует
    Asterisk когда происходит вызов.

    Таблица
    24-7. Типы событий CEL

    Типы событий CEL Описание
    CHAN_START Канал был создан.
    CHAN_END Канал был разрушен.
    LINKEDID_END Последний канал с заданным
    linkedid был уничтожен.
    ANSWER Канал ответил. Канал создан
    для исходящего вызова. Это событие
    будет создано, когда ответит удаленный
    конец.
    HANGUP Канал повесил трубку. Как
    правило, это событие будет следовать
    очень быстро за событием CHAN_END.
    Разница в том, что это событие происходит,
    как только получен запрос hangup, в то
    время как CHAN_END
    происходит после завершения Asterisk
    процедуры очистки вызова и все ресурсы,
    связанные с этим каналом были
    освобождены.
    APP_START Отслеживаемое приложение
    начало выполняться на канале.
    Отслеживаемые приложения задаются в
    файле конфигурации основной ячейки,
    который описан в разделе «cel.conf”.
    APP_END Отслеживаемое
    приложения прекратило выполнение на
    канале.
    PARK_START Канал был припаркован.
    PARK_END Канал снял парковку.
    BRIDGE_START Запущен соединения каналов.
    Это событие наступает, когда два канала
    соединяются с помощью приложений
    Dial() или Queue().
    BRIDGE_END Соединение каналов был
    закрыто.
    BRIDGE_UPDATE Произошло обновление
    соединения. Это событие быдет происходить
    если имя канала или другая информация
    были изменены во время соединения.
    BLINDTRANSFER Канал выполнил слепой
    трансфер.
    ATTENDEDTRANSFER Канал выполнил трансфер с
    уведомлением.
    USER_DEFINED Произошло пользовательское
    событие канала. Это событие создано
    с использованием приложения
    CELGenUserEvent().

    Есть еще несколько событий,
    которые были определены, но еще не
    используются в любом месте кода Asterisk.
    Предположительно, некоторые будущие
    версии будут генерировать эти события
    в нужном месте. Они перечислены в Таблице
    24-8.3

    Таблица
    24-8. Определённые, но не используемые
    типы событий CEL

    Тип события CEL Описание
    CONF_ENTER Канал, который подключается
    к комнате конференции.
    CONF_EXIT Канал, который отключился
    от комнаты конференции.
    CONF_START Конференция была начата.
    Это событие происходит, когда первый
    канал входит в комнату конференции.
    CONF_END Конференция была закончена.
    Это событие происходит, когда последний
    канал покидает комнату конференции.

    3WAY_START Старт трехстороннего вызова.
    3WAY_END Завершение трехстороннего
    вызова.
    TRANSFER Основной трансфер был
    выполнен.
    HOOKFLASH Канал сообщил о событии
    сигнал отбоя (hookflash).

    Содержание событий канала

    Каждое событие CEL содержит
    поля перечисленные в таблице Таблица
    24-9:

    Таблица
    24-9. Поля событий CEL:

    Имя поля Значение/Пример Примечания
    eventtype CHAN_START Имя события. Список событий,
    которые могут произойти можно найти
    в Таблице 24-7.
    eventtime 2010-08-19
    07:27:19
    Время когда произошло
    событие.
    cidname Julie Bryant Имя caller ID установленное на
    канале связанным с этим событием .
    cidnum 18435551212 Номер caller ID установленный
    на канале связанным с этим событием.
    cidani 18435551212 Номер Automatic Number Identification
    (ANI) установленный на канале связанным
    с этим событием.
    cidrdnis 18435551234 Перенаправление номера
    установленного на канале связанным
    с этим событием.
    ciddnid 18435550987 Вызываемый номер установленный
    на канале связанным с этим событием.
    exten 101 Расширение в диалплане,
    которое сейчас начало выполняться.
    context LocalSets Контекст для расширения в
    диалплане, которое сейчас начало
    выполняться.
    channame SIP/0004F2060EB4-00000010 Имя канала связанное с этим
    событием.
    appname Dial Имя приложения диалплана
    начавшее сейчас выполняться.
    appdata SIP/0004F2060E55 Аргументы, передаваемые
    приложению диалплана, которое сейчас
    начало выполняться.
    amaflags DOCUMENTATION Флаг Automatic Message Accounting (AMA)
    асоциируется с этим вызовом. Может
    принимать одно из следующих значений:
    OMIT, BILLING, DOCUMENTATION, или Unknown.
    accountcode 1234 account ID. Это поле определяется
    пользователем и по умолчанию пустое.
    uniqueid 1282218999.18 Уникальный ID для канала,
    который связан с этим событием.
    userfield I like
    waffles!
    Содержание пользовательского
    события.
    linkedid 1282218999.18 ID каждого вызова. Этот ID
    позволяет связать воедино несколько
    событий из нескольких каналов, которые
    являются частью одного и того же
    логического вызова. ID исходит от
    uniqueid первого
    канала в вызове.
    peer SIP/0004F2060E55-00000020 Название канала соединенного
    с каналом, определенным в channame.

    Некоторые содержания событий
    CEL определяются пользователем. Например,
    userfield определяется
    пользователем и будет пустым по умолчанию.
    Чтобы установить в него какое-то значение,
    используйте функцию диалплана CHANNEL().
    Вот пример определения userfield
    для канала:

    exten => 101,1,Set(CHANNEL(userfield)=I
    like waffles!)

    Приложения диалплана

    Система CEL включает простые
    приложения диалплана, которые находятся
    в модуле app_celgenuserevent.so. Эти приложения
    используют созданные пользовательские
    события типа EV_USER_EVENT.
    Практический пример использования
    этого может быть логирование выбора
    звонящих в меню:

    exten =>
    7,1,CELGenUserEvent(MENU_CHOICE,Caller chose option 7)

    Для полной текущей информации
    о синтаксисе приложения CELGenUserEvent()
    используйте встроенную документацию
    в Asterisk CLI:

    *CLI> core show application
    CELGenUserEvent

    cel.conf

    Система CEL имеет простой
    конфигурационный файл /etc/asterisk/cel.conf.
    Все параметры, заданные здесь влияют
    на обработку CEL независимо от модуля
    логирования, находящегося в работе.
    Таблица 24-10 показывает параметры, которые
    существуют в этом файле. Все они должны
    быть установлены в разделе [general]
    конфигурационного файла.

    Таблица
    24-10. cel.conf раздел параметров [general]

    Опция Значение/Пример Примечание
    enable yes Включает/Отключает CEL. По
    умолчанию — no.
    apps Dial,queue Устанавливает приложение
    диалплана для отслеживания. По умолчанию
    для отслеживания приложений нет.
    События EV_APP_START
    и EV_APP_END будут
    генерироваться когда каналы запустят
    и остановят выполнение любых
    отслеживаемых приложений.
    events CHAN_START,CHAN_END,
    ANSWER,HANGUP
    Списки генерируемых событий.
    Это полезно, если вы заинтересованы
    только в подмножестве событий,
    генерируемых CEL. Если же хотите увидеть
    все события, установите эту опцию в
    ALL. Значение по
    умолчанию не генерирует события.
    dateformat %F
    %T
    Указывает
    формат даты когда событие CEL содержит
    отметку времени. Сведения о синтаксисе
    см. в руководстве для strftime,
    запустив man
    strftime
    в командной
    строке. Формат по умолчанию для метки
    времени CEL second.microseconds
    с эпохи.

    Как минимум для
    начала использования CEL, вы должны
    установить параметры enable
    и events в
    /etc/asterisk/cel.conf.

    Конечные решения (Backends)

    Как и в системе CDR есть ряд
    модулей, доступных для регистрации CEL
    событий. На самом деле, все CEL модули
    были получены из модулей CDR, поэтому их
    конфигурация очень похожа. В дополнение
    к параметрам конфигурации для cel.conf,
    которые были описаны в предыдущем
    разделе, эти модули требуют настройки,
    чтобы заставить их работать.

    cel_odbc

    Модуль cel_odbc.so предоставляет
    возможность протоколировать события
    CEL в базу данных с помощью ODBC. Этот модуль
    является не совсем таким как CDR для ODBC.
    Для событий CEL нет пользовательских
    переменных. Тем не менее, этот модуль
    будет по-прежнему приспосабливаться к
    структуре базы данных в том, что он будет
    логировать поля событий CEL, для которых
    имеются соответствующие столбцы и не
    будет выдавать ошибки если нет столбца
    для каждого поля. Конфигурация для этого
    модуля находится в /etc/asterisk/cel_odbc.conf.

    Несколько таблиц могут быть
    настроены в файле конфигурации cel_odbc.
    Каждая имеет свой раздел конфигурации.
    Название раздела может быть каким
    угодно, модуль не использует его. Вот
    пример простой таблицы конфигурации:

    [mytable]

    connection = asterisk

    table = asterisk_cel

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

    • eventtype
    • eventtime
    • userdeftype
    • cid_name
    • cid_num
    • cid_ani
    • cid_rdnis
    • cid_dnid
    • exten
    • context
    • channame
    • appname
    • appdata
    • accountcode
    • peeraccount
    • uniqueid
    • linkedid
    • amaflags
    • userfield
    • peer

    Таблица 24-11 показывает
    сопоставление типов событий и их целых
    значения, которые будут вставлены в
    столбец eventtype базы
    данных.

    Таблица
    24-11. Тип события отображаемое в целом
    значении для столбца eventtype

    Тип события Целочисленное значение
    CHANNEL_START 1
    CHANNEL_END 2
    HANGUP 3
    ANSWER 4
    APP_START 5
    APP_END 6
    BRIDGE_START 7
    BRIDGE_END 8
    CONF_START 9
    CONF_END 10
    PARK_START 11
    PARK_END 12
    BLINDTRANSFER 13
    ATTENDEDTRANSFER 14
    TRANSFER 15
    HOOKFLASH 16
    3WAY_START 17
    3WAY_END 18
    CONF_ENTER 19
    CONF_EXIT 20
    USER_DEFINED 21
    LINKEDID_END 22
    BRIDGE_UPDATE 23
    PICKUP 24
    FORWARD 25

    Таблица 24-12 показывает
    параметры, которые могут быть определены
    в разделе конфигурации таблицы в файле
    cel_odbc.conf.

    Таблица
    24-12. Таблица конфигурации cel_odbc.conf

    Опция Значение/Пример Примечание
    connection pgsql1 Определяет, какая база
    данных будет использоваться. Это
    ссылка на настроенное соединение в
    res_odbc.conf. Это поле является
    обязательным.
    table asterisk_cdr Определяет имя таблицы. Это
    поле обязательно.
    usegmtime no Включает/выключает при
    логировании использование временных
    меток GMT, а не локального времени. По
    умолчанию значение этой опции — no.

    В дополнение к паре полей
    ключ/значение, которые показаны в
    предыдущей таблице, cel_odbc.conf позволяет
    несколько других элементов конфигурации.
    Во-первых, это псевдоним столбца. Как
    правило, поля CEL записываются в столбцах
    с одноименным названием. alias
    позволяет отображать переменную с
    другим именем. Синтаксис:

    alias <CEL field> =>
    <column name>

    Вот пример отображение
    колонки, используя параметр alias:

    alias exten => extension

    Кроме того, можно задать
    фильтр контента. Это позволяет определить
    критерии, которым должны соответствовать
    записи, вставляемые в таблицу. Синтаксис
    такой:

    filter <CEL field> =>
    <content>

    Вот
    пример фильтра содержания:

    filter appname => Dial

    Наконец, cel_odbc.conf позволяет
    указать статический контент для столбца.
    Это может быть полезно когда используется
    совместно с фильтром. Статический
    контент может помочь различить записи,
    которые были вставлены в одну таблицу
    по различным разделам конфигурации.
    Синтаксис для статического контента
    такой:

    static <«Static Content Goes Here»>
    => <column name>

    Вот пример определяющий
    статический контент для записи с CEL
    событием:

    static «My Content» =>
    my_identifier

    cel_custom

    Этот модуль CEL позволяет
    логировать события CEL в
    пользовательском формате. Чаще всего
    он используется для настройки данных
    CSV. Файл конфигурации для этого модуля
    /etc/asterisk/cel_custom.conf. В файле должен быть
    один раздел с названием [mappings].
    Этот раздел содержит сопоставления
    между именами файлов и пользовательскими
    шаблонами для событий CEL. Шаблоны задаются
    с помощью функций диалплана Asterisk и
    нескольких специальных переменных CEL.

    Следующий пример — это простая
    конфигурация для cel_custom,
    которая включает один файл протокола
    CEL — Master.csv. Этот файл будет создан в
    /var/log/asterisk/cel-custom/Master.csv. Шаблон, который
    будет определен, использует функции
    диалплана CHANNEL(),
    CALLERID() и CSV_QUOTE().
    Функция CSV_QUOTE()
    проверяет что значения правильно
    подготовлены для формата CSV-файла. Этот
    пример также рассматривает некоторые
    специальные переменные CEL, которые
    перечислены в Таблице 24-13.

    Таблица
    24-13. Переменные CEL, доступные для
    использования в [mappings]

    Переменная CEL Значение Описание
    ${eventtype} CHAN_START Имя события CEL.
    ${eventtime} 1281980238.660403 Временной штамп для событий
    CEL. В этом примере штамп времени
    приводится в формате по умолчанию.
    ${eventextra} Whiskey Tango
    Foxtrot
    Пользовательские данные,
    включаемые с событием CEL. Дополнительные
    данные включаются когда используется
    CELGenUserEvent().

    Это пример файла
    /etc/asterisk/cel_custom.conf:

    [mappings]

    Master.csv =>
    ${CSV_QUOTE(${eventtype})},${CSV_QUOTE(${eventtime})},

    ${CSV_QUOTE(${CALLERID(name)})},${CSV_QUOTE(${CALLERID(num)})},

    ${CSV_QUOTE(${CALLERID(ANI)})},${CSV_QUOTE(${CALLERID(RDNIS)})},

    ${CSV_QUOTE(${CALLERID(DNID)})},${CSV_QUOTE(${CHANNEL(exten)})},

    ${CSV_QUOTE(${CHANNEL(context)})},${CSV_QUOTE(${CHANNEL(channame)})},

    ${CSV_QUOTE(${CHANNEL(appname)})},${CSV_QUOTE(${CHANNEL(appdata)})},

    ${CSV_QUOTE(${CHANNEL(amaflags)})},${CSV_QUOTE(${CHANNEL(accountcode)})},

    ${CSV_QUOTE(${CHANNEL(uniqueid)})},${CSV_QUOTE(${CHANNEL(linkedid)})},

    ${CSV_QUOTE(${CHANNEL(peer)})},${CSV_QUOTE(${CHANNEL(userfield)})},

    ${CSV_QUOTE(${eventextra})}

    В реальном файле
    конфигурации значения в Master.csv должны
    быть в одной строке.

    cel_manager

    Модуль cel_manager
    создает события CEL на Asterisk Manager Interface (мы
    подробно обсуждали AMI в Главе 20). Этот
    модуль настраивается в файле
    /etc/asterisk/cel.conf. Он должен содержать
    одну секцию, называемую [manager],
    которая содержит один параметр включения
    этого модуля. Значение по умолчанию —
    no, но вы вожете
    включить его вот так:

    [manager]

    enabled = yes

    При такой конфигурации события
    CEL будут выглядеть как события AMI.
    Для примера генерации событий менеджера,
    мы будем использовать следующий диалплан:

    exten => 111,1,Answer()

    same => n,CELGenUserEvent(Custom
    Event,Whiskey Tango Foxtrot)

    same => n,Hangup()

    Эта команда используется для
    выполнения этого расширения и генерации
    некоторых событий CEL:

    *CLI> console dial [email protected]

    И
    наконец, это один из примеров менеджера
    событий созданный в результате этого
    тестового вызова:

    Event: CEL

    Privilege: call,all

    EventName: CHAN_START

    AccountCode:

    CallerIDnum:

    CallerIDname:

    CallerIDani:

    CallerIDrdnis:

    CallerIDdnid:

    Exten: 111

    Context: testing

    Channel: Console/dsp

    Application:

    AppData:

    EventTime: 2010-08-23 08:14:51

    AMAFlags: NONE

    UniqueID: 1282569291.1

    LinkedID: 1282569291.1

    Userfield:

    Peer:

    cel_pgsql

    Этот модуль позволяет сохранять
    события CEL в базе данных PostgreSQL. Мы
    рекомендуем использовать в новых
    установках cel_odbc.

    cel_radius

    Модуль cel_radius
    позволяет сохранять события CEL на сервере
    RADIUS. Когда используется этот модуль,
    каждое событие CEL заносится на
    сервер RADIUS как отдельное событие. Этот
    модуль настраивается в файле
    /etc/asterisk/cel.conf. Параметры для этого
    модуля перечислены в Таблице 24-14 и
    размещаются в разделе [radius].

    Таблица
    24-14. Разрешенные параметры в разделе

    [radius]

    файла cel.conf

    Опция Значение/Пример Примечание
    usegmtime no Использует
    штамп времени GMT (гринвич меридиан
    тайм) вместо локального времени. По
    умолчанию — yes.
    radiuscfg /etc/radiusclient-ng/radiusclient.conf Устанавливает размещение
    конфигурационного файла radiusclient-ng.
    По умолчанию /etc/radiusclient-ng/radiusclient.conf.

    cel_sqlite3_custom

    Этот модуль CEL записывает
    события CEL в базу данных SQLite используя
    SQLite вирсии 3. База данных, созданная этим
    модулем, находится в /var/log/asterisk/master.db.
    Файл конфигурации для этого модуля
    /etc/asterisk/cel_sqlite3_custom.conf определяет имя
    таблицы, а также настраивает какие
    переменные CEL будут вставлены в базу
    данных. Выглядит это примерно так:

    [master]

    table = cel

    ;

    ; Список имен столбцов,
    используемых при вставке событий CEL.

    ;

    columns => eventtype, eventtime,
    cidname, cidnum, cidani, cidrdnis, ciddnid, context, exten, channame,
    appname, appdata, amaflags, accountcode, uniqueid, userfield, peer

    ;

    ; Сопоставьте содержимое
    события CEL с ранее указанными столбцами.

    ;

    values =>
    ‘${eventtype}’,’${eventtime}’,’${CALLERID(name)}’,’${CALLERID(num)}’,

    ‘${CALLERID(ANI)}’,’${CALLERID(RDNIS)}’,’${CALLERID(DNID)}’,

    ‘${CHANNEL(context)}’,’${CHANNEL(exten)}’,’${CHANNEL(channame)}’,

    ‘${CHANNEL(appname)}’,’${CHANNEL(appdata)}’,
    ‘$CHANNEL(amaflags)}’,

    ‘${CHANNEL(accountcode)}’,’${CHANNEL(uniqueid)}’,
    ‘${CHANNEL(userfield)}’,

    ‘${CHANNEL(peer)}’

    В файле cel_
    sqlite3_custom.conf
    содержимое столбцов и
    значения параметров должны находиться
    в одной строке.

    cel_tds

    Модуль cel_tds
    использует библиотеку FreeTDS для записи
    событий CEL в базу данных Microsoft SQL Server или
    Sybase. Это можно сделать используя FreeTDS с
    unixODBC, поэтому мы рекомендуем
    использовать cel_odbc
    вместо этого модуля.

    Примеры событий канала

    Сейчас мы покажем вам несколько
    примеров создания событий вызова из
    системы CEL. Модуль cel_custom
    будет использован из-за своей простоты.
    Используемая конфигурация
    /etc/asterisk/cel_custom.conf приведена в разделе
    «cel_custom». Кроме
    того, следующая конфигурация была
    использована для /etc/asterisk/cel.conf:

    [general]

    enable = yes

    apps = Dial,Playback

    events = ALL

    Односторонний вызов

    В этом примере показан
    одиночный телефонный вызов в расширение,
    которое проигрывает сообщение “Hello
    World.” Вот этот диалплан:

    exten => 200,1,Answer()

    same => n,Playback(hello-world)

    same => n,Hangup()

    Вот события CEL, которые
    регистрируются в результате принятия
    этого вызова:

    «CHAN_START»,»1282062437.436130″,»Julie
    Bryant»,»12565553333″,»»,»»,»»,»200″,

    «LocalSets»,
    «SIP/0000FFFF0003-00000010″,»»,»»,»3″,»»,»1282062437.17″,

    «1282062437.17»,»»,»»

    «ANSWER»,»1282062437.436513″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «200»,»200″,
    «LocalSets»,»SIP/0000FFFF0003-00000010″,»Answer»,»»,»3″,»»,

    «1282062437.17»,»1282062437.17″,»»,»»

    «APP_START»,»1282062437.501868″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»200″,»200″,
    «LocalSets»,»SIP/0000FFFF0003-00000010″,»Playback»,

    «hello-world»,»3″,»»,»1282062437.17″,
    «1282062437.17»,»»,»»

    «APP_END»,»1282062439.008997″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «200»,»200″,
    «LocalSets»,»SIP/0000FFFF0003-00000010″,»Playback»,

    «hello-world»,»3″,»»,»1282062437.17″,
    «1282062437.17»,»»,»»

    «HANGUP»,»1282062439.009127″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «200»,»200″,
    «LocalSets»,»SIP/0000FFFF0003-00000010″,»»,»»,»3″,»»,

    «1282062437.17»,»1282062437.17″,»»,»»

    «CHAN_END»,»1282062439.009666″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»200″,»200″,
    «LocalSets»,»SIP/0000FFFF0003-00000010″,»»,»»,»3″,»»,

    «1282062437.17»,»1282062437.17″,»»,»»

    «LINKEDID_END»,»1282062439.009707″,»Julie
    Bryant»,»12565553333″,

    «12565553333»,»»,»200″,»200″,
    «LocalSets»,»SIP/0000FFFF0003-00000010″,»»,

    «»,»3″,»»,»1282062437.17″,»1282062437.17″,»»,»»

    Двухсторонний вызов

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

    exten => 101,1,Dial(SIP/0000FFFF0001)

    А это события CEL, которые
    генерируются в результате создания
    этого вызова:

    «CHAN_START»,»1282062455.574611″,»Julie
    Bryant»,»12565553333″,»»,»»,»»,»101″,

    «LocalSets»,
    «SIP/0000FFFF0003-00000011″,»»,»»,»3″,»»,»1282062455.18″,

    «1282062455.18»,»»,»»

    «APP_START»,»1282062455.574872″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «101»,»101″,
    «LocalSets»,»SIP/0000FFFF0003-00000011″,»Dial»,

    «SIP/0000FFFF0001″,»3″,»»,»1282062455.18″,»1282062455.18″,»»,»»

    «CHAN_START»,»1282062455.575044″,»Candice
    Yant»,»12565551111″,»»,»»,»»,»s»,

    «LocalSets»,
    «SIP/0000FFFF0001-00000012″,»»,»»,»3″,»»,»1282062455.19″,

    «1282062455.18»,»»,»»

    «ANSWER»,»1282062458.068134″,»»,»101″,»12565551111″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0001-00000012″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,

    «1282062455.19»,»1282062455.18″,»»,»»

    «ANSWER»,»1282062458.068361″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «101»,»101″,
    «LocalSets»,»SIP/0000FFFF0003-00000011″,»Dial»,

    «SIP/0000FFFF0001″,»3″,»»,»1282062455.18″,
    «1282062455.18»,»»,»»

    «BRIDGE_START»,»1282062458.068388″,»Julie
    Bryant»,»12565553333″,

    «12565553333»,»»,»101″,»101″,
    «LocalSets»,»SIP/0000FFFF0003-00000011″,

    «Dial»,»SIP/0000FFFF0001″,»3″,»»,»1282062455.18″,
    «1282062455.18»,»»,»»

    «BRIDGE_END»,»1282062462.965704″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»101″,»101″,
    «LocalSets»,»SIP/0000FFFF0003-00000011″,»Dial»,

    «SIP/0000FFFF0001″,»3″,»»,»1282062455.18″,
    «1282062455.18»,»»,»»

    «HANGUP»,»1282062462.966097″,»»,»101″,»12565551111″,»»,»»,»»,»LocalSets»,

    «SIP/0000FFFF0001-00000012″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,

    «1282062455.19»,»1282062455.18″,»»,»»

    «CHAN_END»,»1282062462.966119″,»»,»101″,»12565551111″,»»,»»,»»,»LocalSets»,

    «SIP/0000FFFF0001-00000012″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,

    «1282062455.19»,»1282062455.18″,»»,»»

    «APP_END»,»1282062462.966156″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «101»,»101″,»LocalSets»,»SIP/0000FFFF0003-00000011″,»Dial»,

    «SIP/0000FFFF0001″,»3″,»»,»1282062455.18″,»1282062455.18″,»»,»»

    «HANGUP»,»1282062462.966215″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»101″,»101″,»LocalSets»,»SIP/0000FFFF0003-00000011″,»»,»»,»3″,»»,

    «1282062455.18»,»1282062455.18″,»»,»»

    «CHAN_END»,»1282062462.966418″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»101″,»101″,»LocalSets»,»SIP/0000FFFF0003-00000011″,»»,»»,»3″,»»,

    «1282062455.18»,»1282062455.18″,»»,»»

    «LINKEDID_END»,»1282062462.966441″,»Julie
    Bryant»,»12565553333″,

    «12565553333»,»»,»101″,»101″,»LocalSets»,»SIP/0000FFFF0003-00000011″,

    «»,»»,»3″,»»,»1282062455.18″,»1282062455.18″,»»,»»

    Слепой трансфер

    В этом последнем примере
    будет выполнен трансфер. Вызов начнется
    вызовом телефона по добавочному номеру
    102. Затем вызов
    будет переведен на другой телефон с
    номером 101. Вот
    соответствующий диалплан:

    exten => 101,1,Dial(SIP/0000FFFF0001)

    exten => 102,1,Dial(SIP/0000FFFF0002)

    Это запротоколированные
    события CEL в результате этого сценария
    вызова:

    «CHAN_START»,»1282062488.028200″,»Julie
    Bryant»,»12565553333″,»»,»»,»»,

    «102»,»LocalSets»,
    «SIP/0000FFFF0003-00000013″,»»,»»,»3″,»»,

    «1282062488.20»,»1282062488.20″,»»,»»

    «APP_START»,»1282062488.028464″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»102″,»102″,
    «LocalSets»,»SIP/0000FFFF0003-00000013″,»Dial»,

    «SIP/0000FFFF0002″,»3″,»»,»1282062488.20″,
    «1282062488.20»,»»,»»

    «CHAN_START»,»1282062488.028762″,»Brooke
    Brown»,»12565552222″,»»,»»,»»,

    «s»,»LocalSets»,
    «SIP/0000FFFF0002-00000014″,»»,»»,»3″,»»,»1282062488.21″,

    «1282062488.20»,»»,»»

    «ANSWER»,»1282062492.565759″,»»,»102″,»12565552222″,»»,»»,»102″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,

    «1282062488.21»,»1282062488.20″,»»,»»

    «ANSWER»,»1282062492.565973″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «102»,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,»Dial»,

    «SIP/0000FFFF0002″,»3″,»»,»1282062488.20″,»1282062488.20″,»»,»»

    «BRIDGE_START»,»1282062492.566001″,»Julie
    Bryant»,»12565553333″,

    «12565553333»,»»,»102″,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,

    «Dial»,»SIP/0000FFFF0002″,»3″,»»,»1282062488.20″,»1282062488.20″,»»,»»

    «CHAN_START»,»1282062497.940687″,»»,»»,»»,»»,»»,»s»,»LocalSets»,

    «AsyncGoto/SIP/0000FFFF0002-00000014″,»»,»»,»3″,»»,»1282062497.22″,

    «1282062488.20»,»»,»»

    «BLINDTRANSFER»,»1282062497.940925″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «102»,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,»Dial»,»SIP/0000FFFF0002″,

    «3»,»»,»1282062488.20″,»1282062488.20″,

    «AsyncGoto/SIP/0000FFFF0002-00000014<ZOMBIE>»,»»

    «BRIDGE_END»,»1282062497.940961″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «102»,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,»Dial»,

    «SIP/0000FFFF0002″,»3″,»»,»1282062488.20″,»1282062488.20″,»»,»»

    «APP_START»,»1282062497.941021″,»»,»102″,»12565552222″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»Dial»,»SIP/0000FFFF0001″,»3″,»»,

    «1282062497.22»,»1282062488.20″,»»,»»

    «CHAN_START»,»1282062497.941207″,»Candice
    Yant»,»12565551111″,»»,»»,»»,»s»,

    «LocalSets»,»SIP/0000FFFF0001-00000015″,»»,»»,»3″,»»,»1282062497.23″,

    «1282062488.20»,»»,»»

    «HANGUP»,»1282062497.941361″,»»,»»,»»,»»,»»,»»,»LocalSets»,

    «AsyncGoto/SIP/0000FFFF0002-00000014<ZOMBIE>»,»AppDial»,

    «(Outgoing
    Line)»,»3″,»»,»1282062488.21″,»1282062488.20″,»»,»»

    «CHAN_END»,»1282062497.941380″,»»,»»,»»,»»,»»,»»,»LocalSets»,

    «AsyncGoto/SIP/0000FFFF0002-00000014<ZOMBIE>»,»AppDial»,»(Outgoing
    Line)»,

    «3»,»»,»1282062488.21″,»1282062488.20″,»»,»»

    «APP_END»,»1282062497.941415″,»Julie
    Bryant»,»12565553333″,»12565553333″,»»,

    «102»,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,»Dial»,

    «SIP/0000FFFF0002″,»3″,»»,»1282062488.20″,»1282062488.20″,»»,»»

    «HANGUP»,»1282062497.941453″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»102″,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,»»,»»,»3″,»»,

    «1282062488.20»,»1282062488.20″,»»,»»

    «CHAN_END»,»1282062497.941474″,»Julie
    Bryant»,»12565553333″,»12565553333″,

    «»,»102″,»102″,»LocalSets»,»SIP/0000FFFF0003-00000013″,»»,»»,»3″,»»,

    «1282062488.20»,»1282062488.20″,»»,»»

    «ANSWER»,»1282062500.559578″,»»,»101″,»12565551111″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0001-00000015″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,

    «1282062497.23»,»1282062488.20″,»»,»»

    «BRIDGE_START»,»1282062500.559720″,»»,»102″,»12565552222″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»Dial»,»SIP/0000FFFF0001″,»3″,»»,»1282062497.22″,

    «1282062488.20»,»»,»»

    «BRIDGE_END»,»1282062512.742600″,»»,»102″,»12565552222″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»Dial»,»SIP/0000FFFF0001″,»3″,»»,»1282062497.22″,

    «1282062488.20»,»»,»»

    «HANGUP»,»1282062512.743006″,»»,»101″,»12565551111″,»»,»»,»»,»LocalSets»,

    «SIP/0000FFFF0001-00000015″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,»1282062497.23″,

    «1282062488.20»,»»,»»

    «CHAN_END»,»1282062512.743211″,»»,»101″,»12565551111″,»»,»»,»»,»LocalSets»,

    «SIP/0000FFFF0001-00000015″,»AppDial»,»(Outgoing
    Line)»,»3″,»»,»1282062497.23″,

    «1282062488.20»,»»,»»

    «APP_END»,»1282062512.743286″,»»,»102″,»12565552222″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»Dial»,»SIP/0000FFFF0001″,»3″,»»,»1282062497.22″,

    «1282062488.20»,»»,»»

    «HANGUP»,»1282062512.743346″,»»,»102″,»12565552222″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»»,»»,»3″,»»,»1282062497.22″,»1282062488.20″,

    «»,»»

    «CHAN_END»,»1282062512.743371″,»»,»102″,»12565552222″,»»,»»,»101″,»LocalSets»,

    «SIP/0000FFFF0002-00000014″,»»,»»,»3″,»»,»1282062497.22″,»1282062488.20″,

    «»,»»

    «LINKEDID_END»,»1282062512.743391″,»»,»102″,»12565552222″,»»,»»,»101″,

    «LocalSets»,»SIP/0000FFFF0002-00000014″,»»,»»,»3″,»»,»1282062497.22″,

    «1282062488.20»,»»,»»

    SNMP

    Simple Network Management Protocol (SNMP) — это
    стандартизированный протокол для
    управления сетью. Он очень широко
    используется и реализован во многих
    приложениях и сетевых устройствах.
    Такая платформа как OpenNMS4
    — это платформа управления сетью с
    открытым исходным кодом, использующая
    SNMP (а также другие вещи). Asterisk поддерживает
    SNMP через модуль res_snmp.
    Этот раздел описывает установку и
    настройку res_snmp и
    как мы можем использовать платформу
    подобную OpenNMS.

    Установка модуля SNMP для
    Asterisk

    По умолчанию Asterisk не компилирует
    модуль разработки SNMP, поскольку сначала
    нужно установить все необходимые
    (зависимые) пакеты.

    Зависимости в RHEL

    В RHEL вам просто нужно установить
    пакет net-snmp-devel:

    $ sudo yum install net-snmp-devel

    Смотри далее раздел под
    названием “Перекомпиляция
    Asterisk с модулем res_snmp” для обзора, как
    перекомпилировать Asterisk с поддержкой
    SNMP.

    Зависимости в Ubuntu

    Под Ubuntu, нужно установить
    следующий пакет:

    $ sudo apt-get install snmp libsnmp-dev
    snmpd

    На Ubuntu
    необходимо устанавливать
    оба пакета snmp и snmpd, поскольку
    они не разрешают зависимостей библиотек
    разработки SNMP наподобие RHEL. Пакет snmp
    устанавливает инструменты SNMP подобно
    snmpwalk, который нам нужен, а пакет
    snmpd устанавливает демон SNMP.

    Смотри следующий раздел для
    описания, как пере компилировать Asterisk
    с поддержкой SNMP.

    Перекомпиляция Asterisk с модулем res_snmp

    Как только вы установите все
    нужные пакеты для SNMP, то можете
    перекомпилировать Asterisk с поддержкой
    SNMP:

    $ cd
    ~/src/asterisk-complete/asterisk/11/

    $ ./configure

    $ make
    menuselect
    # verify that
    res_snmp is selected under Resource Modules

    $ make

    $ sudo make
    install

    Затем вам нужно скопировать
    пример конфигурационного файла в каталог
    /etc/asterisk:

    $ sudo cp
    ~/src/asterisk-complete/asterisk/11/configs/res_snmp.conf.sample

    /etc/asterisk/res_snmp.conf

    Мы раскажем о настройке этого
    файла, для использования с OpenNMS, в
    следующем разделе.

    Настройка SNMP для использования
    OpenNMS в Asterisk

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

    Установка OpenNMS

    Вики OpenNMS имеет детальную
    иструкцию по установке OpenNMS.

    OpenNMS можно не
    устанавливать на ваш сервер Asterisk. Вы
    можете выделить отдельную машину для
    сервера OpenNMS.

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

    Инструкции по установке
    OpenNMS в вики используют SNMPv2c, который не
    является безопасным методом абстрагирования
    данных протокола SNMP. Так как мы хотим
    построить безопасную систему, наши
    инструкции покажут вам как включить
    поддержку SNMPv3.5

    Однако, поскольку SNMPv3 может
    быть немного громоздким зверем или
    потому что вы не желаете включить SNMPv3
    по каким-то причинам (например, если
    ваша версия SNMP не была собрана с поддержкой
    OpenSSL), мы предоставим вам инструкции по
    настройке демона SNMP для SNMPv2c и SNMPv3.

    Как правило, проще настроить
    систему для SNMPv2c, а затем обновить ее до
    SNMPv3, правильная настройка SNMPv3 более
    сложная.

    Редактирование
    /etc/asterisk/res_snmp.conf для работы с вашим
    сервером OpenNMS

    В файле /etc/asterisk/res_snmp.conf,
    который вы скопировали из каталога с
    исходными кодами, нужно раскоментировать
    две строки:

    [general]

    ;subagent=yes

    ;enabled=yes

    Изменим файл res_snmp.conf для
    обоих клиентов SNMP и включим subagent:

    [general]

    subagent=yes

    enabled=yes

    После изменения этого файла,
    вам нужно перезагрузить модуль
    res_snmp.so, чтобы изменения вступили в
    силу:

    *CLI> module unload res_snmp.so

    Unloaded res_snmp.so

    Unloading [Sub]Agent Module

    == Terminating SubAgent

    *CLI> module load res_snmp.so

    Loaded res_snmp.so

    == Parsing
    ‘/etc/asterisk/res_snmp.conf’: == Found

    Loading [Sub]Agent Module

    Loaded res_snmp.so => (SNMP [Sub]Agent
    for Asterisk)

    == Starting SubAgent

    Редактирование /etc/snmp/snmpd.conf
    для работы с вашим сервером OpenNMS

    Теперь мы можем изменить файл
    /etc/snmp/snmpd.conf для SNMP на хосте. Переименуем
    текущий пример конфигурационного файла
    и создадим новый файл snmpd.conf:

    $ cd /etc/snmp

    $ sudo mv
    snmpd.conf snmpd.sample

    Первое что нужно сделать —
    это добавить права доступа этому файлу.
    Мы предлагаем вам прочитать файл
    /etc/snmpd/snmp.sample, который вы переименовали
    для лучшего представления об установке
    прав доступа. Затем добавим следующее
    в ваш файл snmpd.conf:

    $ sudo sh -c
    cat > snmpd.conf

    com2sec notConfigUser default public

    group notConfigGroup v1 notConfigUser

    group notConfigGroup v2c notConfigUser

    view all included .1

    view
    system included .iso.org.dod.internet.mgmt.mib-2.system

    access notConfigGroup «»
    any noauth exact all none none

    syslocation Caledon, ON

    syscontact Leif Madsen
    [email protected]

    Ctrl+D

    Строки syslocation
    и syscontact необязательны,
    но они могут облегчить идентификацию
    сервера, если вы мониторите несколько
    узлов.

    Теперь нам нужно включить
    поддержку субагента AgentX что бы мы могли
    найти информацию о нашей системе
    Asterisk:

    $ sudo cat >> snmpd.conf

    master agentx

    agentXSocket /var/agentx/master

    agentXPerms 0660 0775 nobody root

    sysObjectID .1.3.6.1.4.1.22736.1

    Ctrl+D

    В дополнении к строке master
    agentx и опции agentX,
    мы включаем на Asterisk демон SNMP для
    коммуникации. Опция agentXPerms
    говорит, что Asterisk запущен от root. Если
    ваш Asterisk запущен от другой группы
    замените root на группу от которой
    запущен Asterisk.

    Чуть ниже конфигурации AgentX,
    мы добавили параметр sysObjectID.
    Цель добавления строки sysObjectID
    указать OpenNMS на хост-систему Asterisk, что
    позволяет динамически захватить
    дополнительную информацию для графиков.

    После того, как вы выполните
    эти шаги по настройке, вам нужно
    перезапустить демон SNMP:

    $ sudo /etc/init.d/snmpd restart

    Чтобы убедиться что информация
    будет передаваться правильно, используйте
    приложение snmpwalk:

    $ snmpwalk -On -v2c -c public 127.0.0.1
    .1.3.6.1.4.1.22736

    Если вы правильно все настроили,
    то должны получить несколько строк с
    информацией на вашем экране, подобно
    этим:

    .1.3.6.1.4.1.22736.1.5.4.1.4.3 = INTEGER: 2

    .1.3.6.1.4.1.22736.1.5.4.1.4.4 = INTEGER: 2

    .1.3.6.1.4.1.22736.1.5.4.1.4.5 = INTEGER: 1

    .1.3.6.1.4.1.22736.1.5.4.1.4.6 = INTEGER: 1

    .1.3.6.1.4.1.22736.1.5.4.1.5.1 = INTEGER: 1

    …etc

    На этом этапе ваша хост-система
    должна быть готова для подключения к
    OpenNMS и сбора необходимой информации.
    Далее добавьте узел в систему и заполните
    соответствующую информацию. Через
    некоторое время OpenNMS опросит хост-систему
    и получит доступ к статистике Asterisk. Вы
    должны иметь возможность кликнуть
    графики ресурсов ( Resource Graphs) после выбора
    созданного узла и просмотреть выбор
    доступных графиков, таких как SIP, DAHDI,
    Local и т.д.

    Наблюдение за Asterisk с OpenNMS

    После того, как вы установили
    OpenNMS и настроили модуль res_snmp
    в Asterisk, вы можете использовать OpenNMS для
    наблюдения за вашим сервером Asterisk. Вы
    можете настроить какие статистические
    данные отслеживать, а также какие
    уведомления хотели бы получать на основе
    этих статистических данных. Изучение
    возможностей OpenNMS остается в качестве
    упражнения для читателя. Тем не менее,
    мы приложили несколько графиков для
    демонстрации основной информации,
    которую вы можете получить от сервера
    Asterisk. Эти графики от сервера Asterisk, который
    не очень сильно загружен, но они дают
    хороший пример того, что вы можете
    увидеть.

    Рисунок 24-1 содержит график,
    показывающий количество активных
    каналов в Asterisk в различное время.

    Рисунок 24-1. График активности каналов Asterisk

    Рисунок 24-2 показывает график
    активности каналов определенного типа.
    В данном случае мы просматриваем
    количество активных каналов DAHDI в
    системе. Мониторинг каналов DAHDI интересен
    с практической стороны, поскольку каналы
    DAHDI взаимосвязаны с физическими ресурсами
    и доступное количество каналов
    предопределено. Это будет очень полезно
    для управления использования каналами
    DAHDI и получения уведомлений о занятости
    всех каналов, это может послужить
    сигналом для добавления дополнительных
    каналов.

    Рисунок 24-2. График активности каналов DAHDI

    В завершение, Рисунок 24-3
    показывает использование сетевого
    интерфейса. Как вы можете видеть, были
    всплески трафика, следующего «в» и «из»
    системы, когда происходили SIP вызовы.

    Рисунок 24-3. График трафика на сетевом интерфейсе

    Заключение

    Asterisk очень хорошо позволяет
    отслеживать различные аспекты своей
    деятельности, начиная от CDR до полной
    отладки выполнения кода. Эти различные
    механизмы помогут вам в управлении УАТС
    Asterisk и представляют собой один из
    моментов, в которых Asterisk значительно
    превосходит большинство (если не все)
    традиционные АТС.

    1Который
    обычно находится в /etc/syslog.conf.


    rsyslog, syslog-ng и все остальное.

    3Если
    вы представите патч для добавления
    любого из этих событий в код и опишите
    эту сноску, Рассел вышлет вам бесплатно
    футболку Asterisk. Сноска за взятку!

    4OpenNMS,
    конечно не единственная платформа,
    которая может быть использована с
    модулем res_snmp. Тем
    не менее, мы решили обсудить её здесь
    по ряду причин. Во-первых, OpenNMS очень
    хорошая платформа управления сетью,
    которая имеет специальную интеграцию
    с Asterisk. Во-вторых, это открытый исходный
    код и 100% бесплатный. Наконец, Джефф
    Гельбах из OpenNMS внесший свой вклад в
    развитие Asterisk, прилагает значительные
    усилия в поддержке SNMP. OpenNMS также был
    достаточно хорош, чтобы помочь нам
    получить описание как все это работает,
    что мы могли задокументировать это.

    5Дополнительно
    вы можете найти пост
    в блоге о включении SNMPv3 для OpenNMS.

    Глава 21. Системный мониторинг и журналирование

    Хаос присущ всем сложным вещам. Стремитесь дальше с усердием.

    — Будда

    Asterisk поставляется с несколькими подсистемами, которые позволяют получить подробную информацию о работе вашей системы. Как для устранения неполадок, так и для использования в целях выставления счетов или задач персонала, различные модули мониторинга Asterisk могут помочь вам следить за внутренней работой вашей системы.

    logger.conf

    При устранении неполадок в системе Asterisk вам будет очень полезно обратиться к некоторым историческим записям того, что происходило в системе в то время, когда произошла указанная проблема. Параметры для хранения этой информации определены в файле /etc/asterisk/logger.conf.

    В идеале, вы можете захотеть, чтобы система хранила запись каждой вещи что она делает. Однако у этого есть свои издержки. На занятой системе с включенным полным журналированием отладки будет создаваться большой объем данных. Хотя сегодня хранение данных намного дешевле, чем было в молодости Asterisk, возможно, все еще необходимо достичь баланса между детализацией и требованиями к хранению.

    Файл /etc/asterisk/logger.conf позволяет определить все виды различных уровней ведения журнала, а также несколько файлов журналов если это необходимо. Эта гибкость превосходна, но она также может сбивать с толку.

    Формат записи в файле logger.conf выглядит следующим образом:

    filename => type[,type[,type[,...]]]
    

    Мы уже работали с logger.conf, так что у вас уже будут записи в нем, похожие на следующие:

    [general]
    exec_after_rotate=gzip -9 ${filename}.2;
    
    [logfiles]
    ;debug => debug
    ;console => notice,warning,error,verbose
    console => notice,warning,error,debug
    messages => notice,warning,error
    full => notice,warning,error,debug,verbose,dtmf,fax
    ;full-json => [json]debug,verbose,notice,warning,error,dtmf,fax
    ;syslog keyword : This special keyword logs to syslog facility
    ;syslog.local0 => notice,warning,error
    

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

    $ sudo touch full messages
    $ chown asterisk:asterisk /var/log/asterisk/*
    $ asterisk -rx 'logger reload'
    

    или из интерфейса командной строки Asterisk:

    Детальность журналирования: полезно, но опасно

    Мы боролись с тем, чтобы рекомендовать добавление следующей строки в ваш файл logger.conf:

    verbose => notice,warning,error,verbose

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

    Используйте его. Это просто фантастика. Просто помните, что вам нужно будет управлять своим хранилищем, чтобы гарантировать, что ваши файлы журналов не заполнят весь диск!

    Вы можете указать любое имя файла, которое захотите, но специальное имя файла console фактически выведет выходные данные в интерфейс командной строки Asterisk, а не в любой файл на жестком диске. Все остальные имена файлов будут сохранены в файловой системе в каталоге /var/log/asterisk. Типы logger.conf описаны в Таблице 21-1.

    Таблица 21-1. Типы logger.conf

    Тип Описание
    notice Вы увидите много таких во время перезагрузки, но они также будут появляться во время обычного потока вызовов. Уведомление — это просто любое событие, о котором Asterisk хочет Вам сообщить.
    warning Предупреждение представляет проблему, которая может быть достаточно серьезной чтобы повлиять на вызов (включая обрыв вызова, поскольку поток вызовов не может продолжаться). Предупреждения должны быть устранены.
    error Ошибки представляют собой значительные проблемы в системе, которые должны быть решены немедленно.
    debug Отладка полезна только в том случае, если вы устраняете неполадки с самим кодом Asterisk. Вы не должны использовать отладку для устранения неполадок вашего диалплана, но можете использовать её, если разработчики Asterisk попросят вас предоставить журналы для проблемы, о которой вы сообщали. Не используйте отладку в продакшене, так как количество предоставляемых деталей, может заполнить жесткий диск в течение нескольких дней.a
    verbose Это один из самых полезных типов ведения журнала, но он также является одним из наиболее рискованных, чтобы оставлять его без присмотра, из-за возможности заполнения выводом вашего жесткого диска.b
    dtmf Регистрация DTMF может быть полезна если вы получаете жалобы на то, что вызовы не маршрутизируются от автосекретаря правильно.
    fax Этот тип ведения журнала вызывает сообщения, связанные с факсом, из серверной части технологии факса (res_fax_spandsp или res_fax_digium) для регистрации в системе факсов.
    * Будет регистрировать все (и мы имеем в виду все). Не используйте его, если не понимаете последствий хранения такого количества данных. Это не закончится хорошо.

    aЭто не теория. Это случилось и с нами и было это совсем невесело.

    bЭто не так рискованно, как debug, так как займет месяцы, чтобы заполнить жесткий диск, но опасность заключается в том, что это произойдет, скажем, через год, когда вы находитесь на летних каникулах, и сразу не будет очевидно, в чем проблема. Совсем не весело.

    В системе ведения журнала Asterisk существует особенность, которая вызовет у вас некоторое замешательство, если вы о ней не знаете. Уровень ведения журнала для типов verbose и debug привязаны к детализации, заданной в консоли. Это означает, что если вы ведете журнал типа verbose или debug и кто-то входит в CLI и выдает команду core set verbose 0, или core set debug 0 — регистрация этих данных в вашем лог-файле будет остановлена.

    Просмотр журналов Asterisk

    Поиск по журнальным файлам может быть проблемой. Хитрость заключается в том, чтобы иметь возможность фильтровать вывод, чтобы выводилась только та информация, которая имеет отношение к тому, что вы ищете.

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

    В Asterisk 11 появилась функция ведения журнала, которая помогает отлаживать определенный вызов. Записи журнала, связанные с вызовом, теперь включают идентификатор вызова. Этот идентификатор вызова можно использовать с командой grep чтобы найти все записи журнала, связанные с этим вызовом. В следующем примере записи журнала идентификатором вызова является C-00000004:

    [Dec  4 08:22:32] WARNING[14199][C-00000004]: app_voicemail.c:6286
    leave_voicemail: No entry in voicemail config file for '234123452'
    

    В более ранних версиях Asterisk есть еще один трюк, который вы можете использовать. Если, например, вы выполняете подробное логирование — следует отметить, что каждый отдельный вызов имеет идентификатор потока, который при использовании с командой grep, часто может помочь вам отфильтровать все, что не относится к вызову, который вы пытаетесь отладить. Например, в следующем подробном журнале у нас есть несколько вызовов и поскольку вызовы происходят одновременно, это может оказаться очень запутанным для отслеживания одного вызова:

    $ tail -1000 verbose
    [Mar 11 …] VERBOSE[31362] logger.c:     -- IAX2/shifteight-4 answered Zap/1-1
    [Mar 11 …] VERBOSE[2973] logger.c:     -- Starting simple switch on 'Zap/1-1'
    [Mar 11 …] VERBOSE[31362] logger.c:   == Spawn extension (shifteight, s, 1)
    exited non-zero on 'Zap/1-1'
    [Mar 11 …] VERBOSE[2973] logger.c:     -- Hungup 'Zap/1-1'
    [Mar 11 …] VERBOSE[3680] logger.c:     -- Starting simple switch on 'Zap/1-1'
    [Mar 11 …] VERBOSE[31362] logger.c:     -- Hungup 'Zap/1-1'
    

    Чтобы отфильтровать один конкретный вызов — мы могли бы использовать команду grep на ID потока. Например:

    дало бы нам:

    [Mar 11 …] VERBOSE[31362] logger.c:     -- IAX2/shifteight-4 answered Zap/1-1
    [Mar 11 …] VERBOSE[31362] logger.c:   == Spawn extension (shifteight, s, 1)
    exited non-zero on 'Zap/1-1'
    [Mar 11 …] VERBOSE[31362] logger.c:     -- Hungup 'Zap/1-1'
    

    Этот метод не гарантирует, что вы увидите все относящееся к одному вызову, так как вызов может породить дополнительные потоки, но для основной отладки диалплана мы находим этот подход весьма полезным, когда ID вызовов из Asterisk 11 недоступны.

    Журналирование с помощью демона syslog

    Linux содержит очень мощный механизм ведения журнала, которым Asterisk может воспользоваться. Хотя обсуждение всех разновидностей syslog и всех возможных способов ведения журнала Asterisk выходит за рамки этой книги — достаточно сказать, что если вы хотите, чтобы Asterisk отправлял журналы демону syslog — вам просто нужно указать следующее в вашем файле /etc/asterisk/logger.conf:

    syslog.local0 => notice,warning,error ; или любой тип(ы), который вы хотите логировать
    

    Вам понадобится обозначение в вашем файле конфигурации1 syslog с именем local0, которое должно выглядеть примерно так:

    local0.*      /var/log/asterisk/syslog
    

    Вы можете использовать local0 через local7 для этого, но проверьте свой файл syslog.conf чтобы убедиться, что ничто другое не использует один из этих каналов syslog.

    Использование syslog2 позволяет гораздо более мощное ведение журнала, но также требует больше знаний, чем простое логирование Asterisk в файлы. Это в основном будет полезно, если вы уже собираете другие журналы в системе на какой-то централизованный сервер syslog.

    Проверка ведения журнала

    Вы можете просмотреть состояние всех ваших параметров logger.conf через CLI Asterisk, выполнив команду:

    *CLI> logger show channels
    

    Вы должны увидеть выходные данные, аналогичные:

    Channel                     Type     Status  Configuration
    -------                     ----     ------  -------------
    syslog.local0               Syslog   Enabled  - NOTICE WARNING ERROR VERBOSE
    /var/log/asterisk/verbose   File     Enabled  - NOTICE WARNING ERROR VERBOSE
    /var/log/asterisk/messages  File     Enabled  - NOTICE WARNING ERROR
                                Console  Enabled  - NOTICE WARNING ERROR DTMF=
    

    Ротация лога

    Существует некоторая поддержка ротации журналов, встроенная в Asterisk. Ротация логов будет производиться в следующих случаях:

    • Если вы запустите команду logger rotate в CLI Asterisk:
    • Во время перезагрузки конфигурации, если размер любого существующего файла журнала превышает 1 ГБ
    • Если Asterisk получает сигнал SIGXFSZ, указывающий на то, что файл, в который он записывался, слишком велик

    Call Detail Records — Записи деталей вызовов

    Система CDR в Asterisk используется для регистрации истории вызовов в системе. В некоторых развертываниях эти записи используются для выставления счетов. В других случаях записи вызовов используются для анализа объемов вызовов с течением времени. Они также могут использоваться в качестве средства отладки администраторами Asterisk.

    Содержание CDR

    CDR имеет ряд полей, которые включены по умолчанию. Таблица 21-2 перечисляет их.

    Таблица 21-2. Поля CDR по умолчанию

    Вариант Значение/пример Примечание
    accountcode 12345 Идентификатор учетной записи. Это поле определяется пользователем и по умолчанию является пустым.
    src 12565551212 Идентификационный номер вызывающего абонента. Он устанавливается автоматически и доступен только для чтения.
    dst 102 Целевой добавочный номер для вызова. Это поле устанавливается автоматически и доступно только для чтения.
    dcontext PublicExtensions Контекст назначения для вызова. Это поле устанавливается автоматически и доступно только для чтения.
    clid "Big Bird" Полный идентификатор вызывающего абонента, включая имя вызывающей стороны. Это поле устанавливается автоматически и доступно только для чтения.
    channel SIP/0004F2040808-a1bc23ef Канал вызывающей стороны. Это поле устанавливается автоматически и доступно только для чтения.
    dstchannel SIP/0004F2046969-9786b0b0 Канал вызываемой стороны. Это поле устанавливается автоматически и доступно только для чтения.
    lastapp Dial Последнее выполненное приложение диалплана. Это поле устанавливается автоматически и доступно только для чтения.
    lastdata SIP/0004F2046969,30,tT Аргументы, переданные на рассмотрение lastapp. Это поле устанавливается автоматически и доступно только для чтения.
    start 2010-10-26 12:00:00 Время начала вызова. Это поле устанавливается автоматически и доступно только для чтения.
    answer 2010-10-26 12:00:15 Время ответа на вызов. Это поле устанавливается автоматически и доступно только для чтения.
    end 2010-10-26 12:03:15 Время окончания вызова. Это поле устанавливается автоматически и доступно только для чтения.
    duration 195 Количество секунд, прошедших между началом и концом вызова. Это поле устанавливается автоматически и доступно только для чтения.
    billsec 180 Количество секунд между ответом и концом вызова. Это поле устанавливается автоматически и доступно только для чтения.
    disposition ANSWER Указание на то, что случилось с вызовом. Это может быть так NO ANSWER, FAILED, BUSY, ANSWER или UNKNOWN.
    amaflags DOCUMENTATION Флаг автоматического учета сообщений (AMA), связанный с этим вызовом. Может быть одно из следующих действий: OMIT, BILLING, DOCUMENTATION или Unknown.
    userfield PerMinuteCharge:0.02 Поле пользователя общего назначения. Это поле пусто по умолчанию и может быть установлено в пользовательскую строку.a
    uniqueid 1288112400.1 Уникальный идентификатор для объекта канала src. Это поле устанавливается автоматически и доступно только для чтения.

    10Поле userfield сейчас это не так актуально, как раньше. Пользовательские переменные CDR — более гибкий способ получения пользовательских данных в CDRs.

    Вы можете получить доступ ко всем полям записей CDR в диалплане Asterisk с помощью функции CDR(). Функция CDR() также используется для установки полей CDR, которые определены пользователем:

    exten => 115,1,Verbose(Call start time: ${CDR(start)})
       same => n,Set(CDR(userfield)=zombie pancakes)
    

    В дополнение к полям, которые всегда включены в CDR, можно добавить пользовательские поля. Это можно сделать в диалплане используя прилоежние Set() совместно с функцией CDR():

    exten => 115,1,NoOp()
       same => n,Set(CDR(mycustomfield)=coffee)
       same => n,Verbose(I need some more ${CDR(mycustomfield)})
    

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

    Чтобы Просмотреть встроенную документацию для функции CDR() — выполните следующую команду в консоли Asterisk:

    *CLI> core show function CDR
    

    В дополнение к функции CDR() некоторые приложения диалплана могут использоваться для влияния на записи CDR. Мы еще рассмотрим их.

    Приложения диалплана

    Несколько приложений диалплана можно использовать для влияния на CDR текущего вызова. Чтобы получить список приложений CDR, загруженных в текущей версии Asterisk, можно использовать следующую команду CLI:

    *CLI> core show applications like CDR
        -= Matching Asterisk Applications =-
                   ForkCDR: Forks the Call Data Record.
                     NoCDR: Tell Asterisk to not maintain a CDR for the current call
                  ResetCDR: Resets the Call Data Record.
        -= 3 Applications Matching =-
    

    Каждое приложение имеет документацию, встроенную в Asterisk, которую можно просмотреть с помощью следующей команды:

    *CLI> core show application <application name>
    

    cdr.conf

    Файл cdr.conf имеет a раздел [general], содержащий параметры, применяемые ко всей системе CDR. Дополнительные необязательные разделы могут существовать в этом файле — они применяются к определенным модулям бэкэнда логирования CDR. Таблица 21-3 перечисляет параметры, доступные в разделе [general].

    Таблица 21-3. cdr.conf раздел [general]

    Параметр Значение/пример Примечание
    enable yes Включение ведения журнала CDR. Значение по умолчанию: yes.
    unanswered no Регистрировать неотвеченные звонки. Обычно, только отвеченные вызовы пишутся в CDR. Регистрация всех попыток вызова может привести к большому количеству дополнительных записей вызовов, о которых большинство людей не заботятся. Значение по умолчанию: no.
    end before hexten no Закройте CDR перед запуском расширения h в диалплане Asterisk. Обычно CDR не закрывают до тех пор, пока диалплан не будет полностью завершен. Значение по умолчанию: no.
    initiated seconds no При расчете поля billsec всегда округляется. Например, если разница между временем ответа на вызов и временем его окончания составляет 1 секунду и 1 микросекунду, то billsec будет установлен равным 2 секундам. Это помогает гарантировать, что CDR Asterisk совпадает с поведением, используемым телекоммуникационными компаниями. Значение по умолчанию — no.
    batch no Очередь записей CDR будет регистрироваться пакетами, а не синхронно в конце каждого вызова. Это предотвращает ведение журнала CDR от блокирования в конце вызова. Использование пакетного режима может быть невероятно полезно при работе с базой данных, которая может медленно обрабатывать запросы. Значение по умолчанию — `no, но мы рекомендуем включить его. a
    size 100 Количество записей CDR в очереди до их регистрации в пакетном режиме. Значение по умолчанию: 100.
    time 300 Установите максимальное количество секунд, в течение которых CDR будет ожидать очереди пакетной обработки перед регистрацией. Процесс пакетного ведения журнала CDR будет запущен в конце этого периода времени, даже если size ещё не накопился. Значение по умолчанию: 300 секунд.
    sheduler only no Установите, должна ли пакетная обработка CDR выполняться путем порождения нового потока или в контексте планировщика пакетной обработки CDR. Значение по умолчанию: no, и мы рекомендуем не менять его.
    safe shutdown yes Заблокируйте выключение Asterisk, чтобы убедиться, что все записи CDR из очереди зарегистрированы. Значение по умолчанию: yes, и мы рекомендуем оставить его таким, так как этот параметр предотвращает важную потерю данных.

    aНедостатком включения этой опции является то, что если Asterisk по какой-либо причине упадет или умрет — записи CDR будут потеряны, так как они хранятся только в памяти существуещего процесса Asterisk. Смотрите safeshutdown для дополнительной информации.

    Бэкэнды

    Серверные модули Asterisk CDR предоставляют способ регистрации CDR. Большинство бэкендов CDR требуют определенной конфигурации, чтобы заставить их работать.

    cdr_adaptive_odbc

    Как следует из названия, модуль cdr_adaptive_odbc позволяет хранить CDR в базе данных через ODBC. «Адаптивная» часть названия относится к тому, что она работает для адаптации к структуре таблицы: нет статической структуры таблицы, которая должна использоваться с этим модулем. Когда модуль загружен (или перезагружен) — он считывает структуру таблицы. При регистрации CDR он ищет переменную CDR, которая соответствует имени каждого столбца. Это относится как ко встроенным переменным CDR, так и к пользовательским. Если вы хотите писать встроенную переменную channel — просто создайте столбец с именем channel.

    Добавление пользовательского содержимого CDR так же просто, как и его настройка в диалплане. Например, если мы хотим записывать User-Agent, предоставляемый SIP-устройством — мы могли бы добавить его в качестве пользовательской переменной CDR:

    exten => 105,n,Set(CDR(useragent)=${CHANNEL(useragent)})
    

    Чтобы эта пользовательская переменная CDR была вставлена в базу данных с помощью cdr_adaptive_odbc, все, что нам нужно сделать — это создать столбец под названием useragent.

    Несколько таблиц могут быть указаны в конфигурационном файле cdr_adaptive_odbc. Каждая должна быть в своем собственном разделе конфигурации. Название раздела может быть любым — модуль не использует его. Вот пример простой конфигурации таблицы:

    [mytable]
    
    connection = asterisk
    table = asterisk_cdr
    

    Более подробный пример настройки базы данных для ведения журнала CDR можно найти в разделе «Хранение записей деталей вызовов”.

    Таблица 21-4 перечисляет параметры, которые могут быть указаны в разделе конфигурации таблицы в файле cdr_adaptive_odbc.conf.

    Таблица 21-4. cdr_adaptive_odbc.параметры конфигурации таблицы conf

    Параметр Значение/пример Примечание
    connection pgsql1 Подключение к используемой базе данных. Это ссылка на настроенное соединение в res_odbc.conf. Это поле является обязательным.
    table asterisk_cdr Имя таблицы. Это поле является обязательным.
    usegmtime no Указывает, следует ли регистрировать метки времени с помощью GMT вместо местного времени. Значением по умолчанию для этого параметра является no.

    В дополнение к полям пар ключ/значение, которые показаны в предыдущей таблице — cdr_adaptive_odbc.conf позволяет использовать несколько других элементов конфигурации. Первый — это псевдоним (альяс) столбца. Обычно переменные CDR регистрируются в столбцах с тем же именем. alias позволяет сопоставить имя переменной со столбцом с другим именем. Синтаксис таков:

    alias CDR variable => column name
    

    Вот пример сопоставления столбцов с помощью параметра alias:

    Также можно задать фильтр содержимого. Это позволяет задать критерии, которые должны совпадать, для записей, вставляемых в таблицу. Синтаксис таков:

    filter CDR variable => content
    

    Вот пример фильтра содержимого:

    filter accountcode => 123
    

    Наконец, cdr_adaptive_odbc.conf позволяет определять статическое содержимое для столбца. Это может быть полезно в сочетании с набором filters. Это статическое содержимое может помочь дифференцировать записи, вставленные в одну и ту же таблицу, по различным разделам конфигурации. Синтаксис для статического содержимого является:

    static "Static Content Goes Here" => column name
    

    Ниже приведен пример указания статического содержимого, вставляемого с помощью CDR:

    static "My Content" => my_identifier
    

    cdr_csv

    Модуль cdr_csv — это очень простой сервер CDR, записывающий CDR в файл CSV (значения разделенные запятыми). Этот файл называется /var/log/asterisk/cdr-csv/Master.csv. Пока ведение журнала CDR включено в cdr.conf и этот модуль загружен — CDR будут зарегистрированы в файле Master.csv. Мы рекомендуем, чтобы независимо от любого другого бэкенда CDR, выбранного Вами для настройки, Вы также оставили настроенным и его, поскольку он будет служить отличной резервной копией, если вы потеряете другие данные CDR из-за сети или связанных с ней проблем.

    Хотя для обеспечения работы этого модуля никакие параметры не требуются — есть некоторые параметры, настраивающие его поведение. Эти параметры перечислены в разделе Таблица 21-5 и помещаюися в раздел [csv] cdr.conf.

    Таблица 21-5. cdr.conf параметры раздела [csv]

    Параметр Значение/пример Примечание
    usegmtime no Регистрация меток времени, используя GMT вместо местного времени. Значение по умолчанию: no.
    loguniqueid no Запись переменной CDR uniqueid. Значение по умолчанию: no.
    loguserfield no Запись переменной CDR userfield. Значение по умолчанию: no.
    accountlogs yes Создание отдельного CSV-файла для каждого отдельного значения параметра переменной CDR accountcode. Значение по умолчанию: yes.

    Порядок переменных CDR в CSV файлах, созданных с помощью модуля cdr_csv:

    <accountcode>,<src>,<dst>,<dcontext>,<clid>,<channel>,<dstchannel>,<lastapp>, 
        <lastadata>,<start>,<answer>,<end>,<duration>,<billsec>,<disposition>, 
        <amaflags>[,<uniqueid>][,<userfield>]
    

    Поместите следующие строки в файл /etc/asterisk/cdr.conf:

    [general]
    enable=yes
    
    [csv]
    usegmtime=yes     ; писать время в формате GMT. По умолчанию 'no'
    loguniqueid=yes   ; писать uniqueid. По умолчанию 'no'
    loguserfield=yes  ; писать пользовательское поле. По умолчанию 'no'
    accountlogs=yes   ; создавать отдельный файл журнала для каждой учетной записи. По умолчанию 'yes'
    ;newcdrcolumns=yes ; включить ведение жунрала в формате столбцов CDR после-1.8 (peeraccount,linkedid,sequence)
                       ; По умолчанию 'no'.
    

    Сохраните его, смените владельца и перезагрузите модуль CDR.

    $ chown asterisk: asterisk /etc/asterisk/cdr.conf
    $ sudo asterisk-rx 'module reload cdr'
    

    cdr_custom

    Этот сервер CDR позволяет выполнять пользовательское форматирование записей CDR в файле журнала. Этот модуль наиболее обыкновенно использован для подгоняемого выхода CSV. Файл конфигурации, используемый для этого модуля — это /etc/asterisk/cdr_custom.conf. Единственный необходимый раздел [mappings] должен существовать в этом файле. Раздел [mappings] содержит сопоставления между именем файла и пользовательским шаблоном для CDR. Шаблон задается с помощью функций диалплана Asterisk.

    В следующем примере показан пример конфигурации для cdr_custom позволяющий использовать один CDR-файл журнала — Master.csv. Этот файл будет создан как /var/log/asterisk/cdr-custom/Master.csv. Шаблон, который был определен, использует обе функции диалплана CDR() и CSV_QUOTE(). CDR() извлекает значения из регистрируемого CDR-файла. CSV_QUOTE() гарантирует что значения правильно экранированы для формата CSV:

    [mappings]
    Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},
    ${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},
    ${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},
    ${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},
    ${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},
    ${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},
    ${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},
    ${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},
    ${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})}
    

    В файле фактической конфигурации, значения для сопоставления в Master.csv должны быть на одной строке.

    cdr_manager

    Бэкэнд cdr_manager выдает CDR в виде событий на Asterisk Manager Interface (AMI), который мы подробно обсудили в разделе Глава 17. Этот модуль сконфигурирован в файле /etc/asterisk/cdr_manager.conf. Первый раздел в этом файле — это [general] раздел, который содержит один параметр для включения этого модуля (значение по-умолчанию — no):

    Другой раздел в cdr_manager.conf — это [mappings]. Он позволяет добавлять пользовательские переменные CDR в события менеджера. Синтаксис таков:

    CDR variable => Header name
    

    Вот пример добавления двух пользовательских переменных CDR:

    [mappings]
    
    rate => Rate
    carrier => Carrier
    

    С этой конфигурацией на месте, записи CDR появятся как события на интерфейсе менеджера. Чтобы создать пример события менеджера — мы будем использовать следующий пример диалплана:

    exten => 110,1,Answer()
        same => n,Set(CDR(rate)=0.02)
        same => n,Set(CDR(carrier)=BS&S)
        same => n,Hangup()
    

    Эта команда используется для выполнения данного расширения и создания примера события диспетчера:

    *CLI> console dial 110@testing
    

    Наконец, вот пример события менеджера, созданного в результате этого тестового вызова:

    Event: Cdr
    Privilege: cdr,all
    AccountCode:
    Source:
    Destination: 110
    DestinationContext: testing
    CallerID:
    Channel: Console/dsp
    DestinationChannel:
    LastApplication: Hangup
    LastData:
    StartTime: 2010-08-23 08:27:21
    AnswerTime: 2010-08-23 08:27:21
    EndTime: 2010-08-23 08:27:21
    Duration: 0
    BillableSeconds: 0
    Disposition: ANSWERED
    AMAFlags: DOCUMENTATION
    UniqueID: 1282570041.3
    UserField:
    Rate: 0.02
    Carrier: BS&S
    

    cdr_odbc

    Этот модуль включает устаревший интерфейс ODBC для ведения журнала CDR. Новые установки должны использовать cdr_adaptive_odbc вместо него.

    cdr_sqlite

    Этот модуль позволяет отправлять CDR в базу данных SQLite с помощью SQLite версии 2. Если у вас нет особой необходимости в SQLite версии 2 в отличие от версии 3, мы рекомендуем использовать для новых установок cdr_sqlite3_custom.

    Этот модуль не требует никакой конфигурации для работы. Если модуль был скомпилирован и загружен в Asterisk — он вставит CDR в таблицу под названием cdr в базе данных, расположенной по адресу /var/log/asterisk/cdr.db.

    cdr_sqlite3_custom

    Этот сервер CDR вставляет CDR в базу данных SQLite с помощью SQLite версии 3. База данных, созданная этим модулем, находится в каталоге /var/log/asterisk/master.db. Для этого модуля требуется файл конфигурации /etc/asterisk/cdr_sqlite3_custom.conf. Файл конфигурации определяет имя таблицы, а также настраивает, какие переменные CDR будут вставлены в базу данных.

    cdr_syslog

    Этот модуль позволяет вести журнал CDR используя syslog. Чтобы включить эту функцию, сначала добавьте запись в файл конфигурации syslog/etc/syslog.conf. Например:

    local4.*  /var/log/asterisk/asterisk-cdr.log
    

    Модуль Asterisk также имеет файл конфигурации. Добавьте следующий раздел в файл /etc/asterisk/cdr_syslog.conf:

    [cdr]
    
    facility = local4
    priority = info
    template = "We received a call from ${CDR(src)}"
    

    Вот пример записи системного журнала, использующего эту конфигурацию:

    $ cat /var/log/asterisk/asterisk-cdr.log
    
    Aug 12 19:17:36 pbx cdr: "We received a call from 2565551212"
    

    Пример записей деталей вызова

    Мы будем использовать модуль cdr_custom для иллюстрации некоторых примеров записей CDR для различных сценариев вызовов. Конфигурация, используемая для файла /etc/asterisk/cdr_custom.conf представлена в «cdr_custom”.

    Односторонний вызов

    В этом примере мы покажем, как выглядит CDR для простого одностороннего вызова:

    exten => 227,1,VoiceMailMain(@${GLOBAL(VOICEMAIL_CONTEXT)})
    

    Вот запись CDR из /var/log/asterisk/cdr-custom/Master.csv, которая была создана в результате вызова этого расширения:

    "","SOFTPHONE_A","227","sets","""101"" <SOFTPHONE_A>","PJSIP/SOFTPHONE_A-00000002",
    "","Playback","hear-odd-noise",
    "2019-03-04 02:31:39","2019-03-04 02:31:39","2019-03-04 02:31:42",
    3,3,"ANSWERED","DOCUMENTATION","1551666699.4",""
    

    Откройте его в электронной таблице, и он будет аккуратно выстроен.

    Предостережения

    Система CDR в Asterisk очень хорошо работает для довольно простых сценариев вызовов. Однако, поскольку сценарии вызовов становятся более сложными — включая звонки нескольким сторонам, трансферы, парковку и другие подобные функции — система CDR начинает отставать. Многие пользователи сообщают, что записи не отображают всю информацию, которую они ожидают. Многие исправления ошибок были сделаны для решения некоторых проблем, но стоимость регрессий или изменений в поведении при внесении изменений в этой области очень высока, так как эти записи используются для биллинга.

    В результате команда разработчиков Asterisk становится все более устойчивой к внесению дополнительных изменений в систему CDR. Вместо этого была разработана новая система, Channel event logging (CEL), которая предназначена для решения проблемы ведения журнала более сложных сценариев вызовов. Имейте в виду, что записи деталей вызовов являются более простыми и легкими в использовании — именно поэтому мы все еще рекомендуем использовать CDR, если они удовлетворяют вашим потребностям.

    Регистрация событий канала

    Регистрация событий канала (CEL) предоставляет более гибкие средства регистрации деталей сложных сценариев вызова. Вместо сворачивания вызова до одной записи журнала регистрируется ряд событий для вызова. Это дает более точную картину того, что произошло с вызовом, за счет более сложного лога.

    Для получения более подробной информации о CEL, ознакомьтесь с wiki Asterisk.

    Вывод

    Asterisk очень хорошо позволяет отслеживать множество различных аспектов его работы — от простых записей детализации вызовов до полной отладки выполняемого кода. Загляните в каталоги исходного кода, и вы найдете гораздо больше компонентов, чем у нас было места для освещения здесь. Эти различные механизмы помогут вам в усилиях по управлению вашей АТС Asterisk и они представляют собой один из способов, которым Asterisk значительно превосходит большинство (если не все) традиционных АТС.

    1. Который обычно находится в /etc/syslog.conf.
    2. И rsyslog, syslog-ng и всего-остального тоже.
    Также доступны:  EN 

    Отладка SIP протокола в Asterisk

    Если Вам необходимо увидеть SIP сообщения приходящие от пира, и какие сообщения отсылает Ваш сервер ему, то на сервере надо выполнить следующую команду: «asterisk -rx «sip set debug peer SIPuserID»» SIPuserID соответственно меняете на имя SIP аккаунт пользователя. Здесь важно учесть, что сервер Asterisk должен знать IP пользователя, другими словами пользователь должен быть зарегистрирован или у него в настройках должен быть прописал IP.

    Если Вам известен IP пользователя, но неизвестно имя пользователя, то можно воспользоваться командой «asterisk -rx "sip set debug ip 192.168.1.1"«. Для просмотрах всех отправляемых/получаемых SIP сообщений выполните «asterisk -rx "sip set debug on"«.

    Просмотреть результат выполнения можно двумя вариантами:

    Консольный вариант. Заходим в CLI консоль командой: «asterisk -r«. Данный способ быстрой, но на мой взгляд не очень удобный, так как лог бежит быстро и нет возможности поиска. Такой способ подходит для определения приходят ли сообщения вообще.
    Файл лог. Открываем файл логов asterisk /var/log/asterisk/messages и смотрим в нём всё что нам необходимо. При необходимости можем скопировать файл и часть файла.
    После завершения просмотра SIP сообщений не забудьте отключить отладку командой: «asterisk -rx "sip set debug off"«. В случае, если не получается выполнить какую либо команду из-за нехватки прав, перед командой пишите «sudo«.

    Отладка плана набора (DialPlan) в Asterisk

    Для запуска отладки плана набора или DialPlan выполните команду: «asterisk -rx "core set verbose 3"» Уровень verbose говорит asterisk насколько подробно ему сообщать о своих действия, уровня 3 вполне достаточно для анализа прохождения звонка. После запуска отладки сделайте звонок и все сведения о нём попадут в файл логов /var/log/asterisk/messages. По файлу выполните поиск номера, нас интересует строка, которая начинается с Executing. В этой сроке будут описаны действия из файл extensions.conf. Продолжайте поиск пока не дойдете до последней инструкции, в ней скорее всего и есть ошибка.

    Так же после отладки не забываем отключить её. «asterisk -rx "core set verbose off"» или «asterisk -rx "core set verbose 0"«.

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

    Обновлено: 19 марта 2019

    В этой статье мы расскажем как пользоваться Asterisk CLI (Command Line Interface), или проще говоря командной строкой Asterisk. CLI необходима для дебага ошибок и управления самим Asterisk.

    1) Для входа в Asterisk CLI необходимо ввести следующие команды:

    # rasterisk

    или

    # asterisk -rvvvvv

    Ключ -rvvvvv отвечает за уровень отображения дебага.

    Для выполнения команд из консоли Linux можно воспользоваться следующим синтексом:

    asterisk -rx "sip show peers"

    В кавычках вы указываете какую команду хотите применить.

    Для выхода из консоли необходимо ввести «quit» или «exit«.

    Приведем список существующих команд Asterisk CLI:

    • logger show channels — выводит список лог файлов
    • logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off} — включение/отключение определенного уровня логирования
    • logger rotate — ротация и новое открытие файлов логирования
    • logger remove channel — удаляет канал из логирования
    • logger reload — перезагружает логирование
    • logger mute — установка паузы на вывод информации в CLI Asterisk (т.е. в консоль не будет сыпаться никакая информация). Отключается это повторным вводом команды.
    • logger add channel — добавление нового канала для логирования
    • local show channels — выводит список локальных каналов АТС (внутренние вызовы)
    • keys show — выводит список ключей RSA
    • keys init — установка пароля для ключа RSA
    • indication show — выводит список индикаторов и стран
    • indication remove — удаление индикатора страны
    • indication add — установка индикатора для страны
    • iax2 unregister — снять регистрацию (принудительно) с IAX2 пира
    • iax2 test losspct — устанавливает % потерянных пакетов для тестирования работоспособности IAX2
    • iax2 show users [like] — выводит список пользователей IAX
    • iax2 show threads — выводит список вспомогательных потоков IAX
    • iax2 show stats — выводит статистику IAX пиров
    • iax2 show registry — выводит статус регистраций IAX пиров
    • iax2 show provisioning — выводит список шаблонов IAX для автонастройки
    • iax2 show peers — выводит информацию об IAX пирах
    • iax2 show peer — выводит информацию о IAX пире
    • iax2 show netstats — выводит сетевую статистику о IAX каналах
    • iax2 show firmware — выводит список доступных прошивок под IAX пользователей
    • iax2 show channels — выводит активные каналы IAX
    • iax2 show callnumber usage — выводит текущие записи в таблице IP
    • iax2 show cache — выводит кэш диалплана IAX
    • iax2 set mtu — устанавливает размер MTU IAX сообщений
    • iax2 set debug trunk {on|off} — включение/отключение дебага IAX каналов
    • iax2 set debug jb {on|off} — включение/отключение дебага джиттер-буфера IAX
    • iax2 set debug {on|off|peer} — включение/отключение дебага IAX
    • iax2 reload — перечитать конфигурационные файлы IAX
    • iax2 prune realtime — очищает кэш realtime
    • iax2 provision — производит автонастройку IAX пира
    • http show status — вывести статус HTTP сервера
    • group show channels — выводит список активных каналов с указанием групп
    • file convert — конвертация формата аудиофайла
    • features show — выводит список настроенных коротких кодов
    • fax show version — показываем версию факсового модуля
    • fax show stats — выводит историю передачи факсов
    • fax show settings — показывать глобальные настройки факсов
    • fax show sessions — показывает статус всех существующих факсовых сессий
    • fax show session — показывает статус конкретной факсовой сессии
    • fax show capabilities — показывает информацию о используемых факсовых модулях
    • fax set debug {on|off} — включение/отключения дебага факсов
    • dnsmgr status — показывает статус DNS Manager
    • dnsmgr reload — перезагружает конфигурацию DNS Manager
    • dnsmgr refresh — выполняет немедленное обновление DNS
    • dialplan show — выводит подробный список диалпланов
    • dialplan show globals — показывает глобальные переменные диалплана
    • dialplan show chanvar — показывает используемые переменные на канале
    • dialplan set global — установить глобальную переменную в диалплан
    • dialplan set extenpatternmatchnew true — использовать новый алгоритм набора номеров
    • dialplan set extenpatternmatchnew false — использовать старый алгоритм набора номеров
    • dialplan set chanvar -установить переменную на канал
    • dialplan save — сохранить диалплан в файл
    • dialplan remove include — удалить «include» из контекста
    • dialplan remove ignorepat — удалить указанный черный список из контекста
    • dialplan remove extension — удалить указанный внутренний номер
    • dialplan remove context — удалить указанный контекст
    • dialplan reload — перечитать extensions.conf
    • dialplan debug — включение дебага диалплана
    • dialplan add include — включить один контекст в другой контекст
    • dialplan add ignorepat — добавить новый шаблон в черный список
    • dialplan add extension — добавление внутреннего номера в контекст
    • devstate list — выводит список состояний устройств
    • devstate change —  изменить состояние внутреннего номера (доступные значения: UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING | RINGINUSE | ONHOLD)
    • database showkey — выводит данные из БД Asterisk по определенному ключу
    • database show — выводит данные из БД Asterisk
    • database query — запустить специальный запрос к astdb
    • database put — добавить/обновить значение в базе данных
    • database get — получить из базы данных данные
    • database deltree — удаление из базы данных дерева ключей/значений
    • database del — удаление из базы данных ключа/значения
    • data show providers — выводит доступную для получения, по запросу data get, информацию
    • data get — запрос на получение данных API
    • dahdi show version — выводит версию модуля Dahdi
    • dahdi show status — выводит статус интерфейсных плат Dahdi
    • dahdi show channel — выводит информацию о конкретном канале
    • dahdi show channels [group|context] — выводит список активных DAHDI каналов
    • dahdi show cadences — выводит список каденций
    • dahdi set swgain {rx|tx} — установить коэффициент усиления звука на канале софтверно
    • dahdi set hwgain {rx|tx} — установить коэффициент усиления звука на канале хардварно
    • dahdi set dnd — установить/снять статус DND (Do Not Disturb) на канале
    • dahdi restart — полный рестарт каналов Dahdi
    • dahdi destroy channels — разрушить канал Dahdi
    • dahdi create channels — создать канал Dahdi
    • core waitfullybooted — ждать полной загрузки Asterisk
    • core stop when convenient — выключение Asterisk, после того когда закончатся текущие вызовы
    • core stop now — немедленное выключение Asterisk
    • core stop gracefully — «теплое» выключение Asterisk
    • core show warranty — выводит информацию о гарантии на Asterisk
    • core show version — выводит версию Asterisk
    • core show uptime [seconds] — выводит информацию о продолжительности работы Asterisk и ОС
    • core show translation — выводит информацию (матрицу) о перекодировании аудиокодеков
    • core show threads — выводит информацию о запущенных приложениях Asterisk
    • core show taskprocessors — выводит информацию о запущенных процессах Asterisk
    • core show sysinfo — выводит информацию об операционной системе
    • core show switches — выводит альтернативные маршруты
    • core show sound — выводит информацию по конкретным звуковым файлам
    • core show sounds — выводит доступные звуки
    • core show settings — выводит некоторые настройки ядра Asterisk
    • core show profile — выводит информацию о профилях
    • core show license — выводит информацию о версии Asterisk
    • core show image formats — выводит информацию о поддерживаемых форматах изображений
    • core show hint — выводит информацию о зарегистрированных кодах (feature code) в Asterisk, по конкретному внутреннему номеру
    • core show hints — выводит информацию о зарегистрированных кодах (feature code) в Asterisk
    • core show help — выводит список команд CLI Asterisk
    • core show hanguphandlers — выводит информацию о разрывах вызовов на конкретном канале
    • core show hanguphandlers all — выводит информацию о разрывах вызовов на всех каналах
    • core show function — выводит описание специальных функций диалплана
    • core show file version [like] — выводит список версий файлов используемых в Asterisk
    • core show file formats — выводит имена доступных форматов файлов
    • core show config mappings — выводит информацию о доступных к использованию базах данных
    • core show codec — выводит информацию о конкретном кодеке
    • core show codecs — выводит список поддерживаемых аудиокодеков
    • core show channeltypes — выводит список доступных технологий и протоколов для канала
    • core show channel — выводит информацию о конкретном канале
    • core show channels [concise|verbose|count] — выводит информацию о текущих каналах
    • core show calls [uptime] — выводит информацию о количестве текущих вызовов
    • core show application — выводит информацию о конкретном приложении диалплана
    • core show applications [like|describing] — показывает доступные приложения диалплана
    • core set verbose — установка уровня дебага
    • core set debug channel — Включение/отключение дебага на канале
    • core restart when convenient — перезагрузка Asterisk после завершения текущих вызовов
    • core restart now — немедленная перезагрузка Asterisk
    • core restart gracefully — мягкий перезапуск Asterisk
    • core reload — перечитать все конфигурационные файлы
    • core ping taskprocessor — показывает информацию об отклике приложений Asterisk
    • core clear profile — чистит информацию о профиле
    • core abort shutdown — прерывает отключение
    • config show help — выводит список модулей, которые имеют информацию о настройке
    • config reload — принудительная перезагрузка модулей с перечиткой конфигурационных файлов
    • config list — показывает файлы настройки относящиеся к конкретным приложениям Asterisk
    • confbridge unmute — включить голосовой канал у участников конференции
    • confbridge unlock — разблокировать конференцию
    • confbridge show profile users — выводит информацию о доступных профилях пользователей конференций
    • confbridge show profile user — выводит информацию о конкретном пользовательском профиле конференций
    • confbridge show profile bridges — выводит информацию о доступных профилях конференций
    • confbridge show profile bridge — выводит информацию о конкретном профиле конференций
    • confbridge show menus — показывает доступные меню для разных учетных данных
    • confbridge show menu — показывает какие команды доступны для управления конференцией
    • confbridge record stop — остановить запись разговоров в конференции
    • confbridge record start — начать запись разговоров в конференции
    • confbridge mute — отключить голосовой канал у участников конференции
    • confbridge lock — заблокировать конференцию
    • confbridge list — выводит список существующих конференций и их участников
    • confbridge kick — удалить участников из конференций
    • cli show permissions — показывает возможности настройки CLI
    • cli show aliases — показывает алиасы команд CLI
    • cli reload permissions — перезагрузка CLI прав пользователей
    • cli check permissions — показывает какими возможностями для настройки Asterisk обладает пользователь
    • channel request hangup — запрос завершения вызова на данном канале
    • channel redirect — перевод вызова в канале
    • channel originate — инициировать вызов. Пример команды «channel originate SIP/1000 extension [email protected]«. После ввода данной команды, Asterisk произведет набор номера 1000 и когда он поднимет трубку, Asterisk наберет номер 2000. Необходимо указывать контекст.
    • cel show status — выводит статус настроек CEL
    • cdr submit — запись ожидаемых сообщения в CDR
    • cdr show status — выводит статус настроек CDR
    • cdr show active — показывает какие каналы пишутся в CDR
    • cdr set debug [on|off] — запуск дебага в CDR
    • cc report status — выводит статус всех Call Completion т.е. функций обратного вызова
    • cc cancel — снять все Call Completion т.е. функцию обратного вызова, подробнее можно почитать в примере
    • bridge technology {suspend|unsuspend} — приостановить/возобновить использование технологий установки вызовов (bridge)
    • bridge technology show — выводит статус возможных технологий установки вызовов
    • bridge show — выводит информацию о конкретном голосовом канале (bridge)
    • bridge show all — выводит список всех двухсторонних голосовых каналов (bridgeй)
    • bridge kick — удалить один из каналов из bridge, т.е. разрушить один голосовой канал
    • ari show user — выводит информацию по конкретному пользователю ARI
    • ari show users — выводит список пользователей ARI
    • ari show status — выводит настройки ARI
    • ari mkpasswd — шифрование пароля, который используется в ari.conf
    • aoc set debug — включение дебага для сообщений AOC
    • agi show commands [topic] — выводит список команд AGI
    • agi set debug [on|off] — включение/отключение дебага AGI
    • agi exec — добавить команду AGI в канал Async AGI
    • agi dump html — показывает список AGI команд в формате HTML
    • ael set debug {read|tokens|macros|contexts|off} — использование дебага AEL
    • ael reload — перечитать конфигурационные файлы AEL
    • acl show — показать используемые ACL (Access Control List)
    • manager reload — перечитывает конфигурационный файлы, связанные с AMI
    • manager set debug [on|off] — включение/отключение дебага AMI
    • manager show command — выводит информацию об определенной команде AMI
    • manager show commands — выводит список команд AMI
    • manager show connected — выводит список подключенных пользователей AMI
    • manager show eventq — выводит список очередей событий
    • manager show events — выводит список событий AMI
    • manager show event — выводит информацию о событии AMI
    • manager show settings — выводит глобальные настройки AMI
    • manager show users — выводит список настроенных пользователей AMI
    • manager show user — выводит информацию об указанном пользователе
    • mfcr2 show version — выводит версию библиотеки OpenR2
    • mfcr2 show variants — выводит список поддерживаемых вариантов использования каналов MFC/R2
    • mfcr2 show channels [group|context] — выводит список каналов MFC/R2
    • mfcr2 set idle — перезагружает канал MFC/R2 и устанавливает его в статус IDLE
    • mfcr2 set debug — устанавливает канал MFC/R2 в режим дебага
    • mfcr2 set blocked — перезагружает канал MFC/R2 и устанавливает его в статус BLOCKED
    • mfcr2 call files [on|off] — включение/отключение MFC/R2 файлов
    • meetme {mute|unmute} — включает/отключает микрофон для конференций
    • meetme {lock|unlock} — блокирует/разблокирует конференцию для новых пользователей
    • meetme list — выводит список активных конференц-комнат
    • meetme kick — сбросить конференцию или пользователя конференции
    • mgcp audit endpoint — аудит указанного пира MGCP
    • mgcp reload — перечитать конфигурационные файлы MGCP
    • mgcp set debug {on|off} — включение/отключение MGCP дебага
    • mgcp show endpoints — выводит список MGCP пиров
    • minivm list accounts — выводит список пользователей, использующих Mini-voicemail
    • minivm list templates — выводит список шаблонов Mini-voicemail
    • minivm list zones — выводит список часовых поясов, настроенных в Mini-voicemail
    • minivm reload — перезагрузка конфигурации Mini-voicemail
    • minivm show settings — выводит глобальные настройки Mini-voicemail
    • minivm show stats — выводит статистику Mini-voicemail
    • mixmonitor {start|stop|list} — выполнить команду MixMonitor
    • module load — загрузить модуль
    • module reload — перезагрузить конфигурацию указанного модуля
    • module show [like] -выводит информацию об указанном модуле
    • module unload — отключить указанный модуль
    • moh reload — перезагрузка модуля MusicOnHold
    • moh show classes — выводит список классов и соответствующих каталогов
    • moh show files — выводит список звуковых файлов и каталогов, используемых для MusicOnHold
    • sip show sched — выводит состояние очереди планировщика
    • sip show registry -выводит список зарегистрированных SIP пиров
    • sip show peer — выводит информацию об указанном SIP пире
    • sip show peers — выводит список существующих SIP пиров
    • sip show objects — выводит список объектов SIP
    • sip show mwi — выводит список подписок MWI (Message-waiting indicator)
    • sip show inuse — выводит информацию о статусе пользователей
    • sip show history — выводит историю запросов SIP по конкретному вызову
    • sip show domains — выводит список SIP доменов
    • sip show channel — выводит подробную информацию о SIP канале
    • sip show channelstats — выводит статистику активных SIP каналов
    • sip show {channels|subscriptions} — выводит список SIP каналов или подписок
    • sip set history {on|off} — включение/отключение истории SIP
    • sip set debug {on|off|ip|peer} — включение/отключение SIP дебага
    • sip reload — перечитать конфигурационные файлы SIP
    • sip qualify peer — отправляет пакет OPTIONS в сторону указанного пира
    • sip prune realtime [peer|all] — удалить кэш базы данных Realtime для пользователя/устройства
    • sip notify — отправка пакета NOTIFY SIP пользователю
    • say load [new|old] — перечитать файл say.conf
    • rtp set debug {on|off|ip} — включение/отключение дебага RTP
    • rtcp set stats {on|off} — включение/отключение статистики RTCP
    • rtcp set debug {on|off|ip} — включение/отключение дебага RTCP
    • realtime update2 — используется для теста переменных RealTime
    • realtime update — обновляет переменные RealTime
    • realtime store — создание новой строки в базе RealTime
    • realtime mysql status — выводит информацию о драйвере MySQL RealTime
    • realtime mysql cache — выводит кэш таблиц драйвера MySQL RealTime
    • realtime load — используется для вывода переменных RealTime
    • realtime destroy — удаляет строку из базы данных RealTime
    • queue {pause|unpause} member — отключить/подключить пользователя от очереди
    • queue show rules — выводит настройки из файла queuerules.conf
    • queue show — выводит информацию об очередях
    • queue set ringinuse — установка параметра ringinuse для определенной очереди
    • queue set penalty — установка параметра penalty для определенной очереди
    • queue reset stats — перезагрузить статистику по очередям
    • queue remove member — удалить пользователя через из указанной очереди
    • queue reload {parameters|members|rules|all} — перезагрузить очередь, пользователей, правил обработки вызовов или все сразу
    • queue add member — добавить пользователя в очередь
    • pri show version — выводит информацию о версии модуля libpri
    • pri show span — выводит информацию о конкретной PRI линии
    • pri show spans — выводит информацию о PRI линиях
    • pri show debug — выводит информацию о настройках PRI дебага
    • pri show channels — выводит информацию о канале PRI
    • pri set debug file — включение дебага PRI и запись его в файл
    • pri set debug {on|off|hex|intense|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15} span — включение дебага PRI
    • pri service enable channel — включение канала PRI
    • pri service disable channel — отключение канала PRI
    • pri destroy span — разрушить канал PRI
    • presencestate list — выводит список пользовательских состояний присутствия
    • presencestate change — изменить пользовательский статус состояния присутствия
    • parking show — выводит информацию о парковочных слотах и конкретном слоте
    • odbc show — выводит список ODBC DSN
    • no debug channel — отключение дебага на канале (каналах)
    • sip show settings — выводит глобальные настройки SIP
    • sip show tcp — выводит список TCP соединений
    • sip show users — выводит информацию о SIP пользователях
    • sip show user— выводит информацию о конкретном SIP пользователе
    • sip unregister — удаление регистрации SIP пира с АТС
    • sla show stations — выводит список SLA
    • sla show trunks — выводит список SLA транков
    • stun set debug {on|off} — включение/отключение STUN дебага
    • timing test — запуск проверки синхронизации времени
    • transcoder show — выводит загрузку транскодинга канала DAHDI
    • udptl set debug {on|off|ip} — включение/отключение дебага UDPTL
    • udptl show config — выводит настройки UDPTL
    • ulimit — выводит или устанавливает ограничение на использование ресурсов процессами
    • voicemail reload — перечитать конфигурационные файлы VoiceMail
    • voicemail show users — список пользователей, которые используют голосовую почту
    • voicemail show zones — выводит список часовых поясов, настроенных в голосовой почте
    • xmldoc dump — собрать XML файлы в указанный файл

    Данный список актуален для версии Asterisk 13.3.2

    спасибо voipnotes

    Join @AdmNtsRu on Telegram

    Смотрите также:

    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии

    А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Как посмотреть отчет об ошибках на ксяоми
  • Как посмотреть отчет об ошибках виндовс