В этой статье мы разберём, как фильтровать логи FreePBX для поиска информации о состоянии экстеншена с использованием команды grep
и её опций.
Основы команды grep
grep
— мощный инструмент для поиска текста в файлах, который позволяет находить нужные строки и фильтровать их по множеству условий. В FreePBX логи обычно сохраняются в файле /var/log/asterisk/full
, который содержит подробные записи о работе системы и вызовах.
Пример фильтрации для отслеживания состояния экстеншена
Для мониторинга состояния определённого экстеншена (например, 3262
) можно использовать следующую команду:
grep "3262" /var/log/asterisk/full-202411* | grep -i -e "reachable" -e "unreachable" -e "LAGGED" -e "CHANUNAVAIL" -e "CONGESTION" -e "BUSY" -e "TIMEOUT" -e "NOANSWER" -e "FAILED"
Разберём каждый элемент этой команды:
-
Поиск по экстеншену:
"3262"
- Сначала мы ищем все строки, содержащие номер экстеншена
3262
. Это помогает изолировать события, связанные только с этим номером, исключая ненужные записи.
- Сначала мы ищем все строки, содержащие номер экстеншена
-
Путь к логам:
/var/log/asterisk/full-202411*
- Мы указываем путь к файлам логов. Звёздочка
*
позволяет искать в нескольких файлах сразу, например, во всех логах за ноябрь 2024 года.
- Мы указываем путь к файлам логов. Звёздочка
-
Дополнительные фильтры состояния:
-e "reachable" -e "unreachable" -e "LAGGED" -e "CHANUNAVAIL" -e "CONGESTION" -e "BUSY" -e "TIMEOUT" -e "NOANSWER" -e "FAILED"
- Флаги
-e
позволяют искать несколько слов одновременно. Эти состояния помогут выявить потенциальные проблемы с экстеншеном.
- Флаги
Основные статусы экстеншенов в Asterisk/FreePBX:
Статусы доступности и подключения:
-
Reachable – Экстеншен доступен и отвечает без задержек. Это нормальное состояние при стабильном подключении.
-
Unreachable – Экстеншен недоступен. Обычно указывает на проблемы с подключением устройства, оно не отвечает на запросы от Asterisk.
-
LAGGED – Экстеншен доступен, но ответ поступает с задержкой. Это может негативно сказываться на качестве связи.
Статусы вызова (на основе SIP и других протоколов):
-
Idle – Экстеншен неактивен, находится в состоянии ожидания вызова.
-
Ringing – Звонок поступил на экстеншен, и устройство должно звенеть.
-
InUse – Экстеншен в использовании, на устройстве происходит вызов.
-
Busy – Экстеншен занят другим вызовом, не может принять новый вызов. Часто связано с ограничением на одновременное количество вызовов.
-
Hold – Вызов поставлен на удержание (Hold) на устройстве.
Статусы отказа или проблем с вызовом:
-
CHANUNAVAIL – Канал или экстеншен недоступен. Обычно это указывает на отсутствие подключения или проблему с сетью.
-
Congestion – Перегрузка канала или нехватка ресурсов для вызова. Это состояние может возникать при недостатке ресурсов на сервере или при превышении допустимого количества вызовов.
-
Failed – Ошибка вызова, неудачная попытка соединения.
-
NOANSWER – Вызов прошёл, но экстеншен не ответил на него в установленное время.
-
TIMEOUT – Превышено время ожидания ответа. Экстеншен не ответил на звонок в течение заданного тайм-аута.
Специфические статусы состояния в контексте SIP (требуют расширенного логирования и настройки):
-
Dialing – Вызов находится в процессе соединения с экстеншеном, происходит набор номера.
-
Answered – Вызов принят экстеншеном. Соединение установлено, и вызов активен.
-
Completed – Завершенный вызов. Это состояние отображает, что вызов был корректно завершен.
-
Unavailable – Экстеншен недоступен в момент вызова. Часто это связано с тем, что устройство не зарегистрировано в системе.
-
Rejected – Вызов отклонён экстеншеном, например, когда устройство занято или установлены настройки для автоматического отклонения вызова.
-
Disconnected – Экстеншен отключён от Asterisk. Обычно это связано с проблемами подключения или завершением регистрации устройства.
-
Forbidden – Ошибка соединения, вызванная ограничением прав или запрещенными настройками для вызова.
Протокольные ошибки и коды состояния:
-
SIP 403 Forbidden – Доступ к номеру или операции запрещён. Обычно это указывает на ограничение прав доступа.
-
SIP 404 Not Found – Указанный экстеншен не найден. Это может означать, что номер набран неверно или устройство отключено.
-
SIP 486 Busy Here – Экстеншен локально отклонил вызов как занятый. Обычно связано с ограничением на стороне клиента.
-
SIP 503 Service Unavailable – Сервис временно недоступен из-за перегрузки или проблем с сетью.
-
SIP 408 Request Timeout – Время ожидания запроса истекло. Экстеншен не ответил на запрос в установленный срок.
-
SIP 480 Temporarily Unavailable – Экстеншен временно недоступен, но может стать доступным позднее.
Дополнительные статусы, встречающиеся в Asterisk:
-
Dialstatus – Общий статус, отображающий итог вызова (например, DIALSTATUS=BUSY, DIALSTATUS=NOANSWER и т.д.). Этот статус может комбинировать сразу несколько состояний для общей оценки результата вызова.
-
OnHook/OffHook – Состояния трубки устройства: OffHook указывает, что трубка поднята и готова к вызову, OnHook – что устройство в состоянии покоя.
Примеры использования
Чтобы вывести информацию по экстеншену 3262
и отследить конкретные состояния в логах, можно использовать следующую команду:
grep "3262" /var/log/asterisk/full* | grep -i -e "reachable" -e "unreachable" -e "LAGGED" -e "CHANUNAVAIL" -e "CONGESTION" -e "BUSY" -e "TIMEOUT" -e "NOANSWER" -e "FAILED" -e "Ringing" -e "InUse" -e "Hold"
Эта команда покажет все строки, где присутствуют интересующие статусы для анализа работы экстеншена.
Пошаговая настройка фильтрации
Чтобы настроить поиск нужных данных:
- Определите номер экстеншена: Убедитесь, что в команде указан нужный экстеншен (например,
3262
). - Задайте временные рамки: Укажите файлы логов за интересующий период (например,
full-202411*
для поиска за ноябрь 2024 года). - Добавьте фильтры статусов: Используйте комбинации статусов, чтобы получить только строки, где экстеншен был недоступен или имел проблемы.
Примеры команд для специфических ситуаций
-
Просмотр всех записей с задержкой связи (LAGGED):
grep "3262" /var/log/asterisk/full* | grep -i "LAGGED"
-
Поиск всех случаев, когда экстеншен был недоступен (Unreachable):
grep "3262" /var/log/asterisk/full* | grep -i "unreachable"
-
Фильтрация записей за определённые даты (например, 11 по 13 ноября):
grep "3262" /var/log/asterisk/full-20241111 /var/log/asterisk/full-20241112 /var/log/asterisk/full-20241113 | grep -i -e "reachable" -e "unreachable" -e "LAGGED" -e "CHANUNAVAIL" -e "CONGESTION" -e "BUSY" -e "TIMEOUT" -e "NOANSWER" -e "FAILED"
-
Поиск всех неудачных вызовов (FAILED):
grep "3262" /var/log/asterisk/full* | grep -i "FAILED"
Чтобы ограничить вывод командой grep
по определенному диапазону времени в логах, можно использовать команду grep
с дополнительной фильтрацией по времени, используя регулярное выражение для времени в формате HH:MM:SS
в логе.
Предположим, что ваши логи имеют стандартный формат, где время записано в начале каждой строки в виде YYYY-MM-DD HH:MM:SS
. Тогда для фильтрации записей, которые были сделаны в интервале с 10:00 до 12:00 12 ноября 2024 года, можно использовать grep
с регулярным выражением.
Вот как это можно сделать:
grep "3262" /var/log/asterisk/full-20241112 | grep -E "^(2024-11-12 (10:[0-5][0-9]:[0-5][0-9]|11:[0-5][0-9]:[0-5][0-9]))" | grep -i -e "reachable" -e "unreachable" -e "LAGGED" -e "CHANUNAVAIL" -e "CONGESTION" -e "BUSY" -e "TIMEOUT" -e "NOANSWER" -e "FAILED"
Пояснение:
grep "3262" /var/log/asterisk/full-20241112
— ищем все строки с номером3262
в файле логов за 12 ноября 2024 года.grep -E "^(2024-11-12 (10:[0-5][0-9]:[0-5][0-9]|11:[0-5][0-9]:[0-5][0-9]))"
— выбираем строки, которые содержат время в интервале с 10:00:00 до 11:59:59 (включая оба времени).grep -i -e "reachable" -e "unreachable" -e "LAGGED" -e "CHANUNAVAIL" -e "CONGESTION" -e "BUSY" -e "TIMEOUT" -e "NOANSWER" -e "FAILED"
— фильтруем по статусам, которые могут быть связаны с проблемами подключения.
Если нужно расширить диапазон до 12:00 (включительно), регулярное выражение для времени будет выглядеть так:
grep -E "^(2024-11-12 (10:[0-5][0-9]:[0-5][0-9]|11:[0-5][0-9]:[0-5][0-9]|12:00:00))"
Это добавит в фильтрацию строки, где время равно 12:00:00.
Важно:
- Этот метод предполагает, что в логе время указано в формате
YYYY-MM-DD HH:MM:SS
. - Если время указано в другом формате, регулярное выражение нужно будет подкорректировать.
Советы по использованию grep
- Регистронезависимый поиск: Флаг
-i
позволяет искать слова вне зависимости от регистра (например,Unreachable
иunreachable
). - Использование подстановочных символов: Звёздочка
*
помогает указать диапазон файлов, что особенно удобно для поиска за длительный период. - Комбинирование с другими инструментами: При необходимости вы можете использовать
awk
иsed
для более сложной фильтрации и обработки данных.
Заключение
Фильтрация логов FreePBX с помощью grep
помогает быстро находить данные о состоянии экстеншенов и выявлять проблемы с соединением. Команда, показанная в статье, позволяет изолировать основные состояния, из-за которых экстеншен может быть недоступен для приёма вызовов.