關(guān)于環(huán)信3.xSDK日志簡單分析

個人博客:【lzan13 / 關(guān)于環(huán)信3.xSDK日志簡單分析

前言

首先說下環(huán)信日志保存的機制袱箱,這邊只要是在開啟了SDKDebug模式下調(diào)用環(huán)信的EMLog.d()方法輸出的日志荐类,日志內(nèi)容都會在控制臺輸出的同時記錄到設備的日志文件中未状;

這里就一些常見的日志跟大家略微解釋下呈宇,一邊能給大家在以后排查問題中起到一些幫助;

PS:這里所列出來的日志內(nèi)容只是特定情況測試下出現(xiàn)胯盯,在不同的設備孟辑,不同環(huán)境下稍微會有些出入扩淀,不過一些關(guān)鍵詞的地方都應該是一樣的楔敌,不要死心眼就好;

網(wǎng)絡相關(guān)

SDK 的初始化

SDK 初始化的時候會首先檢查 DNS 配置信息是否存在驻谆,如果不存在梁丘,在初始化時會首先請求 DNS 配置列表,請求成功后就會返回一個json串旺韭,2.x 是xml格式內(nèi)容氛谜;如果當對方的網(wǎng)絡情況有問題的時候,這一步就可以看出一些問題区端,比如請求 dns 列表失敗等

關(guān)鍵詞:getDnsListFromServer,parseDnsServer,dns_time

[2017/3/1 16:23:31:497]: =============EMChatClientImpl::init()==================
[2017/3/1 16:23:31:497]: dns config mode is 1
[2017/3/1 16:23:31:497]: EMConfigManager::init() 
[2017/3/1 16:23:31:497]: No config file, do nothing
[2017/3/1 16:23:31:497]: addConnectionListener
[2017/3/1 16:23:31:499]: =============== Call Manager init ===============
[2017/3/1 16:23:31:499]: addConnectionListener
[2017/3/1 16:23:31:506]: registerContactListener
[2017/3/1 16:23:31:511]: restBaseUrl()
[2017/3/1 16:23:31:511]: EMDNSManager::getCurrentHost: type: 2
[2017/3/1 16:23:31:512]: EMSessionManager::checkDNS()
[2017/3/1 16:23:31:512]: valid_time: 
[2017/3/1 16:23:31:512]: no saved dns list, download it
[2017/3/1 16:23:31:514]: getDnsListFromServer()
[2017/3/1 16:23:31:514]: buildUrl(): http://rs.easemob.com/easemob/server.json?sdk_version=3.2.3&app_key=easemob-demo%23chatdemoui&file_version=1
[2017/3/1 16:23:31:631]: [EMARHttpAPI] httpExecute code: 200
[2017/3/1 16:23:31:631]: 1 time retry
[2017/3/1 16:23:31:631]: DNS List size: 2115
[2017/3/1 16:23:31:631]: EMSessionManager::parseDnsServer: {"file_version":"61","resolver":{"hosts":[{"port":"80","domain":"rs.easemob.com","ip":"59.110.89.59"},{"port":"80","domain":"rs.easemob.com","ip":"112.126.66.111"},{"port":"80","domain":"rs.easemob.com","ip":"182.92.174.78"},{"port":"80","domain":"rs.easemob.com","ip":"116.62.83.103"},{"port":"80","domain":"rs.easemob.com","ip":"120.26.17.225"},{"port":"80","domain":"rs.easemob.com","ip":"120.26.15.207"},{"protocol":"https","port":"443","domain":"rs.easemob.com"}]},"rest":{"hosts":[{"protocol":"https","port":"443","domain":"a1.easemob.com"},{"protocol":"http","port":"80","domain":"a1.easemob.com","ip":"182.92.159.193"},{"protocol":"http","port":"80","domain":"a1.easemob.com","ip":"182.92.228.160"},{"protocol":"http","port":"80","domain":"a1.easemob.com","ip":"182.92.0.214"},{"protocol":"http","port":"80","domain":"a1.easemob.com","ip":"182.92.4.52"}]},"valid_before":"1496085791","im":{"hosts":[{"port":"443","domain":"im1.easemob.com","ip":"182.92.20.34"},{"port":"443","domain":"im1.easemob.com","ip":"182.92.20.117"},{"port":"443","domain":"im1.easemob.com","ip":"182.92.23.59"},{"port":"443","domain":"im1.easemob.com","ip":"182.92.26.56"}]},"deploy_name":"easemob","tcp_resolver":{"hosts":[{"port":"2020","domain":"rs.easemob.com","ip":"59.110.89.59"},{"port":"2020","domain":"rs.easemob.com","ip":"112.126.66.111"},{"port":"2020","domain":"rs.easemob.com","ip":"182.92.174.78"},{"port":"2020","domain":"rs.easemob.com","ip":"116.62.83.103"},{"port":"2020","domain":"rs.easemob.com","ip":"120.26.17.225"},{"port":"2020","domain":"rs.easemob.com","ip":"120.26.15.207"}]},"msync-im":{"hosts":[{"port":"6801","domain":"msync-im1.easemob.com","ip":"60.205.131.133"},{"port":"7830","domain":"msync-im1.easemob.com","ip":"60.205.109.58"}]},"xmpp":{"hosts":[{"protocol":"http","port":"80","domain":"im-api.easemob.com","ip":"im-api.easemob.com"},{"protocol":"http","port":"5280","domain":"im-api.easemob.com","ip":"182.92.159.193"},{"protocol":"http","port":"5280","domain":"im-api.easemob.com","ip":"182.92.228.160"},{"protocol":"https","port":"443","domain":"im-api.easemob.com"}]},"gcm_enabled":"true"}
[2017/3/1 16:23:31:631]: current time: 1488356611631
[2017/3/1 16:23:31:631]: valid time: 1496085791000
[2017/3/1 16:23:31:631]: saveConfigs()
[2017/3/1 16:23:31:632]: write to config file: {
    "dns_time":"1496085791000"
}

手動登錄

當進行手動登錄是值漫,會首先獲取 DNS 配置,(上邊初始化時不是已經(jīng)獲取了么织盼,為什么還要獲妊詈巍?因為 sdk 就這樣寫的沥邻,所以它又獲取了一次??)如果不存在就去獲取危虱,獲取失敗的情況下會進行多次嘗試,然后獲取完成 DNS 之后就開始登錄了唐全,登錄要做的就是獲取賬戶的 token埃跷,后續(xù)的操作都是根據(jù)這個 token 進行操作了

主要關(guān)鍵詞:login,getDnsListFromServer,fetchToken,token

