Логгер по умолчанию, включение и отключение

По умолчанию, лог выполнения операций WebSDK выводится в консоль браузера с уровнем INFO

Начиная со сборки 0.5.28.2753.131 (исходный код на GitHub доступен по тэгу 05cb5bd), логирование может быть полностью отключено на этапе инициализации API

Flashphoner.init({flashMediaProviderSwfLocation: '../../../../media-provider.swf', logger: null});

или в коде приложения вызовом функции

Flashphoner.getLogger().setEnableLogs(false);

Затем, при необходимости, логирование может быть включено

Flashphoner.getLogger().setEnableLogs(true);

Изменение уровня логирования

Уровень логирования может быть изменен на этапе инициализации API

Flashphoner.init({flashMediaProviderSwfLocation: '../../../../media-provider.swf', logger: {severity: "WARN"}});

или в коде приложения вызовом функции

Flashphoner.getLogger().setLevel("WARN");

Поддерживаются следующие уровни логирования:

Level text constantDescription
ERRORТолько ошибки
WARNОшибки и предупреждения
INFOИнформация о работе функций WebSDK (по умолчанию)
DEBUGОтладочная информация
TRACEТрассировка выполнения

Отправка лога на сервер

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

Flashphoner.init({flashMediaProviderSwfLocation: '../../../../media-provider.swf', logger: {push: true}});

или в коде приложения вызовом функции

Flashphoner.getLogger().setPushLogs(true);

В этом случае лог клиента будет отправлен на WCS сервер по Websocket и будет передан сервером на бэкенд при помощи REST hook /pushLogs:

10:16:03,335 INFO            RestClient - API-ASYNC-pool-12-thread-5 SEND REST OBJECT ==>
URL:http://localhost:8081/apps/EchoApp/pushLogs
OBJECT:
{
  "nodeId" : "vdUfWbDQUa9TIFfYSwGmXhDs3zp1vH4p@192.168.0.111",
  "appKey" : "defaultApp",
  "sessionId" : "/192.168.0.100:50627/192.168.0.111:8443-966a2082-8033-4982-9bcb-fecc1bd46169",
  "logs" : "10:15:55 INFO webrtc - \"Initialized\"\n",
  "origin" : "https://test.flashphoner.com:8888"
}

При закрытии Websocket соединения лог клиента будет выведен в серверный лог:

