Данная статья посвящена работе с log-файлами, инструментам для работы с log-файлами и модули FreePBX способные помочь в работы с 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
Как можете видеть утилита вывела все события которые произошли в указанное время, однако нам нужен полный лог связанный с этим событием и есть возможность его вывести игнорируя все остальные события. Для этого обратите внимание на значение [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
После попадаем мы на следующую страничку
Как можете видеть, уже без каких либо манипуляций модуль подгрузил последние логи со станции без каких либо фильтров
Есть возможность просматривать все логи не только за сегодняшнее число, но и за прошлые, а так же конкретно какой-то log-файл просмотреть.
Давайте для примера посмотрим подробную статистику по одному из звонков.
Как можете видеть поле Filtre выполняет ту же роль что и утилита grep
Тем не менее, советуем при возможности просматривать логи подключившись к серверу напрямую используя терминальный клиент PuTTy который, к примеру, поддерживает операцию копировать/вставить, что упрощает работу при анализе лога.
Модуль Support FreePBX
Обратите внимание, что данный модуль был включен в дистрибутив начиная с 13 версиии FreePBX.
Это очень полезная секция, которая позволяет получить доступ к логам. Благодаря ей можно скачать zip-файл, который будет содержать отчет с необходимой информацией, а так же логами для дальнейшего их исследования. Чтоб попасть на страничку модуля нужно пройти по следующему пути: Admin — System Admin
И мы попадаем в System Admin.
Здесь множество полезных утилит для администратора, но в данной статье нас интересует модуль Support. вниз и выбираем раздел
Выбираем раздел «Support»
На этой странице и можно скачать 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
Сбор статистики звонков по региональным направлениям
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
- Do NOT post the output of your file as a comment. This clutters the issue and will only result in your comment being deleted.
- 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 )
Расположение Описание
/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
Чисто журналы смотреть тяжело, поэтому пользуемся активно сортировками:
Мониторим номер и его изменения:
tail -f /var/log/asterisk/full | grep 101
Вывод лога за число по группе вызовов
cat /var/log/asterisk/full-20181022 |grep 602
Мониторинг fail2ban и полного лога в он-лайн
tail -f /var/log/fail2ban.log
tail -f /var/log/asterisk/full
Поиск по вызовам(имя файла сокращено)
find /var/spool/asterisk/monitor/ -name «out-1234567.wav»
Ищем в логах по ID
grep 220-00005f3e /var/log/asterisk/full*
grep 220-00005f3e /var/log/asterisk/full-20181221
Проверяем по IP-адресу что стучался на web
grep 192.168.100 /etc -R | grep -v /etc/httpd/logs/access_log
Проверяем донабор DISA
tail -f /var/log/asterisk/full | grep disa-dtmf
Смотрим регистрации:
egrep «(Rea|UNREA|Register)» /var/log/asterisk/full*
Удобный просмотр лога
less /var/log/asterisk/full-дата
Удобный просмотр лога, где {name} — имя регистрации
grep {name} /var/log/asterisk/messages
Удобный просмотр лога, где {name} — адрес, который ищем
tail -f /var/log/asterisk/messages | grep {ip}
Конец!
Данная статья посвящена решению проблем со звонками в Asterisk. В ней подробно расскажу принципы решения возникающих проблем с Asterisk.
Работа с лог файлами.
Как известно все программы пишут свои лог файл, в которые записывают что произошло, что вызвало ошибку, куда не получилось получить доступ и так далее.
И так как же работать с лог файлами? Как правило на работающем сервере эти файлы достаточно большие и надо уметь найти нужную строку в них. Для этих целей нам помогают текстовые редакторы. Я расскажу на примере встроенного текстового редактора nano.
Для того чтоб открыть файл в данном редакторе нам необходимо выполнить команду: «nano <путь к файлу>». Пример: «nano /var/log/asterisk/messages». Открыли данный файл и видим, что в нём огромное количество строк. Для поиска по строкам нам поможет комбинация клавиш Ctrl+W. В нижу окна редактора появилась поисковая строка, набираем в неё искомый текст, например номер телефона, на который не проходит звонок и нажимаем Enter. Найденный номер будет подсвечен. Если нам необходимо поискать этот же номер дальше по тексту то просто нажимаем Ctrl+W и Enter, будет подсвечен следующие совпадение в тексте.
После того как работа с файлом завершена, нажимаем Ctrl+X, если файл не был не был изменен, то редактор просто закроется. Если же файл изменили, то он спросить нужно ли сохранять файл и если нужно то под каким именем.
Очень часто бывает что файл слишком большой и часто повторяется искомая строка, тогда если в файле логов нет необходимости и можно его стереть для удобства последующего анализа сделать это можно следующей командой «dd if=/dev/null of=<путь к файлу>». Что сделает команда dd? Возьмет NULL и перезапишет им файл.
Отладка звонка VoIP с помощью WireShark.
Иногда нужно посмотреть какие же данные приходили и уходили от сервера. Сделать это можно с помощь программы WireShark. Для этого программе нужно «скормить» файл с расширением «.pcap». Как же его получить этот файл? Для получения файл необходимо включить дамп на сервере. Включается дамп следующей командой: «tcpdump -s 0 -w dump.cap». Это команда будет снимать дамп пока её не прервете нажатием Ctrl+C. В случае, если через Ваш сервер проходит большое количество звонков, то файл дампа окажется очень большим. Для того, чтоб уменьшить файл необходимо указать хост с которого должны приходить пакеты или на который отправляются.
Сделать это можно указам дополнительный параметр программе tcpdump host . Пример: «tcpdump -s 0 -w dump.cap host 192.168.1.1», для нескольких адресов «tcpdump -s 0 -w dump.cap host 192.168.1.1 or 192.168.1.2». Для снятия дампа с конкретного интерфейса выполните команду «tcpdump -i <имя интерфейса> -s 0 -w dump.cap».
Для работы с файлом Вам надо его скопировать себе на компьютер, для этого можно воспользоваться scp если у Вас nix система команда выполняющая копирования пишется так «scp <имя пользователя на VoIP сервере>@<адрес сервера>:<путь к файлу> <необязательный параметр, путь куда сохранить, если не указано сохранит в текущую директорию>». Пример: «scp root@192.168.1.1:/home/root/dumps/dump.cap /home/vasya/dumps/» Если надо скопировать всю папку, то вместо имени файла поставьте «*». Если у Вас Windows, то можно воспользоваться утилитой WinSCP.
Скачали файл теперь выполним ряд действий:
- Запустите wireshark.
- Выберите файл voip.cap в диалоге File->Open.
- После открытия файла нажмите Telephony->VoIP calls.
- Вам отобразятся все звонки которые были в пакетном логе.
- Выберите нужный звонок, кликнув по нему мышкой и нажмите «Flow».
- Вам отобразится диаграмма звонка.
- Кликнув по любой из стрелок, wireshark отобразит вам содержимое пакета, которое вы сможете посмотреть.
Отладка 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″».
Вот пожалуй все действия, которые помогут Вам решить проблему со звонками.
Настройка логов Asterisk.
В данном файле настраивается журналирование событий Asterisk в файлы, консоль и syslog linux.
Для применения настроек выполните команду «logger reload» в консоли (CLI) Asterisk.
Глобальные настройки логов
[general]
dateformat
настройка отображения даты и времени в сообщениях отладки (debug)
в данном примере использован ISO 8601 формат даты (yyyy-mm-dd HH:MM:SS)
См. также strftime(3) Linux спецификацию формата.
Секундные доли могут быть использованы в данном поле.
Используйте %1q для отображения десятых или %2q для отображения сотых долей и тд.
dateformat=%F %T ; ISO 8601 dateformat=%F %T.%3q ; с миллисекундами
use_callids
Сохранять Asterisk Unique Call-Id (по умолчанию yes)
use_callids = no
appendhostname
Добавить имя хоста к имени лог файла.
appendhostname = yes
queue_log
Регистрировать события очереди. (по умолчанию yes).
queue_log = no
queue_log_to_file
Регистрировать события очереди в файл (по умолчанию no). События очереди могут сохраняться в реалтайм хранилище (базе данных). Сохранять события и в файл тоже, несмотря на то, что в extconfig.conf существует конфигурация типа: queue_log ⇒ odbc,asterisk
queue_log_to_file = yes
queue_log_name
Задайте имя файла лога очереди (по умолчанию queue_log)
queue_log_name = queue_log
queue_log_realtime_use_gmt
Когда используется Realtime лог очереди,
сохранять GMT дату, а не локальное время. По умолчанию ‘no’.
queue_log_realtime_use_gmt = yes
Ротация логов Asterisk
rotatestrategy = rotate
Выполнить команду Linux после ротации.
В примере, предпоследний файл с порядковым номером 2 (стратегия rotate) будет заархивирован.
exec_after_rotate=gzip -9 ${filename}.2
; ; ; ; In this file, you configure logging to files or to ; the syslog system. ; ; "logger reload" at the CLI will reload configuration ; of the logging system. [general] ; ; Customize the display of debug message time stamps ; this example is the ISO 8601 date format (yyyy-mm-dd HH:MM:SS) ; ; see strftime(3) Linux manual for format specifiers. Note that there is also ; a fractional second parameter which may be used in this field. Use %1q ; for tenths, %2q for hundredths, etc. ; ;dateformat=%F %T ; ISO 8601 date format ;dateformat=%F %T.%3q ; with milliseconds ; ; ; This makes Asterisk write callids to log messages ; (defaults to yes) ;use_callids = no ; ; This appends the hostname to the name of the log files. ;appendhostname = yes ; ; This determines whether or not we log queue events to a file ; (defaults to yes). ;queue_log = no ; ; Determines whether the queue_log always goes to a file, even ; when a realtime backend is present (defaults to no). ;queue_log_to_file = yes ; ; Set the queue_log filename ; (defaults to queue_log) ;queue_log_name = queue_log ; ; When using realtime for the queue log, use GMT for the timestamp ; instead of localtime. The default of this option is 'no'. ;queue_log_realtime_use_gmt = yes ; ; Log rotation strategy: ; none: Do not perform any logrotation at all. You should make ; very sure to set up some external logrotate mechanism ; as the asterisk logs can get very large, very quickly. ; sequential: Rename archived logs in order, such that the newest ; has the highest sequence number [default]. When ; exec_after_rotate is set, ${filename} will specify ; the new archived logfile. ; rotate: Rotate all the old files, such that the oldest has the ; highest sequence number [this is the expected behavior ; for Unix administrators]. When exec_after_rotate is ; set, ${filename} will specify the original root filename. ; timestamp: Rename the logfiles using a timestamp instead of a ; sequence number when "logger rotate" is executed. ; When exec_after_rotate is set, ${filename} will ; specify the new archived logfile. ;rotatestrategy = rotate ; ; Run a system command after rotating the files. This is mainly ; useful for rotatestrategy=rotate. The example allows the last ; two archive files to remain uncompressed, but after that point, ; they are compressed on disk. ; ; exec_after_rotate=gzip -9 ${filename}.2 ; ; ; For each file, specify what to log. ; ; For console logging, you set options at start of ; Asterisk with -v for verbose and -d for debug ; See 'asterisk -h' for more information. ; ; Directory for log files is configures in asterisk.conf ; option astlogdir ; [logfiles] ; ; Format is: ; ; logger_name => [formatter]levels ; ; The name of the logger dictates not only the name of the logging ; channel, but also its type. Valid types are: ; - 'console' - The root console of Asterisk ; - 'syslog' - Linux syslog, with facilities specified afterwards with ; a period delimiter, e.g., 'syslog.local0' ; - 'filename' - The name of the log file to create. This is the default ; for log channels. ; ; Filenames can either be relative to the standard Asterisk log directory ; (see 'astlogdir' in asterisk.conf), or absolute paths that begin with ; '/'. ; ; An optional formatter can be specified prior to the log levels sent ; to the log channel. The formatter is defined immediately preceeding the ; levels, and is enclosed in square brackets. Valid formatters are: ; - [default] - The default formatter, this outputs log messages using a ; human readable format. ; - [json] - Log the output in JSON. Note that JSON formatted log entries, ; if specified for a logger type of 'console', will be formatted ; per the 'default' formatter for log messages of type VERBOSE. ; This is due to the remote consoles intepreting verbosity ; outside of the logging subsystem. ; ; Log levels include the following, and are specified in a comma delineated ; list: ; debug ; notice ; warning ; error ; verbose(<level>) ; dtmf ; fax ; security ; ; Verbose takes an optional argument, in the form of an integer level. ; Verbose messages with higher levels will not be logged to the file. If ; the verbose level is not specified, it will log verbose messages following ; the current level of the root console. ; ; Special level name "*" means all levels, even dynamic levels registered ; by modules after the logger has been initialized (this means that loading ; and unloading modules that create/remove dynamic logger levels will result ; in these levels being included on filenames that have a level name of "*", ; without any need to perform a 'logger reload' or similar operation). ; Note that there is no value in specifying both "*" and specific level names ; for a filename; the "*" level means all levels. The only exception is if ; you need to specify a specific verbose level. e.g, "verbose(3),*". ; ; We highly recommend that you DO NOT turn on debug mode if you are simply ; running a production system. Debug mode turns on a LOT of extra messages, ; most of which you are unlikely to understand without an understanding of ; the underlying code. Do NOT report debug messages as code issues, unless ; you have a specific issue that you are attempting to debug. They are ; messages for just that -- debugging -- and do not rise to the level of ; something that merit your attention as an Asterisk administrator. Debug ; messages are also very verbose and can and do fill up logfiles quickly; ; this is another reason not to have debug mode on a production system unless ; you are in the process of debugging a specific issue. ; ;debug => debug ;security => security console => notice,warning,error ;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 ;