[2017/3/1 16:39:6:481]: [EMClient] emchat manager login in process:19581
[2017/3/1 16:39:6:539]: EMSessionManager::login(): lz1
[2017/3/1 16:39:6:539]: getDnsListFromServer()
...
這里會同樣的去獲取 DNS 配置
...
[2017/3/1 10:1:41:794]: current host: domain: 182.92.0.214 port: 80
[2017/3/1 10:1:41:794]: fetchTokenForUser()http://182.92.0.214:80/shztzn/smartfarm/token
[2017/3/1 10:1:41:895]: [retrieve token time] 0: 0:101
[2017/3/1 10:1:41:895]: fetchToken success 
[2017/3/1 10:1:41:895]: saveToken(): user: pad8a7195bffad4b6bdb65e533e969e43c2 time: 1488333701895
[2017/3/1 10:1:41:921]: savetoken() result: 1
[2017/3/1 10:1:41:921]: EMDNSManager::getCurrentHost: type: 1
[2017/3/1 10:1:41:922]: EMSessionManager::checkDNS()
[2017/3/1 10:1:41:922]: EMDNSManager::getHost: type: 1
[2017/3/1 10:1:41:922]: current host: domain: 60.205.131.133 port: 6801
[2017/3/1 10:1:41:922]: token is valid
[2017/3/1 10:1:41:922]: setServer: 60.205.131.133
[2017/3/1 10:1:41:922]: Calling connect...
[2017/3/1 10:1:41:922]: doConnect()
[2017/3/1 10:1:41:922]: current connectState: 0
[2017/3/1 10:1:41:922]: log: level: 0, area: 1, ChatClient::connect() 
[2017/3/1 10:1:41:922]: log: level: 0, area: 2, getSocket(): 41
[2017/3/1 10:1:41:922]: log: level: 1, area: 2, connectSocket(): start to connecting...
[2017/3/1 10:1:41:958]: log: level: 1, area: 2, connectSocket(): connect finished
...

自動登錄

在3.x中確定自動登錄只需要一個關(guān)鍵詞就好:autoLogin
需要注意一點,自動登錄和重連不一樣邮利,自動登錄包含初始化以及 DNS 的檢測弥雹,重連一般不檢測 DNS,自動登錄最后輸出的日志基本和重連的一樣延届,都是進行網(wǎng)絡鏈接剪勿;

[2017/3/1 17:30:17:640]: autoLogin
[2017/3/1 17:30:17:641]: EMSessionManager::login(): lz1
[2017/3/1 17:30:17:641]: EMDNSManager::getCurrentHost: type: 1
[2017/3/1 17:30:17:641]: EMSessionManager::checkDNS()
[2017/3/1 17:30:17:641]: valid_time: 1496085791000
[2017/3/1 17:30:17:641]: EMSessionManager::parseDnsServer: autologin
[2017/3/1 17:30:17:642]: current time: 1488360617642
[2017/3/1 17:30:17:642]: valid time: 1496085791000
[2017/3/1 17:30:17:642]: saveConfigs()
[2017/3/1 17:30:17:643]: write to config file: {
    "dns_time":"1496085791000"
}
[2017/3/1 17:30:17:649]: checkDNS finished
[2017/3/1 17:30:17:651]: Calling connect...
[2017/3/1 17:30:17:651]: doConnect()
[2017/3/1 17:30:17:651]: current connectState: 0
[2017/3/1 17:30:17:651]: log: level: 0, area: 1, ChatClient::connect() 
[2017/3/1 17:30:17:653]: log: level: 0, area: 2, getSocket(): 35
[2017/3/1 17:30:17:653]: log: level: 1, area: 2, connectSocket(): start to connecting...
[2017/3/1 17:30:17:665]: log: level: 1, area: 2, connectSocket(): connect finished

退出登錄

推出的登錄的日志很簡單,清空一些數(shù)據(jù)方庭,然后斷開連接等;

關(guān)鍵詞:logout,disconnect,cleanup

[2017/3/1 10:1:39:707]: begin logout ..
[2017/3/1 10:1:39:707]: EMSessionManager::disconnect()
[2017/3/1 10:1:39:707]: clearDnsConfig()
[2017/3/1 10:1:39:707]: logout complete
[2017/3/1 10:1:39:708]: saveConfigs()
[2017/3/1 10:1:39:708]: write to config file: {
    "dns_time":"-1"
}
[2017/3/1 10:1:40:265]: stopReceive()
[2017/3/1 10:1:40:265]: log: level: 0, area: 1, ChatClient::disconnect()
[2017/3/1 10:1:40:265]: log: level: 1, area: 2, cleanup() 41
[2017/3/1 10:1:40:265]: log: level: 1, area: 2, closeSocket() 41
[2017/3/1 10:1:40:265]: log: level: 2, area: 1, handleDisconnect:14

心跳定時器

一切都準備好了之后厕吉,就是定義心跳定時器酱固,第一次設置時2'00"后啟動心跳定時器,后邊會慢慢增加到4'30"头朱,然后會按照4'30"這樣循環(huán)下去

[2017/3/1 16:39:7:52]: [smart ping] change smart ping state from : EMReady to : EMEvaluating
[2017/3/1 16:39:7:52]: [smart ping] reset interval...
[2017/3/1 16:39:7:52]: [smart ping] change smart ping state from : EMEvaluating to : EMEvaluating
[2017/3/1 16:39:7:55]: [smart ping]  onConnectred ...
[2017/3/1 16:39:7:55]: [smart ping] reset interval...
[2017/3/1 16:39:7:66]: [smart ping] prevWifi:false isWifi:true prevWIFISSID: SSID"huanxin-unifi"
[2017/3/1 16:39:7:67]: [smart ping] change smart ping state from : EMEvaluating to : EMEvaluating
[2017/3/1 16:39:7:68]: [smart ping] reset currentInterval:02:00:000
[2017/3/1 16:39:7:68]: [smart ping] schedule next alarm
[2017/3/1 16:39:7:68]: [smart ping] current heartbeat interval : 02:00:000 smart ping state : EMEvaluating

鏈接監(jiān)聽與重連

連接監(jiān)聽主要是實現(xiàn) EMConnectionListener 接口來監(jiān)聽設備和服務器的連接情況运悲,其中牽扯到網(wǎng)絡恢復后與服務器的重連,下邊這部分日志是當檢測到網(wǎng)絡連接斷開后髓窜,SDK和服務器的連接情況扇苞,下邊的日志中當SDK 檢測到鏈接不到服務器后會首先清空 socket 等一些鏈接相關(guān)信息欺殿,然后會回到鏈接監(jiān)聽的onDisConnect()方法寄纵,接著 SDK 會進行嘗試重連 3 次,當嘗試全部失敗后就不在嘗試脖苏,會安排一個定時器程拭,定時器的時間是2'45",到時間后會觸發(fā)心跳重新進行嘗試連接服務器棍潘,如果在這個心跳觸發(fā)之前恃鞋,網(wǎng)絡狀況有新的變化會直接重新嘗試連接服務器;

