WCS Core¶
Настройки логирования¶
За логирование WCS отвечает файл настроек log4j.properties и ряд настроек файла flashphoner.properties:
Настройки логирования flashphoner.properties¶
Настройка | Значение по умолчанию |
---|---|
client_log_level | INFO |
client_dump_level | 0 |
enable_extended_logging | true |
Логи пишутся в каталог /usr/local/FlashphonerWebCallServer/logs
- client_logs - логи, которые пишутся на стороне сервера и относятся к сессии клиента с WCS-сервером (клиентские логи).
- server_logs - общие логи, которые пишутся на стороне сервера.
Настройки логгирования log4j.properties¶
Это стандартный конфиг формата log4j.
Описание настроек¶
Аттрибут | Значение | Описание |
---|---|---|
log4j.rootLogger |
info, stdout, fAppender
|
Корневой логгер: - info - Уровень логгирования INFO. Доступны другие более подробные уровни, например DEBUG и TRACE , и менее подробные, например ERROR - stdout, fAppender - определяют как и куда будут выводиться логи
|
log4j.logger.incoming.Publication |
info, incoming_publication
|
Логгер статистики SIP звонков для входящего с SIP сервера трафика: - info - уровень логгирования- incoming_publication - определяют как и куда будут выводиться логи
|
log4j.logger.outgoing.Publication |
info, outgoing_publication
|
Логгер статистики SIP звонков для исходящего на SIP сервер трафика: - info - уровень логгирования- outgoing_publication - определяют как и куда будут выводиться логи
|
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
|
Вывод логов в файл |
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
|
Не используется |
Горячая замена настроек логгирования¶
WCS автоматически подхватывает изменения, сделанные в файле log4j.properties. Это удобно для целей отладки и получения дополнительных логов без перезагрузки сервера. Например, в том случае если требуется включить более подробные логи или изменить формат вывода логов. Однако для большей надежности в production все же рекомендуется выполнить перезагрузку WCS-сервера.
Трассировка Websocket сообщений¶
В целях отладки или разработки собственного API, может быть включена
трассировка всех Websocket сообщений, кроме транспортных. Для того,
чтобы логировать все входящие/исходящие Websocket сообщения в файл
websocket.log
в каталоге
/usr/local/FlashphonerWebCallServer/logs/server_logs
, необходимо
добавить в файл log4j.properties
следующие строки:
log4j.logger.WSServerHandler=trace, wsAppender
log4j.logger.WSClient=debug, wsAppender
log4j.appender.wsAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.wsAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.wsAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.wsAppender.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %20.20c{1} - %t %m%n
log4j.appender.wsAppender.File=${com.flashphoner.fms.AppHome}/logs/server_logs/websocket.log
Клиентские логи¶
Включение, отключение и управление уровнем логирования¶
Клиентские логи - это логи на сервере, которые относятся к сессии
web-клиента. Клиентские логи в client_logs
пишутся только тогда, когда
включена настройка (по умолчанию)
Для отключения клиентских логов необходимо установить в файле flashphoner.properties
Управлять уровнем логирования можно настройкой client_log_level
,
которая может принимать значения ERROR
, INFO
, DEBUG
, TRACE. По умолчанию
Для периодической очистки клиентских логов рекомендуется использовать cron в сочетании с find. Например, задание для проверки на устаревшие логи каждые 24 часа и удаление логов старше 30 дней будет выглядеть следующим образом
0 0 * * * find /usr/local/FlashphonerWebCallServer/logs/client_logs/ -type d -mtime +30 | xargs rm -rf
Включение отладочных логов для всех клиентских сессий¶
В некоторых случаях для диагностирования проблемы необходимо включить логирование для всех вновь подключившихся клиентских сессий, чтобы зафиксировать в логах процесс установки соединения и начало публикации потока. Эта возможность, начиная со сборки 5.2.512, включается настройкой
Для всех вновь подключившихся клиентов будут записаны отладочные логи в течение времени в секундах, заданного настройкой
По умолчанию, логи будут записываться в течение 60 секунд с начала сессии.
Эти настройки могут быть изменены через интерфейс командной строки и применены без перезапуска сервера.
Использование самописца (flight recorder)¶
Самописец (flight recorder) позволяет циклически записывать для публикуемого потока последние несколько событий. Эта информация поможет диагностировать проблемы с публикацией потока, не включая полные отладочные логи клиента. Самописец включается настройкой в файле flashphoner.properties
Необходимо также указать категорию событий, которые будут записываться (определяется разработчиком)
События записываются для публикующего клиента в
файл flight_recorder.log
в случае, если диагностируется остановка
публикации потока, или поток портится каким-либо образом.
Для того, чтобы протестировать работу самописца, необходимо установить параметр
без перезапуска сервера. Это запишет события для всех подключенных публикующих клиентов.
Warning
Параметр enable_flight_recorder_test
не предназначен для промышленной эксплуатации
Тонкая настройка клиенских логов¶
В сборке 5.2.2040 добавлена возможность тонкой настройки вывода в клиентские логи с точностью до конкретного логгера. Для этого используется файл client-log4j.properties
. В файле указывается имя конкретного логгера и уровень вывода, например:
Session=INFO
_com.flashphoner.media.AudioSession=INFO
_com.flashphoner.media.VideoSession=INFO
_com.flashphoner.media.MediaSession=DEBUG
Для указанных логгеров в клиентские логи будут выводиться сообщения на указанном уровне. Изменения в файле применяются без перезапуска WCS.
Структура и содержимое клиентских логов¶
Структура клиентских логов:
client_logs
---- 2018-05-16
-------- 84gij60a6u3ni7docsr1di1l5b-15-06-59
------------ flashphoner.log
------------ client-84gij60a6u3ni7docsr1di1l5b-2018.05.16.15.07.26-1526458046646.report
------------ MediaDump-85d65b00-639e-4a7e.31002-31004-31006-31008.pcap
Лог flashphoner.log¶
Клиентские логи client_logs
пишутся по датам. Под каждую дату создается
директория с именем в формате ГГГГ-ММ-ДД, например 2018-05-16.
Когда web-клиент устанавливает соединение с сервером, внутри директории
с датой создается каталог для этой сессии клиента, например
84gij60a6u3ni7docsr1di1l5b-15-06-59
, где 84gij60a6u3ni7docsr1di1l5b
-
идентификатор сессии, 15
- час, 06
- минута, 59
- секунда. В директорию
пишется flashphoner.log
, который содержит только те события на сервере,
которые непосредственно относятся к этой сессии клиента. Таким образом
мы видим когда клиент соединился с сервером, и какие логи были записаны
для сессии этого клиента.
Лог client-report¶
Дополнительный клиентский лог. Web-клиент имеет специальную функцию WCS
JavaScript API pushLog
. Эта функция отправляет на WCS-сервер логи,
которые ведутся на стороне браузера. Все логи, полученные от web-клиента
по pushLog, будут сохраняться на сервере. Когда web-клиент завершит
сессию с WCS-сервером, полученые логи будут записаны в файл
client-84gij60a6u3ni7docsr1di1l5b-2018.05.16.15.07.26-1526458046646.report
,
где 84gij60a6u3ni7docsr1di1l5b
- идентификатор сессии, 2018
- год, 05
-
месяц, 26
- день, 15
- час, 07
- минута, 26
- секунда, 1526458046646
-
миллисекунды.
Дампы медиатрафика¶
Если в файле настроек
flashphoner.properties указано
ненулевое значение client_dump
_level`, для клиента дополнительно
пишется дамп сессии:
- если
client_dump_level=1
. записывается только SIP трафик; - если
client_dump_level=2
, записывается весь медиатрафик.
Трафик записывается при помощи tcpdump, если данная утилита установлена в системе.
Лог flight_recorder.log¶
В данный файл записываются последние зафиксированные события для публикуемого потока.
Управление уровнем логирования "на лету"¶
Уровень логирования для определенной сессии можно менять на ходу, без перезапуска сервера. Для этого используются 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-методы и статусы ответа¶
/logger/enable_client_log¶
Установить указанный уровень логирования в заданной сессии
Request example¶
POST /rest-api/logger/enable_client_log HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"sessionId": "/127.0.0.1:57539/192.168.1.101:8443",
"logLevel": "DEBUG"
}
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
404 | Session not found |
/logger/disable_client_log¶
Полностью отключить логирование в заданной сессии
Request example¶
POST /rest-api/logger/disable_client_log HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"sessionId": "/127.0.0.1:57539/192.168.1.101:8443"
}
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
404 | Session not found |
Параметры¶
Имя параметра | Описание | Пример |
---|---|---|
sessionId | Идентификатор сессии |
/127.0.0.1:57539/192.168.1.101:8443
|
logLevel | Устанавливаемый уровень логирования |
DEBUG
|
Таким образом, при возникновении проблем с потоком, опубликованным на сервере (например, поток опубликован, но не воспроизводится), необходимо отправить серверу REST-запрос и переключить уровень логирования в DEBUG, а затем, когда проблема воспроизведена и данные собраны, переключить уровень логирования обратно в INFO. Возможно также полностью отключить логирование для определенной сессии.
Изменение уровня логирования при помощи REST-запросов влияет только на заданную сессию, но не на другие сессии на сервере, в том числе на сессии, создаваемые позднее.
Серверные логи¶
WCS Core пишет общие логи сервера в logs/server_logs
В этих логах можно отследить запуск и стартовые настройки сервера:
Запуск сервера
Остановка сервера
Информация о лицензии:
Кроме того, в серверных логах отображается информация о вызовах REST-методов
08:01:06,649 INFO RestClient - API-ASYNC-pool-8-thread-2 SEND REST OBJECT ==>
URL:http://localhost:8081/EchoApp/StreamStatusEvent
OBJECT:
{
"nodeId" : "rR3YA7yKB11iIIID4XkYveTF8ePhezMU@0.0.0.0",
"appKey" : "defaultApp",
"sessionId" : "/5.44.168.45:58541/95.191.131.65:8443",
"mediaSessionId" : "58488550-99dd-11e8-bf13-9b5947c0a0f5",
"name" : "569a",
"published" : true,
"hasVideo" : true,
"hasAudio" : true,
"status" : "PUBLISHING",
"audioCodec" : "opus",
"videoCodec" : "H264",
"info" : "Unknown",
"record" : false,
"width" : 0,
"height" : 0,
"bitrate" : 0,
"minBitrate" : 0,
"maxBitrate" : 0,
"quality" : 0,
"timeShift" : -1,
"createDate" : 1533603665644,
"mediaProvider" : "WebRTC",
"history" : false,
"origin" : "https://test.flashphoner.com:8888"
}
Таким образом, серверные логи предоставляют общую информацию о работе сервера.
CDR-логи¶
Сall Detail Record - это журнал SIP-звонков.
CDR записи пишутся в лог файл находящийся в logs/cdr/cdr.log
. Новый лог
файл создается на основе суточного интервала. Записи формируются в
CSV-файле, что позволяет их удобно обрабатывать.
Названия полей в файл не пишутся.
Формат записи:
Пример записи :
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-сообщений.
MDR записи пишутся в лог файл находящийся в logs/cdr/mdr.log
. Новый лог
файл создается на основе суточного интервала. Записи формируются в
CSV-файле, что позволяет их удобно обрабатывать.
Названия полей в файл не пишутся.
Формат записи:
Пример записи :
Поле | Описание |
---|---|
date | Дата и время сообщения |
msgId | Идентификатор сообщения |
from | SIP from |
to | SIP to |
disposition |
Результат сообщения: RECEIVED, SENT, FAILED - RECEIVED - сообщение получено- SENT - сообщение отправлено- FAILED - во время отправки сообщения произошла ошибка
|
Вы также можете собирать любую необходимую статистику по сообщениям и их статусам, используя REST хуки).
SDR-логи¶
Stream Detail Record - это журнал сессий публикации и воспроизведения потоков.
SDR записи пишутся в лог-файл sdr.log
, находящийся в директории
logs/cdr
. Новый лог-файл создается на основе часового интервала. Записи
сохраняются в CSV-формате, что упрощает их обработку. Названия полей в
файл не пишутся.
Формат записи:
Пример записи:
2015-11-11 08:36:13;Flash;stream-Bob;5c2d75c0-7d87-421d-aa93-2732c48d8eaa;00:00:48;UNPUBLISHED;;PUBLISH;3;
Поле | Описаниеn |
---|---|
start | Дата и время установки сессии |
mediaProvider | Используемое медиа на WCS JavaScript API: WebRTC, Flash, MSE |
name | Имя публикуемого / воспроизводимого потока |
mediaSessionId | Идентификатор медиа-сессии |
duration | Продолжительность сессии |
disposition |
Как сессия была завершена: UNPUBLISHED, STOPPED, FAILED - UNPUBLISHED - публикация потока была остановлена- STOPPED - воспроизведение потока было остановлено- FAILED - некорректное завершение сессии
|
info |
Если disposition==FAILED , содержит описание причины
|
type |
PUBLISH в случае публикации потокаSUBSCRIBE в случае воспроизведения потока |
subscribers | Количество подписчиков в случае публикации потока; 0 в случае воспроизведения потока |
CONNDR-логи¶
Connection Detail Record - это журнал WebSocket-сессий.
CONNDR записи пишутся в лог-файл sdr.log
, находящийся в директории
logs/cdr
. Новый лог-файл создается на основе часового интервала. Записи
сохраняются в CSV-формате, что упрощает их обработку. Названия полей в
файл не пишутся.
Формат записи:
Пример записи:
Field | Description |
---|---|
start | Дата и время установки сессии |
mediaSessionId | Идентификатор медиа-сессии |
disposition |
Как сессия была завершена: DISCONNECTED, FAILED DISCONNECTED - завершение сессии по инициативе клиентаFAILED - некорректное завершение сессии
|
info | Содержит описание завершения сессии |
duration | Продолжительность сессии |
GC-логи¶
По умолчанию логи сборщика мусора находятся в директории
/usr/local/FlashphonerWebCallServer/logs
.
Расположение и префикс имени лога можно изменить в файле настроек wcs-core.properties.
Для осуществления ротации логов средствами JVM в wcs-core.properties могут быть добавлены следующие настройки:
Тогда имена файлов будут такими
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
:
Тогда имена файлов будут такими
Лог статистики медиасессий¶
В сборке 5.2.1883 добавлено отображение текущей статистики по медиасессиям. Для того, чтобы эта статистика сохранялась в файл, была добавлена возможность ее логирования по завершении медиасессии. Кроме того, в сборке 5.2.1975 добавлена настройка, которая включает эту возможность
Статистика записывается в файл /usr/local/FlashphonerWebCallServer/logs/stats/media-session-connection-stats.log
в формате CSV
#{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 - количество аудио пакетов, отброшенных на этапе передачи в движок сервера
Пример записи
Запись статистики в файл настраивается в log4j.properties следующим образом
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
Если запись статистики медиасессии в файл включена, но в log4j.properties нет соотвествующей настройки, статистика будет выводиться в серверный лог на ERROR уровне:
ERROR ssionConnectionStats - API-ASYNC-pool-7-thread-3 359943b0-fc64-11ee-bd5a-1dcbd3939090; 0; 0; 0; 0; 0; 0; 0; 40; 0; 0
Уязвимость CVE-2021-44228¶
Уязвимость CVE-2021-44228 в библиотеке Apache log4j не может эксплуатироваться на WCS сервере. Конфигурирование логгера осуществляется только через файл log4j.properties, поэтому злоумышленник должен получить доступ к файловой системе сервера. Через поля ввода уязвимость не может быть проэксплуатирована:
-
Для проверки используем адрес https://log4shell.huntress.com/. По этому адресу генерируется уникальная ссылка, которую необходимо вставить в поля ввода.
-
Открываем пример Two Way Streaming на демо сервере https://demo.flashphoner.com:8888/client2/examples/demo/streaming/two_way_streaming/two_way_streaming.html, нажимаем
Connect
и вставляем ссылку в поля для имени потока. Публикуем и играем поток:
-
Открываем ссылку для просмотра результатов. В колонках
IP address
иDate/Time
должны выводиться обращения от нашего сервера, если уязвимость сработала
Как видно, уязвимость через поля ввода не может быть проэксплуатирована в сборке WCS 5.2.1109
Пояснения: почему WCS не подвержен уязвимости¶
В составе WCS используется версия библиотеки Apache log4j 1.2.17. В данной версии нет поддержки JDNI, которая была добавлена начиная с log4j 2.0-beta9. Поэтому CVE-2021-44228 не может эксплуатироваться в WCS.