10:16:09,144 INFO           WCS4Handler - DISCONNECT-CLIENT-pool-5-thread-7 
[-- BEGIN CLIENT LOG --]
CONF: ClientConfig{rtspMedia=falsertmpAgent=false, wsTunnel=false, login='rcmv5ls2g9fjno4rf09h7ct0d4', authenticationName='null', password='null', domain='null', outboundProxy='null', port=0, visibleName='null', regRequired=false, applicationName='null', swfUrl='null', qValue='null', pAssociatedUri='null', contactParams='null', authDate=Tue Dec 17 10:16:00 NOVT 2019, authToken='/192.168.0.100:50627/192.168.0.111:8443-966a2082-8033-4982-9bcb-fecc1bd46169', logsFolderName='null', clientVersion='0.5.28', clientOSVersion='5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36', clientBrowserVersion='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36', wsTunnelPacketization2='false', custom='{origin=https://test.flashphoner.com:8888}'}
IMPL: WSClient{channel=[id: 0x14913825, /192.168.0.100:50627 :> /192.168.0.111:8443], handler=com.flashphoner.server.client.handler.DelegateHandler@488a567e, closed=false, pageUrl='null', countUnansweredPing=0}
LOGS:
10:15:55 INFO webrtc - "Initialized"
10:15:55 INFO core - "Initialized"
10:16:03 DEBUG core - "Publish stream 826f"
10:16:03 INFO webrtc - {"audio":true,"video":{"width":320,"height":240,"frameRate":{"ideal":30}}}
10:15:55 INFO websocket - "Initialized"
10:16:04 INFO webrtc - "FOUND WEBRTC CACHED INSTANCE, id 8f70ebf0-207b-11ea-a503-b90a7846c4dd-LOCAL_CACHED_VIDEO"
10:16:04 DEBUG webrtc - "unknown device audioinput id communications"
10:16:04 DEBUG core - "Offer SDP:\nv=0\r\no=- 711383983964074476 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Od1r\r\na=ice-pwd:6pgmvqFhvU6kZAvh6YyUm3x0\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C6:73:08:03:00:33:DE:19:19:F3:A2:E6:E6:82:57:8A:7C:C4:F2:E5:40:6A:B8:7D:17:BD:0F:0C:1F:1B:5C:7D\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK 25d893b6-58b4-4000-b8ca-9848f134919d\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:2608046740 cname:5enl89cAwo3Zr4+N\r\na=ssrc:2608046740 msid:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK 25d893b6-58b4-4000-b8ca-9848f134919d\r\na=ssrc:2608046740 mslabel:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK\r\na=ssrc:2608046740 label:25d893b6-58b4-4000-b8ca-9848f134919d\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Od1r\r\na=ice-pwd:6pgmvqFhvU6kZAvh6YyUm3x0\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C6:73:08:03:00:33:DE:19:19:F3:A2:E6:E6:82:57:8A:7C:C4:F2:E5:40:6A:B8:7D:17:BD:0F:0C:1F:1B:5C:7D\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07\r\na=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK a5feb98a-4e85-4afe-b562-0d4dacaca904\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=123\r\na=rtpmap:114 red/90000\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 ulpfec/90000\r\na=ssrc-group:FID 473001812 3694826197\r\na=ssrc:473001812 cname:5enl89cAwo3Zr4+N\r\na=ssrc:473001812 msid:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK a5feb98a-4e85-4afe-b562-0d4dacaca904\r\na=ssrc:473001812 mslabel:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK\r\na=ssrc:473001812 label:a5feb98a-4e85-4afe-b562-0d4dacaca904\r\na=ssrc:3694826197 cname:5enl89cAwo3Zr4+N\r\na=ssrc:3694826197 msid:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK a5feb98a-4e85-4afe-b562-0d4dacaca904\r\na=ssrc:3694826197 mslabel:slBjksaRGOgqj5VSdPsLLMGDVWxrCDnGTXhK\r\na=ssrc:3694826197 label:a5feb98a-4e85-4afe-b562-0d4dacaca904\r\n"
10:16:04 DEBUG webrtc - "unknown device audiooutput id default"
10:16:04 DEBUG webrtc - "unknown device audiooutput id 6e3a02b2757fa1a862fe0c38cc9901fdae1a96ffc171489d13714e0530cbf12f"
10:16:04 DEBUG webrtc - "unknown device audiooutput id 888ce197e3dbe33d68c51c46e37dfee6534cd98523ef7c0c8aa6a80cb71288d3"
10:16:04 DEBUG webrtc - "unknown device audiooutput id communications"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:2407917592 1 udp 2122260223 172.16.0.142 50895 typ host generation 0 ufrag Od1r network-id 1"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:2131708102 1 udp 2122194687 192.168.0.100 50896 typ host generation 0 ufrag Od1r network-id 2"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:2407917592 1 udp 2122260223 172.16.0.142 50898 typ host generation 0 ufrag Od1r network-id 1"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:3119442946 1 udp 2122129151 169.254.219.216 50897 typ host generation 0 ufrag Od1r network-id 3"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:3119442946 1 udp 2122129151 169.254.219.216 50900 typ host generation 0 ufrag Od1r network-id 3"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:2131708102 1 udp 2122194687 192.168.0.100 50899 typ host generation 0 ufrag Od1r network-id 2"
10:16:04 DEBUG webrtc - "unknown device audiooutput id default"
10:16:04 DEBUG webrtc - "unknown device audioinput id communications"
10:16:04 DEBUG webrtc - "unknown device audiooutput id communications"
10:16:04 DEBUG webrtc - "unknown device audiooutput id 888ce197e3dbe33d68c51c46e37dfee6534cd98523ef7c0c8aa6a80cb71288d3"
10:16:04 DEBUG webrtc - "unknown device audiooutput id 6e3a02b2757fa1a862fe0c38cc9901fdae1a96ffc171489d13714e0530cbf12f"
10:16:04 DEBUG webrtc - "setRemoteSDP:"
10:16:04 DEBUG webrtc - "v=0\r\no=Flashphoner 0 1576552564626 IN IP4 192.168.0.111\r\ns=Flashphoner/1.0\r\nc=IN IP4 192.168.0.111\r\nt=0 0\r\nm=audio 31038 RTP/SAVPF 111 8 9\r\nc=IN IP4 192.168.0.111\r\na=mid:0\r\na=rtpmap:111 opus/48000/2\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:9 G722/8000\r\na=ptime:20\r\na=ice-pwd:63o06qauil0p05ab11s153qs71\r\na=ice-ufrag:8eba9440-207b-11ea-a503-b90a7846c4dd8scpa1ds8tm1sa\r\na=fingerprint:SHA-256 2E:38:3D:F8:CE:9D:74:4A:96:C2:AC:47:92:89:74:15:CF:C7:2C:7A:0B:F3:63:83:6B:0D:57:A1:03:22:C0:45\r\na=candidate:1 1 udp 2130706431 192.168.0.111 31038 typ host\r\na=candidate:1 2 udp 2130706431 192.168.0.111 31038 typ host\r\na=end-of-candidates\r\na=rtcp-mux\r\na=rtcp:31038 IN IP4 192.168.0.111\r\na=recvonly\r\nm=video 31040 RTP/SAVPF 102 125 124 123 127 108 96\r\nc=IN IP4 192.168.0.111\r\na=mid:1\r\na=rtpmap:102 H264/90000\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:125 H264/90000\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 H264/90000\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:123 H264/90000\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:127 H264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:108 H264/90000\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:* ccm fir\r\na=rtcp-fb:* nack\r\na=rtcp-fb:* nack pli\r\na=rtcp-fb:* goog-remb\r\na=ice-pwd:63o06qauil0p05ab11s153qs71\r\na=ice-ufrag:8eba9440-207b-11ea-a503-b90a7846c4dd8scpa1ds8tm1sa\r\na=fingerprint:SHA-256 2E:38:3D:F8:CE:9D:74:4A:96:C2:AC:47:92:89:74:15:CF:C7:2C:7A:0B:F3:63:83:6B:0D:57:A1:03:22:C0:45\r\na=candidate:1 1 udp 2130706431 192.168.0.111 31040 typ host\r\na=candidate:1 2 udp 2130706431 192.168.0.111 31040 typ host\r\na=end-of-candidates\r\na=rtcp-mux\r\na=rtcp:31040 IN IP4 192.168.0.111\r\na=recvonly\r\n"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:831304758 1 tcp 1518214911 192.168.0.100 9 typ host tcptype active generation 0 ufrag Od1r network-id 2"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:4151120114 1 tcp 1518149375 169.254.219.216 9 typ host tcptype active generation 0 ufrag Od1r network-id 3"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:3238401256 1 tcp 1518280447 172.16.0.142 9 typ host tcptype active generation 0 ufrag Od1r network-id 1"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:831304758 1 tcp 1518214911 192.168.0.100 9 typ host tcptype active generation 0 ufrag Od1r network-id 2"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:3238401256 1 tcp 1518280447 172.16.0.142 9 typ host tcptype active generation 0 ufrag Od1r network-id 1"
10:16:04 DEBUG webrtc - "Added icecandidate: candidate:4151120114 1 tcp 1518149375 169.254.219.216 9 typ host tcptype active generation 0 ufrag Od1r network-id 3"
10:16:08 DEBUG core - "Stop stream 826f"