關(guān)鍵詞:onDisconnect,disconnect,onNetworkChanged,EMHeartBeatReceiver,heartbeat,reconnect,doConnect

[2017/3/1 19:30:28:214]: log: level: 1, area: 2, cleanup() 34
[2017/3/1 19:30:28:214]: log: level: 1, area: 2, closeSocket() 34
[2017/3/1 19:30:28:214]: log: level: 2, area: 2, recv(): recv() failed. errno: 110: Connection timed out
[2017/3/1 19:30:28:214]: log: level: 1, area: 2, cleanup() -1
[2017/3/1 19:30:28:214]: log: level: 2, area: 1, handleDisconnect:1
[2017/3/1 19:30:28:214]: EMSessionManager::onDisConnect(): 1
[2017/3/1 19:30:28:214]: stopReceive()
[2017/3/1 19:30:28:214]: log: level: 0, area: 1, ChatClient::disconnect()
[2017/3/1 19:30:28:214]: log: level: 1, area: 2, cleanup() -1
[2017/3/1 19:30:28:214]: log: level: 2, area: 1, handleDisconnect:14
[2017/3/1 19:30:28:214]: network issue, just reconnect after random time
[2017/3/1 19:30:28:215]: EMSessionManager::scheduleReconnect() updateServer: 0 updateToken: 0
[2017/3/1 19:30:28:215]: EMSessionManager::delayReconnect()
[2017/3/1 19:30:28:215]: getDelayedTime(): 7
[2017/3/1 19:30:28:215]: notify state change to connection listener
[2017/3/1 19:30:28:216]: [global listener] onDisconnect303
[2017/3/1 19:30:28:216]: [smart ping]  onDisconnected ...303
[2017/3/1 19:30:28:616]: [EMClient] connectivity receiver onReceiver
[2017/3/1 19:30:28:629]: [EMClient] no data connection
[2017/3/1 19:30:28:630]: onNetworkChanged(): 0
[2017/3/1 19:30:28:630]: notify network broken
[2017/3/1 19:30:28:630]: EMSessionManager::disconnect()
[2017/3/1 19:30:28:632]: notify state change to connection listener
[2017/3/1 19:30:28:632]: [global listener] onDisconnect2
[2017/3/1 19:30:28:632]: [smart ping]  onDisconnected ...2
[2017/3/1 19:30:31:440]: [EMClient] connectivity receiver onReceiver
[2017/3/1 19:30:31:447]: [EMClient] no data connection
[2017/3/1 19:30:31:447]: onNetworkChanged(): 0
[2017/3/1 19:30:31:447]: notify network broken
[2017/3/1 19:30:31:447]: EMSessionManager::disconnect()
[2017/3/1 19:30:31:448]: notify state change to connection listener
[2017/3/1 19:30:31:449]: [global listener] onDisconnect2
[2017/3/1 19:30:31:449]: [smart ping]  onDisconnected ...2
[2017/3/1 19:30:31:492]: [EMClient] connectivity receiver onReceiver
[2017/3/1 19:30:31:511]: [EMClient] no data connection
[2017/3/1 19:30:31:511]: onNetworkChanged(): 0
[2017/3/1 19:30:31:511]: notify network broken
[2017/3/1 19:30:31:512]: EMSessionManager::disconnect()
[2017/3/1 19:30:31:512]: notify state change to connection listener
[2017/3/1 19:30:31:512]: [global listener] onDisconnect2
[2017/3/1 19:30:31:512]: [smart ping]  onDisconnected ...2
[2017/3/1 19:33:4:560]: [EMHeartBeatReceiver] onReceive EMHeartBeatReceiver
[2017/3/1 19:33:4:567]: [net] no data connection
[2017/3/1 19:33:4:570]: [smart ping] schedule next alarm
[2017/3/1 19:33:4:573]: [smart ping] current heartbeat interval : 02:45:000 smart ping state : EMEvaluating
[2017/3/1 19:33:4:579]: [net] no data connection
[2017/3/1 19:33:4:580]: [smart ping] is not connected to server, so use idle interval : 3 mins
[2017/3/1 19:36:19:566]: [EMClient] connectivity receiver onReceiver
[2017/3/1 19:36:19:577]: [net] wifi is connected
[2017/3/1 19:36:19:577]: [EMClient] has wifi connection
[2017/3/1 19:36:19:577]: onNetworkChanged(): 2
[2017/3/1 19:36:19:577]: network comes back, retry to connect
[2017/3/1 19:36:19:577]: EMSessionManager::reconnect()
[2017/3/1 19:36:19:577]: doConnect()
[2017/3/1 19:36:19:577]: current connectState: 0
[2017/3/1 19:36:19:577]: log: level: 0, area: 1, ChatClient::connect() 
[2017/3/1 19:36:19:596]: log: level: 0, area: 2, getSocket(): 67
[2017/3/1 19:36:19:596]: log: level: 1, area: 2, connectSocket(): start to connecting...
[2017/3/1 19:36:19:602]: log: level: 1, area: 2, connectSocket(): connect finished

被踢&強制下線&移除賬戶

和賬戶相關(guān)的操作其實也都是以消息的形式和服務器進行交互的亦歉,其中一個特殊屬性為ns恤浪,類型是STATISTIC,然后具體的操作通過 operation進行細分:1.表示移除/禁用/強制下線肴楷,2.表示異地登錄
這幾個狀態(tài)都會觸發(fā)網(wǎng)絡鏈接監(jiān)聽的斷開onDisconnect()回調(diào)水由;

PS:需要注意的一點就是,當收到這幾個狀態(tài)的回調(diào)后需要手動調(diào)用logout赛蔫,清除當前登錄狀態(tài)砂客,因此在遇到被踢和強制下線的日志中一般都能看到和 logout 相關(guān)日志

關(guān)鍵詞:STATISTIC,operation,logout,onDisconnected,206,heart beat

