...
Настройки логирования flashphoner.properties
Настройка | Значение по умолчанию |
---|---|
client_log_level | INFO |
client_dump_level | 0 |
enable_extended_logging | true |
Логи пишутся в каталог /usr/local/FlashphonerWebCallServer/logs
...
Это стандартный конфиг формата log4j.
Описание настроек
Аттрибут | Значение | Описание |
---|---|---|
log4j.rootLogger | info, stdout, fAppender | Корневой логгер. info - Уровень логгирования INFO. Доступны другие более подробные уровни, например DEBUG и TRACE и менее подробные, например ERROR. stdout, fAppender - определяют как и куда будут выводиться логи. |
log4j.logger.incoming.Publication | info, incoming_publication | Логгер статистики RTMFP-SIP звонков для входящего с SIP сервера трафика. info - уровень логгирования |
log4j.logger.outgoing.Publication | info, outgoing_publication | Логгер статистики RTMFP-SIP звонков для исходящего на SIP сервер трафика. info - уровень логгирования |
log4j.logger.pushLogs.FlashphonerHandler | Не используется | Не используется |
log4j.additivity.incoming.Publication | false | Не дублировать данные логи в общий лог, а писать в отдельные |
log4j.additivity.outgoing.Publication | false | Не дублировать данные логи в общий лог, а писать в отдельные |
log4j.logger.sipMessages | debug | Выводить входящие и исходящие SIP сообщения в лог |
log4j.logger.WSServerHandler | trace | Выводить исходящие Websocket сообщения в лог |
log4j.logger.WSClient | debug | Выводить входящие Websocket сообщения в лог |
log4j.appender.stdout | org.apache.log4j.ConsoleAppender | Вывод логов в stdout |
log4j.appender.fAppender | org.apache.log4j.DailyRollingFileAppender | Вывод логов в fAppender |
log4j.appender.incoming_publication | org.apache.log4j.DailyRollingFileAppender | Вывод статистики RTMFP в incoming_publication |
log4j.appender.outgoing_publication | org.apache.log4j.DailyRollingFileAppender | Вывод статистики RTMFP в outgoing_publication |
log4j.appender.clientLog | org.apache.log4j.DailyRollingFileAppender | Не используется |
Горячая замена настроек логгирования
...
Code Block | ||||
---|---|---|---|---|
| ||||
client_log_level=INFO |
Управление настройками автоматической очистки для этих логов осуществляется с помощью настроек keep_extended_logs_max_days, extended_logs_dir_depth, check_extended_logs_interval. По умолчанию проверка на устаревшие логи проходит каждые 24 часа и удаляются логи хранящиеся более 30 дней. Для изменения правил удаления и хранения клиентских логов отредактируйте эти настройки и перезапустите WCS сервер.
Управление уровнем логирования "на лету"
Уровень логирования для определенной сессии можно менять на ходу, без перезапуска сервера. Для этого используются REST-запросы
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://test.flashphoner.com:8081/rest-api/logger/enable_client_log
- HTTPS: https://test.flashphoner.com:8444/rest-api/logger/enable_client_log
Здесь:
...
Для периодической очистки клиентских логов рекомендуется использовать cron в сочетании с find. Например, задание для проверки на устаревшие логи каждые 24 часа и удаление логов старше 30 дней будет выглядеть следующим образом
Code Block | ||||
---|---|---|---|---|
| ||||
0 0 * * * find /usr/local/FlashphonerWebCallServer/logs/client_logs/ -type d -mtime +30 | xargs rm -rf |
Управление уровнем логирования "на лету"
Уровень логирования для определенной сессии можно менять на ходу, без перезапуска сервера. Для этого используются REST-запросы
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://test.flashphoner.com:8081/rest-api/logger/enable_client_log
- HTTPS: https://test.flashphoner.com:8444/rest-api/logger/enable_client_log
Здесь:
- test.flashphoner.com - адрес WCS-сервера
- 8081 - стандартный REST / HTTP порт WCS-сервера
- 8444 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /logger/enable_client_log - используемый REST-метод
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
/logger/enable_client_log |
| 200 - Уровень изменен 404 - Сессия не найдена | Установить указанный уровень логирования в заданной сессии | ||||||||
/logger/disable_client_log |
| 200 - Логирование отключено 404 - Сессия не найдена | Полностью отключить логирование в заданной сессии |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
sessionId | Идентификатор сессии | /127.0.0.1:57539/192.168.1.101:8443 |
logLevel | Устанавливаемый уровень логирования | DEBUG |
Таким образом, при возникновении проблем с потоком, опубликованным на сервере (например, поток опубликован, но не воспроизводится), необходимо отправить серверу REST-запрос и переключить уровень логирования в DEBUG, а затем, когда проблема воспроизведена и данные собраны, переключить уровень логирования обратно в INFO. Возможно также полностью отключить логирование для определенной сессии.
...
Code Block | ||||
---|---|---|---|---|
| ||||
3000;3001;f294f6116bf2cc4c725f20457ed76e5b@192.168.56.2;2014-11-21 15:01:37; 2014-11-21 15:01:41; 2014-11-21 15:02:45;64;ANSWERED |
Поле | Описание |
---|---|
src | Инициатор звонка |
dst | Принимающий звонок |
cid | Идентификатор звонка |
start | Начало звонка (дата и время). |
answer | Дата и время ответа абонента или SIP стороны. |
end | Дата и время завершения звонка |
billsec | Время в секундах между 'answer' и 'end'. |
disposition | Результат звонка: ANSWERED, NO_ANSWER, BUSY, FAILED. |
MDR-логи
Message Detail Record - это журнал SIP-сообщений.
...
Code Block | ||||
---|---|---|---|---|
| ||||
Fri Dec 26 15:26:16 NOVT 2014,null,A006,A005,RECEIVED |
Поле | Описание |
---|---|
date | Дата и время сообщения |
msgId | Идентификатор сообщения. Будет представлен только в message/cpim сообщениях, при isImdnRequired=true (см. документацию Web Call Server - Call Flow, где описаны параметры передаваемых сообщений в методе sendMessage). |
from | SIP from |
to | SIP to |
disposition | Результат сообщения: RECEIVED, SENT, FAILED. RECEIVED - сообщение получено. SENT - сообщение отправлено. FAILED - во время отправки сообщения произошла ошибка. |
Вы также можете собирать любую необходимую статистику по сообщениям и их статусам, используя WCS REST API. См. документацию Web Call Server - Call Flow, где перечислены все методы и наборы данных, которые WCS отправляет чрез REST при обработке сообщений.
...
Code Block | ||||
---|---|---|---|---|
| ||||
2015-11-11 08:36:13;Flash;stream-Bob;5c2d75c0-7d87-421d-aa93-2732c48d8eaa;00:00:48;UNPUBLISHED;;PUBLISH;3; |
Поле | Описание |
---|---|
start | Дата и время установки сессии |
mediaProvider | Используемое медиа на WCS JavaScript API: WebRTC, Flash |
name | Имя публикуемого / воспроизводимого потока |
mediaSessionId | Идентификатор медиа-сессии |
duration | Продолжительность сессии |
disposition | Как сессия была завершена: UNPUBLISHED, STOPPED, FAILED UNPUBLISHED - публикация потока была остановлена STOPPED - воспроизведение потока было остановлено FAILED - некорректное завершение сессии |
info | Если disposition==FAILED, содержит описание причины |
type | PUBLISH в случае публикации потока SUBSCRIBE в случае воспроизведения потока |
subscribers | Количество подписчиков в случае публикации потока; 0 в случае воспроизведения потока |
CONNDR-логи
Connection Detail Record - это журнал WebSocket-сессий.
...
Code Block | ||||
---|---|---|---|---|
| ||||
2018-04-25 19:29:08;/5.44.168.45:52199/95.191.131.64:8443;DISCONNECTED;Normal disconnect;17; |
Поле | Описание |
---|---|
start | Дата и время установки сессии |
mediaSessionId | Идентификатор медиа-сессии |
disposition | Как сессия была завершена: DISCONNECTED, FAILED DISCONNECTED - завершение сессии по инициативе клиента FAILED - некорректное завершение сессии |
info | Содержит описание завершения сессии |
duration | Продолжительность сессии |
GC-логи
По умолчанию логи сборщика мусора находятся в директории /usr/local/FlashphonerWebCallServer/logs.
...
Code Block | ||
---|---|---|
| ||
logs
---- gc-core.log2018-12-14_18-57.log.0
---- gc-core.log2018-12-14_18-57.log.1
---- gc-core.log2018-12-14_18-57.log.2.current |
Суффикс 'current' обозначает файл, в который ведется запись.
Чтобы убрать время создания из имени файла, нужно убрать проставление даты из переменной GC_SUFFIX в bin/setenv.sh:
Code Block | ||
---|---|---|
| ||
GC_SUFFIX=".log" |
Тогда имена файлов будут такими
Code Block | ||
---|---|---|
| ||
logs ---- gc-core.log.0 ---- gc-core.log.1 ---- gc-core.log.2.current14_18-57.log.2.current |
Суффикс 'current' обозначает файл, в который ведется запись.
Чтобы убрать время создания из имени файла, нужно убрать проставление даты из переменной GC_SUFFIX в bin/setenv.sh:
Code Block | ||
---|---|---|
| ||
GC_SUFFIX=".log" |
Тогда имена файлов будут такими
Code Block | ||
---|---|---|
| ||
logs
---- gc-core.log.0
---- gc-core.log.1
---- gc-core.log.2.current |
Лог статистики медиасессий
В сборке 5.2.1883 добавлено отображение текущей статистики по медиасессиям. Для того, чтобы эта статистика сохранялась в файл, была добавлена возможность ее логирования по завершении медиасессии.
Статистика записывается в файл /usr/local/FlashphonerWebCallServer/logs/stats/media-session-connection-stats.log
в формате CSV
Code Block | ||
---|---|---|
| ||
#{mediaSessionId}; {channels_not_writable}; {decodable_drops_old}; {incomplete_drops_old}; {decodable_drops_reset}; {incomplete_drops_reset}; {decodable_drops_pli}; {incomplete_drops_pli}; {data_packets_with_empty_payload}; {missed_h264_units}; {dropped_audio_data_packets} |
Здесь
- mediaSessionId - идентификатор медиа сессии
- channels_not_writable - количество событий, в результате которых не удалось записать данные на отправку в TCP сокет
- decodable_drops_old - количество сброшенных H264 фреймов, собранных из пакетов трафика
- incomplete_drops_old - количество сброшенных H264 фреймов, не полностью собранных из пакетов трафика
- decodable_drops_reset - количество сброшенных H264 фреймов до новой точки декодирования, собранных из пакетов трафика
- incomplete_drops_reset - количество сброшенных H264 фреймов до новой точки декодирования, не полностью собранных из пакетов трафика
- decodable_drops_pli - количество сбросов всех H264 фреймов, собранных из пакетов трафика, при приходе ключевого фрейма
- incomplete_drops_pli - количество сбросов всех H264 фреймов, не полностьюсобранных из пакетов трафика, при приходе ключевого фрейма
- data_packets_with_empty_payload - количество пакетов с пустым содержимым, высылаются браузером для оценки канала публикации при включенном TWCC
- missed_h264_units - количество потерянных H264 элементов
- dropped_audio_data_packets - количество аудио пакетов, отброшенных на этапе передачи в движок сервера
Пример записи
Code Block | ||
---|---|---|
| ||
f49f8cb0-dc52-11ee-81df-51ad589334c0; 0; 0; 7; 0; 0; 0; 10; 0; 443; 0 |
Запись статистики в файл настраивается в log4j.properties
следующим образом
Code Block | ||
---|---|---|
| ||
log4j.logger.MediaSessionConnectionStats=error, mediaSessionConnectionStatsAppender
log4j.additivity.MediaSessionConnectionStats=false
log4j.appender.mediaSessionConnectionStatsAppender=com.flashphoner.common.logging.NewLogForEachRunFileAppender
log4j.appender.mediaSessionConnectionStatsAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.mediaSessionConnectionStatsAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.mediaSessionConnectionStatsAppender.layout.ConversionPattern=%m%n
log4j.appender.mediaSessionConnectionStatsAppender.File=${com.flashphoner.fms.AppHome}/logs/stats/media-session-connection-stats.log |
Уязвимость CVE-2021-44228
Уязвимость CVE-2021-44228 в библиотеке Apache log4j не может эксплуатироваться на WCS сервере. Конфигурирование логгера осуществляется только через файл log4j.properties, поэтому злоумышленник должен получить доступ к файловой системе сервера. Через поля ввода уязвимость не может быть проэксплуатирована:
1. Для проверки используем адрес https://log4shell.huntress.com/. По этому адресу генерируется уникальная ссылка, которую необходимо вставить в поля ввода.
2, Открываем пример Two Way Streaming на демо сервере https://demo.flashphoner.com:8888/client2/examples/demo/streaming/two_way_streaming/two_way_streaming.html, нажимаем Connect и вставляем ссылку в поля для имени потока. Публикуем и играем поток:
3. Открываем ссылку для просмотра результатов. В колонках IP address
и Date/Time
должны выводиться обращения от нашего сервера, если уязвимость сработала
Как видно, уязвимость через поля ввода не может быть проэксплуатирована в сборке WCS 5.2.1109
Пояснения: почему WCS не подвержен уязвимости
В составе WCS используется версия библиотеки Apache log4j 1.2.17. В данной версии нет поддержки JDNI, которая была добавлена начиная с log4j 2.0-beta9. Поэтому CVE-2021-44228 не может эксплуатироваться в WCS.