[-- END CLIENT LOG ----]

Использование собственного логгера

Начиная со сборки 0.5.28.2753.131 (исходный код на GitHub доступен по тэгу 05cb5bd), можно определить собственный логгер

var customLogger = {
   error: function (text) {
       console.log("custom logger: ERROR:",text);
   },   
   warn: function (text) {
       console.log("custom logger: WARN:",text);
   },   
   info: function (text) {
       console.log("custom logger: INFO:",text);
   },
   debug: function (text) {
       console.log("custom logger: DEBUG:",text);
   },
   trace: function (text) {
       console.log("custom logger: TRACE:",text);
   }   
};

и указать его при инициализации API

Flashphoner.init({flashMediaProviderSwfLocation: '../../../../media-provider.swf', logger: {customLogger: customLogger}});

или в коде приложения вызовом функции

Flashphoner.getLogger().setCustomLogger(customLogger);

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

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

Определение параметров логирования для сессии, потока или звонка

В сборке WebSDK 2.0.215 добавлена возможность определять параметры логирования не только для приложения в целом, но и для сессии, потока или звонка. При этом на каждом из уровней используется свой экземпляр объекта логирования. Например, создадим собственные логгеры отдельно для публикации и проигрывания в приложении Two Way Streaming:

1. Определим логгеры для публикации

var publishCustomLogger = {
   error: function (text) {
       console.log("publish: ERROR:",text);
   },  
   warn: function (text) {
       console.log("publish: WARN:",text);
   },  
   info: function (text) {
       console.log("publish: INFO:",text);
   },
   debug: function (text) {
       console.log("publish: DEBUG:",text);
   },
   trace: function (text) {
       console.log("publish: TRACE:",text);
   }  
};

и для проигрывания

var playCustomLogger = {
   error: function (text) {
       console.log("play: ERROR:",text);
   },  
   warn: function (text) {
       console.log("play: WARN:",text);
   },  
   info: function (text) {
       console.log("play: INFO:",text);
   },
   debug: function (text) {
       console.log("play: DEBUG:",text);
   },
   trace: function (text) {
       console.log("play: TRACE:",text);
   }  
};

2. Указываем собственный логгер при создании потока для публикации

function publishStream() {
    ...
    session.createStream({
        name: streamName,
        display: localVideo,
        ...,
        logger: {customLogger: publishCustomLogger}
        ...
    }).publish();
}

и для проигрывания

function playStream() {
    ...
    session.createStream({
        name: streamName,
        display: remoteVideo,
        logger: {customLogger: playCustomLogger}
        ...
    }).play();
}

3. При публикации и проигрывании потока в модифицированном примере Two Way Streaming в консоль будут выведены сообщения от логгеров