異地登錄
[2017/3/1 20:0:26:592]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { metas : [ { id : 304104413746698288, from : @easemob.com, to : easemob-demo#chatdemoui_lz1@easemob.com/mobile, timestamp : 1488369626401, ns : STATISTIC, payload : { operation : 2 } } ], queue : @easemob.com } }
[2017/3/1 20:0:26:592]: log: level: 0, area: 1, ChatClient::disconnect()
[2017/3/1 20:0:26:592]: log: level: 1, area: 2, cleanup() 35
[2017/3/1 20:0:26:592]: log: level: 1, area: 2, closeSocket() 35
[2017/3/1 20:0:26:592]: log: level: 2, area: 1, handleDisconnect:13
[2017/3/1 20:0:26:592]: EMSessionManager::onDisConnect(): 13
[2017/3/1 20:0:26:592]: stopReceive()
[2017/3/1 20:0:26:592]: log: level: 0, area: 1, ChatClient::disconnect()
[2017/3/1 20:0:26:592]: log: level: 1, area: 2, cleanup() -1
[2017/3/1 20:0:26:592]: log: level: 2, area: 1, handleDisconnect:14
[2017/3/1 20:0:26:593]: ConnUserLoginAnotherDevice
[2017/3/1 20:0:26:593]: begin logout ..
[2017/3/1 20:0:26:593]: EMSessionManager::disconnect()
[2017/3/1 20:0:26:593]: clearDnsConfig()
[2017/3/1 20:0:26:593]: logout complete
[2017/3/1 20:0:26:593]: notify state change to connection listener
[2017/3/1 20:0:26:618]: [smart ping]  onDisconnected ...206
[2017/3/1 20:0:26:640]: [EMPushHelper] push notification helper ondestory
[2017/3/1 20:0:26:641]: [EMClient]  SDK Logout
[2017/3/1 20:0:26:643]: [smart ping] stop heart beat timer
[2017/3/1 20:0:26:643]: [smart ping] change smart ping state from : EMEvaluating to : EMStopped
[2017/3/1 20:0:26:644]: [smart ping] reset interval...
[2017/3/1 20:0:26:645]: [smart ping] change smart ping state from : EMStopped to : EMEvaluating
[2017/3/1 20:0:26:650]: logout, user not login
[2017/3/1 20:0:26:650]: saveConfigs()
[2017/3/1 20:0:26:651]: write to config file: {
    "dns_time":"-1"
}

移除/禁用/強制下線
[2017/3/2 14:14:55:351]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { metas : [ { id : 304386456690886672, from : @easemob.com, to : easemob-demo#chatdemoui_lz1@easemob.com/mobile, timestamp : 1488435294646, ns : STATISTIC, payload : { operation : 1 } } ], queue : @easemob.com } }

網(wǎng)絡有問題的日志 TODO

下邊這段日志是在當前網(wǎng)絡有問題的情況下進行登錄請求,可以看到請求結(jié)果是408呵恢,正常情況重連服務器是不需要獲取DNS 的鞠值,但是這個應該是 DNS 配置已經(jīng)失效,這邊一直在嘗試重新獲取 DNS渗钉;不過從后邊的日志可以看出是網(wǎng)絡連接有問題彤恶;

關(guān)鍵詞:disconnect,handleDisconnect,checkDNS,408,reconnect,unreachable

[2017/3/1 9:59:52:649]: log: level: 0, area: 1, ChatClient::disconnect()
[2017/3/1 9:59:52:649]: log: level: 1, area: 2, cleanup() -4
[2017/3/1 9:59:52:649]: log: level: 2, area: 1, handleDisconnect:14
[2017/3/1 9:59:52:649]: dns error, reconnect using different IP
[2017/3/1 9:59:52:649]: EMSessionManager::scheduleReconnect() updateServer: 1 updateToken: 0
[2017/3/1 9:59:52:649]: EMDNSManager::getNextAvailableHost: type: 1
[2017/3/1 9:59:52:649]: EMSessionManager::checkDNS()
[2017/3/1 9:59:52:649]: tried all candidates, download again
[2017/3/1 9:59:52:649]: getDnsListFromServer()
[2017/3/1 9:59:52:649]: EMDNSManager::getHost: type: 0
[2017/3/1 9:59:52:649]: current host: domain: 120.26.17.225 port: 80
[2017/3/1 9:59:52:649]: buildUrl(): http://120.26.17.225/easemob/server.json?sdk_version=3.2.3&app_key=shztzn%23smartfarm&file_version=61
[2017/3/1 9:59:52:651]: notify state change to connection listener
[2017/3/1 9:59:52:664]: 1 time retry
[2017/3/1 9:59:52:664]: getDnsListFromServer code: 408 response: 
[2017/3/1 9:59:52:664]: EMDNSManager::getHost: type: 0
[2017/3/1 9:59:52:665]: current host: domain: 59.110.89.59 port: 80
[2017/3/1 9:59:52:665]: buildUrl(): http://59.110.89.59/easemob/server.json?sdk_version=3.2.3&app_key=shztzn%23smartfarm&file_version=61
[2017/3/1 9:59:52:673]: 2 time retry
[2017/3/1 9:59:52:673]: getDnsListFromServer code: 408 response: 
[2017/3/1 9:59:52:674]: EMDNSManager::getHost: type: 0
[2017/3/1 9:59:52:674]: current host: domain: 112.126.66.111 port: 80
[2017/3/1 9:59:52:674]: buildUrl(): http://112.126.66.111/easemob/server.json?sdk_version=3.2.3&app_key=shztzn%23smartfarm&file_version=61
[2017/3/1 9:59:52:674]: EMDNSManager::getNextAvailableHost: new index: 0
[2017/3/1 9:59:52:675]: EMDNSManager::getHost: type: 1
[2017/3/1 9:59:52:675]: current host: domain: 60.205.131.133 port: 6801
[2017/3/1 9:59:52:675]: setServer: 60.205.131.133
[2017/3/1 9:59:52:676]: EMSessionManager::delayReconnect()
[2017/3/1 9:59:52:676]: getDelayedTime(): 17
[2017/3/1 9:59:52:676]: Calling connect result: 0
[2017/3/1 9:59:53:505]: asyncSendMessage: 14883335935043542 retry = 3
[2017/3/1 9:59:53:505]: EMSessionManager::reconnect()
[2017/3/1 9:59:53:506]: doConnect()
[2017/3/1 9:59:53:506]: current connectState: 0
[2017/3/1 9:59:53:506]: log: level: 0, area: 1, ChatClient::connect() 
[2017/3/1 9:59:53:506]: log: level: 0, area: 2, getSocket(): 41
[2017/3/1 9:59:53:506]: log: level: 1, area: 2, connectSocket(): start to connecting...
[2017/3/1 9:59:53:508]: log: level: 2, area: 2, connectSocket(): 60.205.131.133 error: Network is unreachable
[2017/3/1 9:59:53:508]: log: level: 1, area: 2, closeSocket() 41
[2017/3/1 9:59:53:508]: log: level: 1, area: 2, connectSocket(): connect finished
[2017/3/1 9:59:53:508]: log: level: 2, area: 2, connect(): connection refused
[2017/3/1 9:59:53:508]: log: level: 1, area: 2, cleanup() -4
[2017/3/1 9:59:53:508]: log: level: 2, area: 1, handleDisconnect:4
[2017/3/1 9:59:53:508]: EMSessionManager::onDisConnect(): 4
[2017/3/1 9:59:53:508]: stopReceive()

推送相關(guān)

和推送相關(guān)的日志都是和EMPushHelper或者EMPushManager相關(guān)的,可以從日志中看到推送功能是否激活鳄橘,然后獲取devicetoken發(fā)送到服務器等粤剧,devicetoken這個值一定要存在,否者推送無效挥唠;這些可以作為檢測集成離線推送本地設置是否有效的一些手段抵恋;

關(guān)鍵詞:GCM,push,devicetoken,sendDeviceToServer

[2017/3/1 16:39:7:202]: isEnabledGCM: 1
[2017/3/1 16:39:7:202]: [EMPushHelper] GCM is enabled : true
[2017/3/1 16:39:7:207]: [EMPushHelper] GCM service available : false
[2017/3/1 16:39:7:217]: [EMPushHelper] mipush available : true
[2017/3/1 16:39:7:218]: [EMPushHelper] third-party push available
[2017/3/1 16:39:7:221]: [EMPushManager] nick name is null or empty
[2017/3/1 16:39:7:708]: [EMMipushReceiver] mi push reigster success
[2017/3/1 16:39:7:708]: [EMPushHelper] devicetoken = /cRO2vRH64mWOH46+We1zxt4+onQRJOe26fvcX02iC0=
[2017/3/1 16:39:7:715]: [HttpClientManager] try send request, request url: http://182.92.4.52:80/easemob-demo/chatdemoui/devices with number: 0
[2017/3/1 16:39:7:792]: [EMPushHelper] sendDeviceToServer SC_OK:

修改離線推送相關(guān)
[2017/3/2 13:11:53:423]: SetGroupsOfNotificationDisabled 1
[2017/3/2 13:11:53:564]: update user configs:   {
  "action" : "put",
  "application" : "4d7e4ba0-dc4a-11e3-90d5-e1ffbaacdaf5",
  "path" : "/users",
  "uri" : "https://a1.easemob.com/easemob-demo/chatdemoui/users",
  "entities" : [ {
    "uuid" : "479d9cea-134d-11e6-8943-534ab75c4508",
    "type" : "user",
    "created" : 1462513331630,
    "modified" : 1488431513381,
    "username" : "lz1",
    "activated" : true,
    "notification_display_style" : 1,
    "device_token" : "/cRO2vRH64mWOH46+We1zxt4+onQRJOe26fvcX02iC0=",
    "nickname" : "立正1",
    "notification_ignore_1479267663683" : true,
    "notification_ignore_1483610597352" : true,
    "notification_ignore_1488431342804" : false,
    "notifier_name" : "2882303761517426801"
  } ],
  "timestamp" : 1488431513377,
  "duration" : 33,
  "organization" : "easemob-demo",
  "applicationName" : "chatdemoui"
}

消息相關(guān)

消息相關(guān)的日志還是比較明確的,

發(fā)送消息

發(fā)送新消息時會首先生成一個臨時的 msgId宝磨,這個 msgId 是當前時間戳+四位拼成弧关;當消息發(fā)送成功后盅安,服務器會返回對應的服務器生成的 msgId 然后更新到本地,這算是一個消息的發(fā)送完成(可以根據(jù)這部分來判斷消息是否發(fā)送成功)世囊;
然后如果開啟了已讀回執(zhí)别瞭,當對方讀了消息之后,發(fā)送者會收到一條通知(NOYICE 的消息)告訴你有因消息株憾,因為 ack 也是新消息蝙寨,所以也是需要自己去服務器同步拉取(注意日志中的 REAF_ACK)嗤瞎;當做完這些之后墙歪,SDK 會重新發(fā)一條同步的消息,來看下是否還有新的消息

關(guān)鍵詞:asyncSendMessage,SEND,RECV,NOTICE,server_id,READ_ACK

[2017/3/1 21:7:0:649]: asyncSendMessage: 14883736206090002 retry = 3
[2017/3/1 21:7:0:650]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 14883736206090002, to : lz2, ns : CHAT, payload : { chattype : CHAT, from : lz1, to : lz2, contents : [ { contenttype : TEXT, text : www問問 } ] } } } }

消息發(fā)送成功贝奇,返回服務器生成的 msgId
[2017/3/1 21:7:0:743]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, meta_id : 14883736206090002, server_id : 304121568710101040, timestamp : 1488373620639 } }

服務器告訴 SDK 有新消息了
[2017/3/1 21:7:1:314]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : NOTICE, payload : { queue : lz2/mobile } }

發(fā)送請求來同步新消息
[2017/3/1 21:7:1:314]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { queue : lz2/mobile } }

收到已讀的 ACK
[2017/3/1 21:7:1:333]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304121571285403696, timestamp : 1488373621196, ns : CHAT, payload : { chattype : READ_ACK, from : lz2, to : lz1, ack_message_id : 304121568710101040 } } ], next_key : 304121571285403696, queue : lz2, timestamp : 1488373621267 } }

查詢是否還有新消息
[2017/3/1 21:7:1:333]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { key : 304121571285403696, queue : lz2 } }
[2017/3/1 21:7:1:515]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, queue : lz2, is_last : true, timestamp : 1488373621351 } }

...
發(fā)送已讀 ACK
[2017/3/2 11:7:8:116]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 775, to : admin, ns : CHAT, payload : { chattype : READ_ACK, from : lz1, to : admin, ack_message_id : 304337511725925492 } } } }

收到新消息

3.x收到新消息后服務器并不會直接下發(fā)消息虹菲,而是給SDK端下發(fā)一個通知(NOTICE 的消息),告訴你有新消息掉瞳,就像下邊日志的第一行毕源,sdk 收到這條消息之后,會給服務器發(fā)送一個我要獲取新消息的消息(有點繞)陕习,然后服務器才會把這條消息給下發(fā)霎褐,當接收完這次通知的消息后,SDK 還會給服務器在發(fā)送一條同步消息该镣,用來詢問服務器是否還有新的消息冻璃,當返回結(jié)果包含is_last:true時,表示已經(jīng)沒有新消息拌牲;
當消息接收完成之后就是SDK內(nèi)部給上層發(fā)送通知了俱饿;最后就是當自己看了新消息之后,還要給對方發(fā)送一條ACK 的信息塌忽,然后還要收到一條服務器返回的一條狀態(tài)信息才算完事拍埠;

關(guān)鍵詞:RECV,NOTICE,CHAT,compress_algorimth,callbackReceievedMessages,onMessageReceived,COMMAND,action,READ_ACK,is_last

服務器告訴 SDK 有新消息了
[2017/3/1 20:58:54:6]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : NOTICE, payload : { queue : lz2/mobile } }

發(fā)送請求來同步新消息
[2017/3/1 20:58:54:6]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { queue : lz2/mobile } }

[2017/3/1 20:58:54:32]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304119478168324144, timestamp : 1488373133870, ns : CHAT, payload : { chattype : CHAT, from : lz2, to : lz1, contents : [ { contenttype : TEXT, text : qqqqqqqqqqqq } ] } } ], next_key : 304119478168324144, queue : lz2, timestamp : 1488373133959 } }

查詢是否還有新消息
[2017/3/1 20:58:54:32]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { key : 304119478168324144, queue : lz2 } }
[2017/3/1 20:58:54:106]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, queue : lz2, is_last : true, timestamp : 1488373134006 } }

發(fā)送 ACK 給對方
[2017/3/1 21:5:55:298]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 259, to : lz2, ns : CHAT, payload : { chattype : READ_ACK, from : lz1, to : lz2, ack_message_id : 304119478168324144 } } } }
[2017/3/1 21:5:55:364]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, meta_id : 259, server_id : 304121288056637488, timestamp : 1488373555277 } }

收到 cmd 消息
[2017/3/2 11:6:13:653]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304337832351106168, timestamp : 1488423973404, ns : CHAT, payload : { chattype : CHAT, from : admin, to : lz1, contents : [ { contenttype : COMMAND, action : action1 } ] } } ], next_key : 304337832351106168, queue : admin, timestamp : 1488423973440 } }

收到離線消息,這個直接是一個 json 數(shù)組
[2017/3/2 12:46:37:98]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304343301819992124, timestamp : 1488425246875, ns : CHAT, payload : { chattype : CHATROOM, from : qazqaz123321, to : 3759501541378, contents : [ { contenttype : VOICE, displayname : qazqaz12332120170302T112724.amr, remotepath : https://a1.easemob.com/easemob-demo/chatdemoui/chatfiles/289e8240-fef8-11e6-b120-0b193a44693b, secretkey : KJ6CSv74EeacsQ3KDqwnqF9amIMbc6fNBK-qXRVNwd4MkZR7, filelength : 2134, duration : 2 } ] } }, { id : 304343752070137864, timestamp : 1488425351703, ns : CHAT, payload : { chattype : CHATROOM, from : lingo, to : 3759501541378, contents : [ { contenttype : VOICE, displayname : lingo20170302T112907.amr, remotepath : https://a1.easemob.com/easemob-demo/chatdemoui/chatfiles/671458b0-fef8-11e6-bf54-a356d485d240, secretkey : ZxRYuv74EeankPOIMACFAftORz04rIiMWfHPQUKLvcXi_Jgo, filelength : 2566, duration : 3 } ] } }, { id : 304345086324377616, timestamp : 1488425662350, ns : CHAT, payload : { chattype : CHATROOM, from : 15515625700, to : 3759501541378, contents : [ { contenttype : TEXT, text : [):] } ], exts : [ { key : userIcon, type : 7, value : https://116.255.227.78:1008/FileUpload/UserImage/7521a766-64db-4a18-8772-d22c5e065d0b.jpg }, { key : userName, type : 7, value : hl_4a8fe2f } ] } }, { id : 304347342838958040, timestamp : 1488426187748, ns : CHAT, payload : { chattype : CHATROOM, from : kimpeng, to : 3759501541378, contents : [ { contenttype : TEXT, text : [+o(] } ] } }, { id : 304347456840140856, timestamp : 1488426214277, ns : CHAT, payload : { chattype : CHATROOM, from : 15172330957, to : 3759501541378, contents : [ { contenttype : TEXT, text : 基本 } ] } }, { id : 304348603307001816, timestamp : 1488426481208, ns : CHAT, payload : { chattype : CHATROOM, from : kimpeng, to : 3759501541378, contents : [ { contenttype : TEXT, text : [:(] } ] } }, { id : 304349346936129496, timestamp : 1488426654367, ns : CHAT, payload : { chattype : CHATROOM, from : kimpeng, to : 3759501541378, contents : [ { contenttype : TEXT, text : [:(][(a)] } ] } }, { id : 304349681360570328, timestamp : 1488426732212, ns : CHAT, payload : { chattype : CHATROOM, from : kimpeng, to : 3759501541378, contents : [ { contenttype : TEXT, text : A } ] } }, { id : 304350070763947992, timestamp : 1488426822893, ns : CHAT, payload : { chattype : CHATROOM, from : kimpeng, to : 3759501541378, contents : [ { contenttype : TEXT, text : A } ] } }, { id : 304350107678017496, timestamp : 1488426831478, ns : CHAT, payload : { chattype : CHATROOM, from : kimpeng, to : 3759501541378, contents : [ { contenttype : TEXT, text : A } ] } }, { id : 304363701610219560, timestamp : 1488429996565, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_3759501541378@conference.easemob.com, operation : JOIN, from : easemob-demo#chatdemoui_lz1@easemob.com, status : { error_code : 0, description :  } } } ], next_key : 304363701610219560, queue : 3759501541378@conference.easemob.com, timestamp : 1488429996918 } }

業(yè)務邏輯相關(guān)

在3.x 中一切的操作都是用消息的形式來做的土居,通過發(fā)送代表特定操作的消息給服務器枣购,然后服務器會返回這個消息發(fā)送成功,接著服務器會以新消息的形式告訴 SDK 操作成功擦耀,最后都和收發(fā)消息的日志邏輯一樣棉圈;
需要注意的就是這些操作中的關(guān)鍵詞;
首先說一點就是眷蜓,這些操作都有一個特殊的屬性 ns這個屬性的指表示不同的操作:MUC表示群組和聊天室相關(guān)操作分瘾;ROSTER表示聯(lián)系人相關(guān)操作

下邊先用創(chuàng)建新群組來詳細解釋下:

創(chuàng)建新群組

從創(chuàng)建群組可以看出,創(chuàng)建的操作就是給服務器發(fā)送一個創(chuàng)建的操作吁系,接著服務器返回這條消息發(fā)送成功德召,然后就像收到消息一樣白魂,服務器告訴創(chuàng)建者,你有新消息需要拉取上岗,拉取到后可以發(fā)現(xiàn)福荸,這條消息就是告訴自己群組創(chuàng)建成功,然后后邊就是檢查是否有新消息;

關(guān)鍵詞:MUC,SEND,CREATE,RECV,

[2017/3/2 12:7:35:249]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 2567, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248, operation : CREATE, from : lz1, setting : { name : ttttt, desc : tttttt, muc_type : 2, max_users : 200, owner : lz1 }, reason : lz1邀請加入群:ttttt } } } }

[2017/3/2 12:7:35:316]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, meta_id : 2567, server_id : 304353645141428264, timestamp : 1488427655125 } }

[2017/3/2 12:7:35:317]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : NOTICE, payload : { queue : 1488427655248@conference.easemob.com } }

[2017/3/2 12:7:35:317]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { queue : 1488427655248@conference.easemob.com } }

[2017/3/2 12:7:35:372]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304353645279840296, timestamp : 1488427655132, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248@conference.easemob.com, operation : CREATE, from : easemob-demo#chatdemoui_lz1@easemob.com, status : { error_code : 0, description :  } } } ], next_key : 304353645279840296, queue : 1488427655248@conference.easemob.com, timestamp : 1488427655190 } }

[2017/3/2 12:7:35:373]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { key : 304353645279840296, queue : 1488427655248@conference.easemob.com } }

[2017/3/2 12:7:35:453]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, queue : 1488427655248@conference.easemob.com, is_last : true, timestamp : 1488427655254 } }

群組其他操作

關(guān)鍵詞:MUC,operation,SEND,APPLY,INVITE,INVITE_ACCEPT,INVITE_DECLINE,APPLY_ACCEPT,APPLY_DECLINE``PRESENCE,LEAVE,DESTROY,KICK,ABSENCE,RECV,BLOCK,UNBLOCK

發(fā)送加入請求:
[2017/3/2 12:26:38:737]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 3591, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488428778313, operation : APPLY, from : lz1, tos : [ lz2 ], reason : 請求加入 } } } }

收到加入請求:
[2017/3/2 12:16:48:410]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304356020619053112, timestamp : 1488428208185, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248@conference.easemob.com, operation : APPLY, from : easemob-demo#chatdemoui_lz2@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], reason : 請求加入, is_chatroom : false, status : { error_code : 0, description :  } } } ], next_key : 304356020619053112, queue : lz2, timestamp : 1488428208229 } }

邀請加入群組
[2017/3/2 11:39:39:774]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 2055, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1483610597352, operation : INVITE, from : lz1, tos : [ lz2 ], reason : welcome } } } }
[2017/3/2 11:39:41:64]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304346454208546772, timestamp : 1488425980847, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1483610597352@conference.easemob.com, operation : INVITE_ACCEPT, from : easemob-demo#chatdemoui_lz2@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], is_chatroom : false, status : { description :  } } } ], next_key : 304346454208546772, queue : 1483610597352@conference.easemob.com, timestamp : 1488425980883 } }
[2017/3/2 11:39:41:138]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304346454330181588, timestamp : 1488425980876, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1483610597352@conference.easemob.com, operation : PRESENCE, from : easemob-demo#chatdemoui_lz2@easemob.com, is_chatroom : false } } ], next_key : 304346454330181588, queue : 1483610597352@conference.easemob.com, timestamp : 1488425980928 } }

同意對方邀請
[2017/3/2 12:20:41:289]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 2823, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248, operation : APPLY_ACCEPT, from : lz1, tos : [ lz2 ] } } } }
[2017/3/2 12:20:42:696]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304357026689980384, timestamp : 1488428442436, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248@conference.easemob.com, operation : PRESENCE, from : easemob-demo#chatdemoui_lz2@easemob.com, is_chatroom : false } } ], next_key : 304357026689980384, queue : 1488427655248@conference.easemob.com, timestamp : 1488428442505 } }

拒絕對方邀請
[2017/3/2 12:21:34:594]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 3335, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248, operation : APPLY_DECLINE, from : lz1, tos : [ lz2 ] } } } }

離開群組
[2017/3/2 11:7:24:803]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 1031, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1482203912329, operation : LEAVE, from : lz1 } } } }
[2017/3/2 11:7:25:183]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304338138476578856, timestamp : 1488424044686, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1482203912329@conference.easemob.com, operation : LEAVE, from : easemob-demo#chatdemoui_lz1@easemob.com, status : { error_code : 0, description :  } } } ], next_key : 304338138476578856, queue : 1482203912329@conference.easemob.com, timestamp : 1488424044990 } }

群組踢人
[2017/3/2 11:30:40:684]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 1799, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1483610597352, operation : KICK, from : lz1, tos : [ lz2 ] } } } }
[2017/3/2 11:30:41:122]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304344134942984200, timestamp : 1488425440851, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1483610597352@conference.easemob.com, operation : ABSENCE, from : easemob-demo#chatdemoui_lz2@easemob.com, is_chatroom : false } } ], next_key : 304344134942984200, queue : 1483610597352@conference.easemob.com, timestamp : 1488425440955 } }

服務器刪除群組
[2017/3/2 13:0:44:727]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304367343482439644, timestamp : 1488430844502, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488427655248@conference.easemob.com, operation : DESTROY, from : easemob-demo#chatdemoui_系統(tǒng)管理員@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], is_chatroom : false, status : { error_code : 0, description :  } } } ], next_key : 304367343482439644, queue : 1488427655248@conference.easemob.com, timestamp : 1488430844552 } }

屏蔽群消息
[2017/3/2 13:10:23:189]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 5895, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488431342804, operation : BLOCK, from : lz1 } } } }
[2017/3/2 13:10:23:278]: log: level: 1, area: 1, ChatClient::handleSync begin
[2017/3/2 13:10:23:278]: log: level: 1, area: 1, ChatClient::handleSync complete: response
[2017/3/2 13:10:23:310]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304369828473346088, timestamp : 1488431423075, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488431342804@conference.easemob.com, operation : BLOCK, from : easemob-demo#chatdemoui_lz1@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], status : { error_code : 0, description :  } } } ], next_key : 304369828473346088, queue : 1488431342804@conference.easemob.com, timestamp : 1488431423128 } }

解除屏蔽群消息
[2017/3/2 15:3:29:333]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 521, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488431342804, operation : UNBLOCK, from : lz1 } } } }
[2017/3/2 15:3:32:900]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304398975526508532, timestamp : 1488438209409, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_1488431342804@conference.easemob.com, operation : UNBLOCK, from : easemob-demo#chatdemoui_lz1@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], status : { error_code : 0, description :  } } } ], next_key : 304398975526508532, queue : 1488431342804@conference.easemob.com, timestamp : 1488438210535 } }

聊天室

單單從日志看,這些操作其實和群組的都一樣

關(guān)鍵詞:MUC,JOIN,PRESENCE,ABSENCE,KICK

自己加入聊天室
[2017/3/2 12:46:36:668]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 5383, to : @easemob.com, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_3759501541378@conference.easemob.com, operation : JOIN, from : lz1 } } } }

收到別人加入聊天室的回調(diào)
[2017/3/2 12:53:40:186]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304365519564179492, timestamp : 1488430419846, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_3759501541378@conference.easemob.com, operation : PRESENCE, from : easemob-demo#chatdemoui_lz2@easemob.com, is_chatroom : true } } ], next_key : 304365519564179492, queue : 3759501541378@conference.easemob.com, timestamp : 1488430420020 } }

其他人離開聊天室回調(diào)
[2017/3/2 12:56:56:655]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304366363252623336, timestamp : 1488430616269, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_3759501541378@conference.easemob.com, operation : ABSENCE, from : easemob-demo#chatdemoui_lz2@easemob.com, is_chatroom : true } } ], next_key : 304366363252623336, queue : 3759501541378@conference.easemob.com, timestamp : 1488430616481 } }

自己被后臺踢出聊天室
[2017/3/2 12:58:30:329]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304366766241351692, timestamp : 1488430710093, ns : MUC, payload : { muc_id : easemob-demo#chatdemoui_3759501541378@conference.easemob.com, operation : KICK, from : easemob-demo#chatdemoui_系統(tǒng)管理員@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], is_chatroom : true, status : { error_code : 0, description :  } } } ], next_key : 304366766241351692, queue : 3759501541378@conference.easemob.com, timestamp : 1488430710153 } }

聯(lián)系人

關(guān)鍵詞:ROSTER,ADD,REMOVE,ACCEPT,REMOTE_ACCEPT,DECLINE,REMOTE_DECLINE,BAN

收到添加請求
[2017/3/2 12:31:51:693]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304359900245395412, timestamp : 1488429111488, ns : ROSTER, payload : { operation : ADD, from : easemob-demo#chatdemoui_lz2@easemob.com/mobile, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], reason : 加個好友唄 } } ], next_key : 304359900245395412, queue : @easemob.com, timestamp : 1488429111530 } }

刪除:
[2017/3/2 12:31:34:502]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 3847, to : @easemob.com, ns : ROSTER, payload : { operation : REMOVE, tos : [ easemob-demo#chatdemoui_lz2 ], reason : , bi_direction : 0 } } } }
[2017/3/2 12:31:34:628]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304359826958321704, timestamp : 1488429094423, ns : ROSTER, payload : { operation : REMOVE, from : easemob-demo#chatdemoui_lz2@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com/mobile ], roster_ver : DB5BEDE0B3C0828FF9C2B7E2C119D30AC8AA66E4 } } ], next_key : 304359826958321704, queue : @easemob.com, timestamp : 1488429094467 } }

同意:
[2017/3/2 12:40:33:251]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304362140305721384, timestamp : 1488429633032, ns : ROSTER, payload : { operation : ACCEPT, from : easemob-demo#chatdemoui_lz2@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com/mobile ], roster_ver : 31A3278F5D16C2726689A176C39D81FF9961647A } } ], next_key : 304362140305721384, queue : @easemob.com, timestamp : 1488429633077 } }

被同意:
[2017/3/2 12:42:59:308]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304362767614216148, timestamp : 1488429779090, ns : ROSTER, payload : { operation : REMOTE_ACCEPT, from : easemob-demo#chatdemoui_lz2@easemob.com/mobile, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], roster_ver : 13B1298E1FAF70683EB467693584B2FD74CBDC6D } } ], next_key : 304362767614216148, queue : @easemob.com, timestamp : 1488429779133 } }

拒絕:
[2017/3/2 12:39:52:931]: log: level: 1, area: 1, SEND:
{ verison : MSYNC_V1, compress_algorimth : 0, command : SYNC, payload : { meta : { id : 4103, to : @easemob.com, ns : ROSTER, payload : { operation : DECLINE, tos : [ easemob-demo#chatdemoui_lz2 ], reason : , bi_direction : 0 } } } }

被拒絕:
[2017/3/2 12:42:59:308]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304362767614216148, timestamp : 1488429779090, ns : ROSTER, payload : { operation : REMOTE_DECLINE, from : easemob-demo#chatdemoui_lz2@easemob.com/mobile, tos : [ easemob-demo#chatdemoui_lz1@easemob.com ], roster_ver : 13B1298E1FAF70683EB467693584B2FD74CBDC6D } } ], next_key : 304362767614216148, queue : @easemob.com, timestamp : 1488429779133 } }

加入黑名單
[2017/3/2 12:43:18:539]: log: level: 1, area: 1, RECV:
{ verison : MSYNC_V1, command : SYNC, payload : { status : { error_code : 0 }, metas : [ { id : 304362850200061992, timestamp : 1488429798324, ns : ROSTER, payload : { operation : BAN, status : { error_code : 0 }, from : easemob-demo#chatdemoui_lz2@easemob.com, tos : [ easemob-demo#chatdemoui_lz1@easemob.com/mobile ] } } ], next_key : 304362850200061992, queue : @easemob.com, timestamp : 1488429798362 } }

通話相關(guān)

由于通話功能大部分都是由底層實現(xiàn),這邊暫時無法看懂怨规,也就先不寫了

結(jié)束語

沒有什么能一眼看出錯誤的方法,只要記住正常的日志是什么樣的幸缕,以后只要遇到錯誤的日志就知道這不正常了,所有能通過日志看出來問題的問題,都不是說一下根據(jù)哪一點日志就能知道的,一般都是需要聯(lián)系下上下文的日志谒养,然后結(jié)合場景才好分析

沒什么投機取巧的方式挺狰,其實都是熟能生巧明郭,然后大家互相交流,分享自己所知道的

最后希望這一篇分析能對大家有所幫助丰泊,

錯誤碼參考:-官方 API 文檔 Error

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薯定,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞳购,更是在濱河造成了極大的恐慌话侄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件学赛,死亡現(xiàn)場離奇詭異年堆,居然都是意外死亡,警方通過查閱死者的電腦和手機盏浇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門变丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绢掰,你說我怎么就攤上這事痒蓬。” “怎么了滴劲?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵攻晒,是天一觀的道長。 經(jīng)常有香客問我班挖,道長鲁捏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任萧芙,我火速辦了婚禮给梅,結(jié)果婚禮上乙嘀,老公的妹妹穿的比我還像新娘。我一直安慰自己破喻,他們只是感情好虎谢,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹质,像睡著了一般婴噩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羽德,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天几莽,我揣著相機與錄音,去河邊找鬼宅静。 笑死章蚣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的姨夹。 我是一名探鬼主播纤垂,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磷账!你這毒婦竟也來了峭沦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逃糟,失蹤者是張志新(化名)和其女友劉穎吼鱼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绰咽,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡菇肃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了取募。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琐谤。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矛辕,靈堂內(nèi)的尸體忽然破棺而出笑跛,到底是詐尸還是另有隱情,我是刑警寧澤聊品,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布飞蹂,位于F島的核電站,受9級特大地震影響翻屈,放射性物質(zhì)發(fā)生泄漏陈哑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惊窖。 院中可真熱鬧刽宪,春花似錦、人聲如沸界酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毁欣。三九已至庇谆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凭疮,已是汗流浹背饭耳。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留执解,地道東北人寞肖。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像衰腌,于是被迫代替她去往敵國和親新蟆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理桶唐,服務發(fā)現(xiàn)栅葡,斷路器茉兰,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,764評論 0 15
  • 個人博客:【lzan13 / 關(guān)于環(huán)信2.xSDK日志簡單分析】 前言 首先說下環(huán)信日志保存的機制尤泽,這邊只要是在開...
    f53bcbbc7c3e閱讀 1,227評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • 夕陽余暉云海 因你勇攀而見證 本不欲公之于眾 難遮心中那份震撼 你邀他鄉(xiāng)的我 有空前去 我想 如果緣分恰好 將會見...
    震血封侯閱讀 449評論 2 8