日志打点接口

1.1 发送游戏内日志(客户端调用)

收集游戏玩家行为信息,用于统计分析玩家行为。
需要接入android 或者 ios Base Sdk以后时候。

1.1.1 接口定义

  1. Android
  2. /**
  3. * 游戏端需发送的统计日志
  4. *
  5. * @param logID 日志ID
  6. * @param logKey 日志KEY
  7. * @param logValue 日志内容 HashMap key-val格式
  8. */
  9. public void LTBaseSDKSendGameInfoLog(String logID, String logKey, HashMap<String,Object> map)
  1. IOS
  2. /**
  3. * 游戏端需发送的统计日志
  4. *
  5. * @param logID 日志ID
  6. * @param logKey 日志KEY
  7. * @param logValJson 日志内容 json 格式字符串
  8. */
  9. **C++接口**
  10. LTGameSDK::GetInstance().SendLog(const char* logID, const char* logKey ,const char* logValJson);
  11. **OC接口**
  12. - (void)LTSDKSendLogWithLogId:(NSString *)logId logKey:(NSString *)logKey dict:(NSDictionary *)dict;
  1. unity
  2. /**
  3. * 游戏端需发送的统计日志
  4. *
  5. * @param logID 日志ID
  6. * @param logKey 日志KEY
  7. * @param LogValue 日志内容 Dictionary key-val格式
  8. * @return null
  9. */
  10. LTStatisticsEntry.GetInstance().sendGameInfoLog(string logID, string logKey,
  11. Dictionary<string, object> LogValue);

1.1.2 参数说明

参数名称 重要性 类型 说明
logID 必须 String 日志ID (详见logId和LogKey对应表)
logKey 必须 String 日志KEY (详见logId和LogKey对应表)
map 必须 HashMap 日志属性,具体属性字段见下面日志的说明表格

1.1.3 接口示例

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("key1", "value1");
  4. map.put("key2", "value2");
  5. map.put("key3", "value3");
  6. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog ("logID", "logKey", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["key1"] = "value1";
  5. logJson["key2"] = "value2";
  6. logJson["key3"] = "value3";
  7. Json::FastWriter fast_writer;
  8. const char* logValJson = fast_writer.write(logJson).c_str();
  9. LTGameSDK::GetInstance().SendLog("logID", "logKey" ,logValJson);
  10. **OC接口**
  11. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  12. [dict setObject:@"value1" forKey:@"key1"];
  13. [dict setObject:@"value2" forKey:@"key2"];
  14. [dict setObject:@"value3" forKey:@"key3"];
  15. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"logID" logKey:@"logKey" dict:dict];
  1. unity
  2. Dictionary<string, object> map = new Dictionary<string, object>();
  3. map.Add("key1", "value1");
  4. map.Add("key2", "value2");
  5. map.Add("key3", "value3");
  6. LTStatisticsEntry.GetInstance().sendGameInfoLog(logID,logKey,map);

1.1.4 logId和LogKey对应表

logId Logkey 描述 GSC平台显示名称
91 role-income-update 玩家虚拟货币变更 货币变更
9 role-item-update 玩家虚拟物品变更 物品变更
10 role-prop-update 玩家属性变更 玩家属性变更
13 role-item-prop-update 玩家商品属性变更日志 商品属性变更
14 role-card-prop-update 玩家卡牌属性变更日志 卡牌属性变更
1001 role-task 任务 游戏任务
1002 role-stage 副本,场景 游戏关卡
1003 role-act 自定义事件 其他事件
4001 resource-update-start 游戏热更数据下载开始 热更数据
4002 resource-update-success 游戏热更数据下载成功 热更数据
4003 resource-update-fail 游戏热更数据下载失败 热更数据
4004 resource-unzip-start 游戏热更数据解压开始 热更数据
4005 resource-unzip-success 游戏热更数据解压成功 热更数据
4006 resource-unzip-fail 游戏热更数据解压失败 热更数据

1.1.5 虚拟货币变更日志(已停用)

当用户在游戏内,因为种种原因产生虚拟货币的增加和消耗时,需要记录一条对应的虚拟货币变更日志。

变更类型:用于标识本次变更是新增了虚拟货币还是消耗了虚拟货币,新增记录1,消耗记录0。
自定义变更描述:用于标识用户因为什么原因变更虚拟货币,如任务获得,怪物掉落,系统赠送,副本奖励,世界喊话,家族奉献,婚姻喜宴等等。
货币ID:用于记录本次引发虚拟货币变更的货币ID
货币名称:用于记录本次引发虚拟货币变更的货币名称
是否为珍贵物品:用于区分珍贵物品,一般情况下直接充值获得的即为珍贵物品,例如 钻石和铜币, 钻石可视为珍贵物品,铜币可视为非珍贵物品。
货币个数:用于记录用户本次消费行为涉及多少个货币,如果用户本次消费行为与具体货币无关,则该字段置空即可。
变化后货币数量:用于记录获得或者消耗后剩余的货币数量
变更描述:用于记录货币变化的原因或途径

需要注意的是,如果玩家的一次用户行为导致多种虚拟货币变更,比如完成一次购买同时获得1000钻石20000铜币,则需要记录相应的两条虚拟货币变更日志。

LogId 日志名称 LogKey
91 玩家虚拟货币变更日志 role-income-update
字段名 字段类型 字段说明 备注
roleLevel Integer 角色等级 必需
roleVipLevel Integer 角色vip等级 必需
updateType String 变更类型 1:新增 0:消耗 必需
itemId String 货币ID 必需
itemName String 货币名称 便于运营人员识别商品,一般传入中文,必需
isPrecious String 是否为珍贵物品 1:是 0:否
itemCount Integer 货币个数 必须是一个大于0的整数 必需
remains String 变化后货币数量 必须是一个大于等于0的整数
custom String 变更描述 描述变更的原因或途径

日志格式示例:

  1. Android
  2. HashMap<string,object>map = new HashMap<string,object>();
  3. map.put("roleLevel", "1");
  4. map.put("roleVipLevel", "0");
  5. map.put("updateType", "0");
  6. map.put("itemId", "diamond");
  7. map.put("itemName", "钻石");
  8. map.put("isPrecious", "1");
  9. map.put("itemCount", "100");
  10. map.put("remains", "2000");
  11. map.put("custom", "购买道具");
  12. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("91", "role-income-update", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "1";
  5. logJson["roleVipLevel"] = "0";
  6. logJson["updateType"] = "0";
  7. logJson["itemId"] = "diamond";
  8. logJson["itemName"] = "钻石";
  9. logJson["isPrecious"] = "1";
  10. logJson["itemCount"] = "100";
  11. logJson["remains"] = "2000";
  12. logJson["custom"] = "购买道具";
  13. Json::FastWriter fast_writer;
  14. const char* logValJson = fast_writer.write(logJson).c_str();
  15. LTGameSDK::GetInstance().SendLog("91", "role-income-update" ,logValJson);
  16. **OC接口**
  17. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  18. [dict setObject:@"1" forKey:@"roleLevel"];
  19. [dict setObject:@"0" forKey:@"roleVipLevel"];
  20. [dict setObject:@"0" forKey:@"updateType"];
  21. [dict setObject:@"diamond" forKey:@"itemId"];
  22. [dict setObject:@"钻石" forKey:@"itemName"];
  23. [dict setObject:@"1" forKey:@"isPrecious"];
  24. [dict setObject:@"100" forKey:@"itemCount"];
  25. [dict setObject:@"2000" forKey:@"remains"];
  26. [dict setObject:@"购买道具" forKey:@"custom"];
  27. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"91" logKey:@"role-income-update" dict:dict];

1.1.6 虚拟物品变更日志(已停用)

当用户在游戏内,因为种种原因产生虚拟物品(含虚拟货币)的增加和消耗时,需要记录一条对应的虚拟物品变更日志。
变更类型:用于标识本次变更是新增了虚拟物品还是消耗了虚拟物品,新增记录1,消耗记录0。
变更描述:用于标识用户因为什么原因变更虚拟物品,如任务获得,怪物掉落,系统赠送,副本奖励,世界喊话,家族奉献,婚姻喜宴等等。

商品ID:用于记录用户本次是因为哪一个游戏内的商品引发的虚拟物品变更,例如购买游戏内的装备、经验、头衔、坐骑等。商品名称由游戏策划人员自行定义,比如 0001对应装备图纸,0002对应黄金翅膀,0003对应经验丹,0004对应体力等等。传入0001,0002,0003……这些ID即可

商品名称:用于记录用户本次是因为哪一个游戏内的商品引发的虚拟物品变更,例如购买游戏内的装备、经验、头衔、坐骑等。商品名称由游戏策划人员自行定义,比如0001装备图纸,0002黄金翅膀,0003经验丹,0004体力等等。统计结果也会直接将日志中的商品名称展示出来,如果用户本次变更行为 与具体商品道具无关,则该字段置空即可。

商品个数:用于记录用户本次消费行为涉及多少个商品,如果用户本次消费行为与具体商品无关,则该字段置空即可。

商品剩余个数:用于记录本次商品获得或者消耗后,当前剩余的个数。

变更描述:用于记录本次商品获得或者消耗的原因或途径。

需要注意的是,如果玩家的一次事件导致多种虚拟物品变更,比如完成一次史诗副本同时获得1000珍珠20000石币,则需要记录相应的两条虚拟物品变更日志。

LogId 日志名称 LogKey
9 玩家虚拟物品变更日志 role-item-update
字段名 字段类型 字段说明 备注
roleLevel Integer 角色等级 必需
roleVipLevel Integer 角色vip等级 必需
updateType String 变更类型 1:新增 0:消耗 必需
itemId String 商品ID 必需
itemName String 商品名称 便于运营人员识别商品,一般传入中文,必需
itemCount Integer 商品个数 必需
remains String 商品剩余个数 必须是一个大于等于0的整数
custom String 变更描述 描述变更的原因或途径

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "1");
  4. map.put("roleVipLevel", "0");
  5. map.put("updateType", "0");
  6. map.put("itemId", "diamond");
  7. map.put("itemName", "钻石");
  8. map.put("itemCount", "100");
  9. map.put("remains", "255");
  10. map.put("custom", "购买");
  11. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("9", "role-item-update", map);
  12. HashMap<String,Object> map = new HashMap<String,Object>();
  13. map.put("roleLevel", "1");
  14. map.put("roleVipLevel", "0");
  15. map.put("updateType", "1");
  16. map.put("itemId", "MGH_Weapon_001");
  17. map.put("itemName", "玛格汉铁锤");
  18. map.put("itemCount", "1");
  19. map.put("remains", "2");
  20. map.put("custom", "购买");
  21. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("9", "role-item-update", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "1";
  5. logJson["roleVipLevel"] = "0";
  6. logJson["updateType"] = "0";
  7. logJson["itemId"] = "diamond";
  8. logJson["itemName"] = "钻石";
  9. logJson["itemCount"] = "100";
  10. logJson["remains"] = "255";
  11. logJson["custom"] = "100";
  12. Json::FastWriter fast_writer;
  13. const char* logValJson = fast_writer.write(logJson).c_str();
  14. LTGameSDK::GetInstance().SendLog("9", "role-item-update" ,logValJson);
  15. Json::Value logJson;
  16. logJson["roleLevel"] = "1";
  17. logJson["roleVipLevel"] = "0";
  18. logJson["updateType"] = "1";
  19. logJson["itemId"] = "MGH_Weapon_001";
  20. logJson["itemName"] = "玛格汉铁锤";
  21. logJson["itemCount"] = "1";
  22. logJson["remains"] = "2";
  23. logJson["custom"] = "购买";
  24. Json::FastWriter fast_writer;
  25. const char* logValJson = fast_writer.write(logJson).c_str();
  26. LTGameSDK::GetInstance().SendLog("9", "role-item-update" ,logValJson);
  27. **OC接口**
  28. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  29. [dict setObject:@"1" forKey:@"roleLevel"];
  30. [dict setObject:@"0" forKey:@"roleVipLevel"];
  31. [dict setObject:@"0" forKey:@"updateType"];
  32. [dict setObject:@"diamond" forKey:@"itemId"];
  33. [dict setObject:@"钻石" forKey:@"itemName"];
  34. [dict setObject:@"1" forKey:@"isPrecious"];
  35. [dict setObject:@"100" forKey:@"itemCount"];
  36. [dict setObject:@"255" forKey:@"remains"];
  37. [dict setObject:@"199" forKey:@"custom"];
  38. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"9" logKey:@"role-item-update" dict:dict];
  39. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  40. [dict setObject:@"1" forKey:@"roleLevel"];
  41. [dict setObject:@"0" forKey:@"roleVipLevel"];
  42. [dict setObject:@"0" forKey:@"updateType"];
  43. [dict setObject:@"MGH_Weapon_001" forKey:@"itemId"];
  44. [dict setObject:@"玛格汉铁锤" forKey:@"itemName"];
  45. [dict setObject:@"1" forKey:@"isPrecious"];
  46. [dict setObject:@"1" forKey:@"itemCount"];
  47. [dict setObject:@"2" forKey:@"remains"];
  48. [dict setObject:@"购买" forKey:@"custom"];
  49. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"9" logKey:@"role-item-update" dict:dict];

上面两条日志表示当前登录的角色马克.吐温为了购买id为玛格汉铁锤 的武器花了100钻石,剩余255钻石,拥有了2把玛格汉铁锤。

1.1.7 玩家属性变更日志(已停用)

当用户的角色,发生一些属性上的变化时,记录相应的角色属性变更日志。例如等级提升,军衔提升,VIP等级提升,属性点重配,种族天赋变更等等。
属性标识:角色变更了哪种属性,其中等级标识为level,VIP等级标识为viplevel,其余属性标识由游戏产品和开发人员自行设定。
新属性值:角色完成属性变更之后,该属性的值变成了什么。
变更值:如果该属性值是一个数字,比如等级level,那么本次用户的等级变更了多少,例如购买大礼包level连升三级,则变更值为3。
变更描述:用于记录属性变化的原因或途径。

LogId 日志名称 LogKey
10 玩家属性变更日志 role-prop-update
字段名 字段类型 字段说明 备注
roleLevel Integer 角色等级 必需
roleVipLevel Integer 角色vip等级 必需
propKey String 属性标识 必需
propValue String 新属性值 必需
rangeability String 变更值 必需
custom String 变更描述 描述变更的原因或途径

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "3");
  4. map.put("roleVipLevel", "0");
  5. map.put("propKey", "level");
  6. map.put("propValue", "3");
  7. map.put("rangeability", "2");
  8. map.put("custom", "");
  9. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("10", "role-prop-update", map);
  10. HashMap<String,Object> map = new HashMap<String,Object>();
  11. map.put("roleLevel", "2");
  12. map.put("roleVipLevel", "1");
  13. map.put("propKey", "vipLevel");
  14. map.put("propValue", "1");
  15. map.put("rangeability", "1");
  16. map.put("custom", "首次充值");
  17. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("10", "role-prop-update", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "1";
  5. logJson["roleVipLevel"] = "0";
  6. logJson["propKey"] = "level";
  7. logJson["propValue"] = "3";
  8. logJson["rangeability"] = "2";
  9. logJson["custom"] = "";
  10. Json::FastWriter fast_writer;
  11. const char* logValJson = fast_writer.write(logJson).c_str();
  12. LTGameSDK::GetInstance().SendLog("10", "role-prop-update" ,logValJson);
  13. Json::Value logJson;
  14. logJson["roleLevel"] = "2";
  15. logJson["roleVipLevel"] = "1";
  16. logJson["propKey"] = "vipLevel";
  17. logJson["propValue"] = "1";
  18. logJson["rangeability"] = "1";
  19. logJson["custom"] = "首次充值";
  20. Json::FastWriter fast_writer;
  21. const char* logValJson = fast_writer.write(logJson).c_str();
  22. LTGameSDK::GetInstance().SendLog("10", "role-prop-update" ,logValJson);
  23. **OC接口**
  24. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  25. [dict setObject:@"1" forKey:@"roleLevel"];
  26. [dict setObject:@"0" forKey:@"roleVipLevel"];
  27. [dict setObject:@"level" forKey:@"propKey"];
  28. [dict setObject:@"3" forKey:@"propValue"];
  29. [dict setObject:@"2" forKey:@"rangeability"];
  30. [dict setObject:@"" forKey:@"custom"];
  31. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"10" logKey:@"role-prop-update" dict:dict];
  32. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  33. [dict setObject:@"2" forKey:@"roleLevel"];
  34. [dict setObject:@"1" forKey:@"roleVipLevel"];
  35. [dict setObject:@"vipLevel" forKey:@"propKey"];
  36. [dict setObject:@"1" forKey:@"propValue"];
  37. [dict setObject:@"1" forKey:@"rangeability"];
  38. [dict setObject:@"首次充值" forKey:@"custom"];
  39. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"10" logKey:@"role-prop-update" dict:dict];

该记录表示当前角色马克.吐温连升了两级,目前等级为3。他的vip等级升了一级,目前vip等级为1

1.1.8 玩家商品属性变更(已停用)

某些游戏的游戏内商品也有各种属性,比如射击类有戏的枪械会因为改装增加各种新功能,赛车游戏的赛车可以更改引擎、喷漆、轮胎,rpg游戏的玩家会饲养和升级宠物,升级随从的等级和装备等等,因此我们提供了一个游戏内商品属性变更日志,用于记录游戏内各种物品,道具,宠物,随从,武器的等级、技能等属性变更情况。
玩家商品属性变更日志的格式与玩家属性变更日志的区别在于,商品属性变更日志中多了两个用于描述商品的itemId和itemName字段。

LogId 日志名称 LogKey
13 玩家商品属性变更日志 role-item-prop-update
字段名 字段类型 字段说明 备注
roleLevel Integer 角色等级 必需
roleVipLevel Integer 角色vip等级 必需
itemId String 商品ID 必需
itemName String 商品名称 便于运营人员识别商品,一般传入中文 必需
propKey String 属性标识 必需
propValue String 新属性值 必需
rangeability String 变更值 必需
custom String 变更描述 描述变更的原因或途径

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "1");
  4. map.put("roleVipLevel", "0");
  5. map.put("itemId", "tank_m4");
  6. map.put("itemName", "M4谢尔曼中型坦克");
  7. map.put("propKey", "level");
  8. map.put("propValue", "3");
  9. map.put("rangeability", "1");
  10. map.put("custom", "强化装备");
  11. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("13", "role-item-prop-update", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "1";
  5. logJson["roleVipLevel"] = "0";
  6. logJson["itemId"] = "tank_m4";
  7. logJson["itemName"] = "M4谢尔曼中型坦克";
  8. logJson["propKey"] = "level";
  9. logJson["propValue"] = "3";
  10. logJson["rangeability"] = "1";
  11. logJson["custom"] = "强化装备";
  12. Json::FastWriter fast_writer;
  13. const char* logValJson = fast_writer.write(logJson).c_str();
  14. LTGameSDK::GetInstance().SendLog("13", "role-item-prop-update" ,logValJson);
  15. **OC接口**
  16. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  17. [dict setObject:@"1" forKey:@"roleLevel"];
  18. [dict setObject:@"0" forKey:@"roleVipLevel"];
  19. [dict setObject:@"tank_m4" forKey:@"itemId"];
  20. [dict setObject:@"M4谢尔曼中型坦克" forKey:@"itemName"];
  21. [dict setObject:@"level" forKey:@"propKey"];
  22. [dict setObject:@"3" forKey:@"propValue"];
  23. [dict setObject:@"1" forKey:@"rangeability"];
  24. [dict setObject:@"强化装备" forKey:@"custom"];
  25. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"13" logKey:@"role-item-prop-update" dict:dict];

该条日志记录,玩家的M4谢尔曼中型坦克等级提升1级,现在的等级为3级

需要注意的是,只有游戏内对玩家游戏体验非常重要的游戏内商品,比如能够辅助战斗的宠物、随从,赛车游戏的赛车和射击游戏的枪械等等才需要记录该日志; 另外有一个需要注意的地方是role-prop-update用于记录玩家游戏角色的等级和其他属性变更信息,而role-item-prop-update用于记录玩家角色持有的游戏内商品属性变更,两个日志的用途不同,描述的对象也不一样,请在接入时注意区分。

1.1.9 玩家卡牌属性变更(已停用)

对于卡牌类游戏而言,卡牌的收集和升级一直是游戏重点,比如卡牌的稀有程度,等级变化,技能等级等等,因此我们提供了一个游戏内卡牌属性变更日志,用于记录游戏内对应英雄、侠客、随扈等等卡牌的属性变更情况。
玩家卡牌属性变更日志的格式与玩家商品属性变更日志的区别在于,商品属性变更日志中记录的是游戏内商品道具的属性变更,比如武器装备升级之类,而卡牌属性变更则适用于卡牌类游戏。

LogId 日志名称 LogKey
14 玩家卡牌属性变更日志 role-card-prop-update
字段名 字段类型 字段说明 备注
roleLevel Integer 角色等级 必需
roleVipLevel Integer 角色vip等级 必需
cardId String 卡牌ID 必需
cardName String 卡牌名称 便于运营人员识别卡牌,一般传入中文 必需
propKey String 属性标识 必需
newValue String 新属性值 必需
oldValue String 旧属性值 必需
custom String 变更描述 描述变更的原因或途径

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "1");
  4. map.put("roleVipLevel", "0");
  5. map.put("cardId", "blr_man_001");
  6. map.put("cardName", "李星云");
  7. map.put("propKey", "level");
  8. map.put("newValue", "蓝+1");
  9. map.put("oldValue", "绿");
  10. map.put("custom", "强化装备");
  11. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("14", "role-card-prop-update", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "1";
  5. logJson["roleVipLevel"] = "0";
  6. logJson["cardId"] = "blr_man_001";
  7. logJson["cardName"] = "李星云";
  8. logJson["propKey"] = "level";
  9. logJson["newValue"] = "蓝+1";
  10. logJson["oldValue"] = "绿";
  11. logJson["custom"] = "强化装备";
  12. Json::FastWriter fast_writer;
  13. const char* logValJson = fast_writer.write(logJson).c_str();
  14. LTGameSDK::GetInstance().SendLog("14", "role-card-prop-update" ,logValJson);
  15. **OC接口**
  16. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  17. [dict setObject:@"1" forKey:@"roleLevel"];
  18. [dict setObject:@"0" forKey:@"roleVipLevel"];
  19. [dict setObject:@"blr_man_001" forKey:@"cardId"];
  20. [dict setObject:@"李星云" forKey:@"cardName"];
  21. [dict setObject:@"level" forKey:@"propKey"];
  22. [dict setObject:@"蓝+1" forKey:@"newValue"];
  23. [dict setObject:@"绿" forKey:@"oldValue"];
  24. [dict setObject:@"强化装备" forKey:@"custom"];
  25. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"14" logKey:@"role-card-prop-update" dict:dict];

该条日志记录,玩家的侠客——李星云,进阶从绿变成了蓝+1。

1.1.10 任务/副本/自定义日志(客户端调用)

当运营人员需要对游戏内的任务完成情况,关卡完成情况进行记录时,即可记录一条游戏自定义事件。在记录日志之前,游戏运营人员有必要向BI统计后台提供一份任务,关卡,以及其他自定义事件的id和名称对照表,并在BI统计后台描述任务,关卡,道具之间的关系。

任务,副本关卡日志的格式均为stageId,stageName,detail三个字段,三个字段的值完全由游戏研发人员和运营人员自行指定,例如新手引导任务可以用 newbieguide标识stageId,也可以用task001或其他字符串标识来表示stageId,任务完成,既可以用 SUCC表示,也可以用complete表示,还可以根据任务的中断,放弃,失败等多种状况,为同一个任务记录多条日志。对于同一种事件结果,建议使用同样的detail内容来描述。尽量做到同一个detail的含义一致,同一个事件结果的detail一致。

需要注意的地方:
无论是任务,关卡还是其他自定义事件日志,taskId/stageId/actId字段都必须是相对于该日志的logId唯一且在,不能够与其他任务,关卡或道具的id字段重复。
此外,还需确保同一个taskId/stageId/actId值在产品不同的测试阶段对应的点位含义相同。例如一开始用100020代表创建角色,那么以后100020就只能对应创建角色的点位,而不能改为对应其他点位,如需新增点位可以分配一个未被其他点位占用过的Id值,否则会导致产品历史的用户轨迹数据在平台测查询匹配异常,没有相关参考性。

尽管任务,副本/场景,以及游戏自定义事件三个日志的字段数量和格式相同,但是我们希望研发人员能够按照预设的不同logid和logkey分别记录这三类日志,这样一来,便于将相对重要的日志同其它日志区分出来,也便于我们对任务和场景副本日志采用预设的特定算法来进行统计运算。

我们建议用以下的默认字段来记录事件日志的detail,以便统计后台可以用默认的配置来对游戏自定义事件进行计算成功率,通过率等进一步指标。
如果列表中的detail无法满足游戏的日志记录要求,也允许各个游戏使用自己定义的detail来记录日志。

其中detail字段建议取值如下所示:

detail 含义
accept 接任务
fail 任务失败
cancel 放弃任务
succ 达成任务条件
complete 任务完成

1.1.10.1 任务举例

LogId 日志名称 key
1001 任务 role-task
字段名 字段类型 字段说明
roleLevel Integer 角色等级
roleVipLevel Integer 角色vip等级
classifiedId String 分类ID
classifiedName String 分类名称
taskId String 任务编码,英文或数字
taskName String 任务名称,最好传中文
detail String 相关信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "10");
  4. map.put("roleVipLevel", "2");
  5. map.put("classifiedId", "accept1");
  6. map.put("classifiedName", "新手引导");
  7. map.put("taskId", "newbieguide1");
  8. map.put("taskName", "新手引导流程1");
  9. map.put("detail", "accept");
  10. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1001", "role-task", map);
  11. HashMap<String,Object> map = new HashMap<String,Object>();
  12. map.put("roleLevel", "10");
  13. map.put("roleVipLevel", "2");
  14. map.put("classifiedId", "accept1");
  15. map.put("classifiedName", "新手引导");
  16. map.put("taskId", "newbieguide1");
  17. map.put("taskName", "新手引导流程1");
  18. map.put("detail", "complete");
  19. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1001", "role-task", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "10";
  5. logJson["roleVipLevel"] = "2";
  6. logJson["classifiedId"] = "accept1";
  7. logJson["classifiedName"] = "新手引导";
  8. logJson["taskId"] = "newbieguide1";
  9. logJson["taskName"] = "新手引导流程1";
  10. logJson["detail"] = "accept";
  11. Json::FastWriter fast_writer;
  12. const char* logValJson = fast_writer.write(logJson).c_str();
  13. LTGameSDK::GetInstance().SendLog("1001", "role-task" ,logValJson);
  14. Json::Value logJson;
  15. logJson["roleLevel"] = "10";
  16. logJson["roleVipLevel"] = "2";
  17. logJson["classifiedId"] = "accept1";
  18. logJson["classifiedName"] = "新手引导";
  19. logJson["taskId"] = "newbieguide1";
  20. logJson["taskName"] = "新手引导流程1";
  21. logJson["detail"] = "complete";
  22. Json::FastWriter fast_writer;
  23. const char* logValJson = fast_writer.write(logJson).c_str();
  24. LTGameSDK::GetInstance().SendLog("1001", "role-task" ,logValJson);
  25. **OC接口**
  26. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  27. [dict setObject:@"10" forKey:@"roleLevel"];
  28. [dict setObject:@"2" forKey:@"roleVipLevel"];
  29. [dict setObject:@"accept1" forKey:@"classifiedId"];
  30. [dict setObject:@"新手引导" forKey:@"classifiedName"];
  31. [dict setObject:@"newbieguide1" forKey:@"taskId"];
  32. [dict setObject:@"新手引导流程1" forKey:@"taskName"];
  33. [dict setObject:@"accept" forKey:@"detail"];
  34. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1001" logKey:@"role-task" dict:dict];
  35. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  36. [dict setObject:@"10" forKey:@"roleLevel"];
  37. [dict setObject:@"2" forKey:@"roleVipLevel"];
  38. [dict setObject:@"accept1" forKey:@"classifiedId"];
  39. [dict setObject:@"新手引导" forKey:@"classifiedName"];
  40. [dict setObject:@"newbieguide1" forKey:@"taskId"];
  41. [dict setObject:@"新手引导流程1" forKey:@"taskName"];
  42. [dict setObject:@"complete" forKey:@"detail"];
  43. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1001" logKey:@"role-task" dict:dict];

这两条日志表示,
当前角色马克.吐温接受了新手流程任务1,
完成了新手流程任务1。

1.1.10.2 副本,场景 举例

LogId 日志名称 key
1002 副本场景日志 role-stage
字段名 字段类型 字段说明
roleLevel Integer 角色等级
roleVipLevel Integer 角色vip等级
classifiedId String 分类ID
classifiedName String 分类名称
stageId String 副本场景标识,英文或数字
stageName String 副本场景名称,最好传中文
detail String 相关信息,全为英文

其中detail字段建议取值如下所示:

detail 含义
begin 场景开始
fail 场景失败
cancel 场景取消
end 场景结束

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "10");
  4. map.put("roleVipLevel", "2");
  5. map.put("classifiedId", "Dungeons");
  6. map.put("classifiedName", "副本");
  7. map.put("stageId", "DeadminesIstanc");
  8. map.put("stageName", "死亡矿井");
  9. map.put("detail", "begin");
  10. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1002", "role-stage", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "10";
  5. logJson["roleVipLevel"] = "2";
  6. logJson["classifiedId"] = "Dungeons";
  7. logJson["classifiedName"] = "副本";
  8. logJson["stageId"] = "DeadminesIstanc";
  9. logJson["stageName"] = "死亡矿井";
  10. logJson["detail"] = "begin";
  11. Json::FastWriter fast_writer;
  12. const char* logValJson = fast_writer.write(logJson).c_str();
  13. LTGameSDK::GetInstance().SendLog("1002", "role-stage" ,logValJson);
  14. **OC接口**
  15. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  16. [dict setObject:@"10" forKey:@"roleLevel"];
  17. [dict setObject:@"2" forKey:@"roleVipLevel"];
  18. [dict setObject:@"Dungeons" forKey:@"classifiedId"];
  19. [dict setObject:@"副本" forKey:@"classifiedName"];
  20. [dict setObject:@"DeadminesIstanc" forKey:@"stageId"];
  21. [dict setObject:@"死亡矿井" forKey:@"stageName"];
  22. [dict setObject:@"begin" forKey:@"detail"];
  23. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1002" logKey:@"role-stage" dict:dict];

以上日志表示,当前角色进入死亡矿井。

1.1.10.3 自定义事件 举例

LogId 日志名称 key
1003 游戏自定义事件 role-act
字段名 字段类型 字段说明
roleLevel Integer 角色等级
roleVipLevel Integer 角色vip等级
classifiedId String 分类ID
classifiedName String 分类名称
actId String 事件标识,英文或数字
actName String 事件名称,最好传中文
detail String 相关信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("roleLevel", "10");
  4. map.put("roleVipLevel", "2");
  5. map.put("classifiedId", "Dungeons");
  6. map.put("classifiedName", "副本");
  7. map.put("actId", "fight.mineer");
  8. map.put("actName", "战斗.狗头人矿工");
  9. map.put("detail", "begin");
  10. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1003", "role-act", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["roleLevel"] = "10";
  5. logJson["roleVipLevel"] = "2";
  6. logJson["classifiedId"] = "Dungeons";
  7. logJson["classifiedName"] = "副本";
  8. logJson["actId"] = "fight.mineer";
  9. logJson["actName"] = "战斗.狗头人矿工";
  10. logJson["detail"] = "begin";
  11. Json::FastWriter fast_writer;
  12. const char* logValJson = fast_writer.write(logJson).c_str();
  13. LTGameSDK::GetInstance().SendLog("1003", "role-act" ,logValJson);
  14. **OC接口**
  15. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  16. [dict setObject:@"10" forKey:@"roleLevel"];
  17. [dict setObject:@"2" forKey:@"roleVipLevel"];
  18. [dict setObject:@"Dungeons" forKey:@"classifiedId"];
  19. [dict setObject:@"副本" forKey:@"classifiedName"];
  20. [dict setObject:@"fight.mineer" forKey:@"actId"];
  21. [dict setObject:@"战斗.狗头人矿工" forKey:@"actName"];
  22. [dict setObject:@"begin" forKey:@"detail"];
  23. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1003" logKey:@"role-act" dict:dict];

以上日志表示,当前角色和狗头人旷工进行战斗。

1.1.11 游戏资源下载打点(客户端调用)

注意:
1、下载开始、下载成功、下载失败三个点,是针对当前下载行为的打点,比如1.0.0.1更新到1.0.0.2,一共100M,包含200个资源文件,只需要报一次下载开始、下载成功或者下载失败即可,不需要报200次。
2、此日志仅适配于进游戏前的热更,如果游戏内有边玩边下功能,请参考 1.1.12。

1.1.11.1 游戏热更数据下载开始

LogId 日志名称 key
4001 游戏热更数据下载开始 resource-update-start
字段名 字段类型 字段说明
dataPath String 资源地址
detail String 游戏扩展信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("dataPath", "https://www.longtubus.com/xxxx.zip");
  4. map.put("detail", "update");
  5. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4001", "resource-update-start", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";
  5. logJson["detail"] = "update";
  6. Json::FastWriter fast_writer;
  7. const char* logValJson = fast_writer.write(logJson).c_str();
  8. LTGameSDK::GetInstance().SendLog("4001", "resource-update-start" ,logValJson);
  9. **OC接口**
  10. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  11. [dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];
  12. [dict setObject:@"update" forKey:@"detail"];
  13. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4001" logKey:@"resource-update-start" dict:dict];

以上日志表示,开始从https://www.longtubas.com/xxxx.zip 地址下载资源文件。

1.1.11.2 游戏热更数据下载成功

LogId 日志名称 key
4002 游戏热更数据下载成功 resource-update-success
字段名 字段类型 字段说明
dataPath String 资源地址
detail String 游戏扩展信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("dataPath", "https://www.longtubus.com/xxxx.zip");
  4. map.put("detail", "success");
  5. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4002", "resource-update-success", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";
  5. logJson["detail"] = "success";
  6. Json::FastWriter fast_writer;
  7. const char* logValJson = fast_writer.write(logJson).c_str();
  8. LTGameSDK::GetInstance().SendLog("4002", "resource-update-success" ,logValJson);
  9. **OC接口**
  10. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  11. [dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];
  12. [dict setObject:@"success" forKey:@"detail"];
  13. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4002" logKey:@"resource-update-success" dict:dict];

以上日志表示,开始从https://www.longtubas.com/xxxx.zip 地址下载资源文件成功。

1.1.11.3 游戏热更数据下载失败

LogId 日志名称 key
4003 游戏热更数据下载失败 resource-update-fail
字段名 字段类型 字段说明
dataPath String 资源地址
dataCDNIP String 资源地址对应的ip
failType String 失败原因
detail String 游戏扩展信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("dataPath", "https://www.longtubus.com/xxxx.zip");
  4. map.put("dataCDNIP", "192.168.1.1");
  5. map.put("failType", "HTTPStatusCode:404");
  6. map.put("detail", "fail");
  7. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4003", "resource-update-fail", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";
  5. logJson["dataCDNIP"] = "192.168.1.1";
  6. logJson["failType"] = "HTTPStatusCode:404";
  7. logJson["detail"] = "fail";
  8. Json::FastWriter fast_writer;
  9. const char* logValJson = fast_writer.write(logJson).c_str();
  10. LTGameSDK::GetInstance().SendLog("4003", "resource-update-fail" ,logValJson);
  11. **OC接口**
  12. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  13. [dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];
  14. [dict setObject:@"192.168.1.1" forKey:@"dataCDNIP"];
  15. [dict setObject:@"HTTPStatusCode:404" forKey:@"failType"];
  16. [dict setObject:@"fail" forKey:@"detail"];
  17. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4003" logKey:@"resource-update-fail" dict:dict];

以上日志表示,开始从https://www.longtubas.com/xxxx.zip 地址下载资源文件失败,
https://www.longtubas.com/xxxx.zip 对应的ip为:192.168.1.1,
失败原因为:HTTPStatusCode:404。

1.1.11.4 游戏热更数据解压开始

LogId 日志名称 key
4004 游戏热更数据解压开始 resource-unzip-start
字段名 字段类型 字段说明
dataName String 资源名称
detail String 游戏扩展信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("dataName", "xxxx.zip");
  4. map.put("detail", "unzip-start");
  5. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4004", "resource-unzip-start", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["dataName"] = "xxxx.zip";
  5. logJson["detail"] = "unzip-start";
  6. Json::FastWriter fast_writer;
  7. const char* logValJson = fast_writer.write(logJson).c_str();
  8. LTGameSDK::GetInstance().SendLog("4004", "resource-unzip-start" ,logValJson);
  9. **OC接口**
  10. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  11. [dict setObject:@"xxxx.zip" forKey:@"dataName"];
  12. [dict setObject:@"unzip-start" forKey:@"detail"];
  13. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4004" logKey:@"resource-unzip-start" dict:dict];

以上日志表示,开始解压xxxx.zip 资源文件。

1.1.11.5 游戏热更数据解压成功

LogId 日志名称 key
4005 游戏热更数据解压成功 resource-unzip-success
字段名 字段类型 字段说明
dataName String 资源名称
detail String 游戏扩展信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("dataName", "xxxx.zip");
  4. map.put("detail", "unzip-success");
  5. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4005", "resource-unzip-success", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["dataName"] = "xxxx.zip";
  5. logJson["detail"] = "unzip-success";
  6. Json::FastWriter fast_writer;
  7. const char* logValJson = fast_writer.write(logJson).c_str();
  8. LTGameSDK::GetInstance().SendLog("4005", "resource-unzip-success" ,logValJson);
  9. **OC接口**
  10. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  11. [dict setObject:@"xxxx.zip" forKey:@"dataName"];
  12. [dict setObject:@"unzip-success" forKey:@"detail"];
  13. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4005" logKey:@"resource-unzip-success" dict:dict];

以上日志表示,开始解压xxxx.zip 资源文件 成功。

1.1.11.6 游戏热更数据解压失败

LogId 日志名称 key
4006 游戏热更数据解压失败 resource-unzip-fail
字段名 字段类型 字段说明
dataName String 资源名称
detail String 游戏扩展信息,全为英文

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("dataName", "xxxx.zip");
  4. map.put("detail", "unzip-fail");
  5. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4006", "resource-unzip-fail", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["dataName"] = "xxxx.zip";
  5. logJson["detail"] = "unzip-fail";
  6. Json::FastWriter fast_writer;
  7. const char* logValJson = fast_writer.write(logJson).c_str();
  8. LTGameSDK::GetInstance().SendLog("4006", "resource-unzip-fail" ,logValJson);
  9. **OC接口**
  10. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  11. [dict setObject:@"xxxx.zip" forKey:@"dataName"];
  12. [dict setObject:@"unzip-fail" forKey:@"detail"];
  13. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4006" logKey:@"resource-unzip-fail" dict:dict];

以上日志表示,开始解压xxxx.zip 资源文件 失败。

1.1.12 游戏边玩边下资源下载打点(客户端调用)

注意:
1、开始、成功、失败三个状态,是针对当前下载行为的打点,比如1.0.0.1更新到1.0.0.2,一共100M,包含200个资源文件,只需要报一次下载开始、下载成功或者下载失败即可,不需要报200次。

1.1.12.1 游戏边玩边下数据下载

LogId 日志名称 key
4013 边玩边下数据下载日志 resourceupdate_custom
字段名 字段类型 字段说明
actId String 热更类型ID, 游戏自定义
actName String 热更类型名称, 游戏自定义
state String 热更状态:1:开始 2:成功 3:失败
dataPath String 资源地址
dataCDNIP String 资源地址对应的ip
failType String 失败原因
detail String 游戏扩展信息,全为英文


acdid actName 介绍:
考虑到游戏边玩边下功能,资源下载位置 和资源下载分段的不确定性。所以热更类型 由游戏根据自身情况自定义。
state为下载状态或者解压状态。
举例说明:
游戏内需要下载多个副本资源,分为好望角,阿卡尼亚等。
好望角副本ID为:game_fb_001
好望角资源的下载和解压日志可以如下设置
actId 可以为: game_fb_001_down ,game_fb_001_unzip。
actName 可以为:好望角 ,好望角解压。

日志格式示例:

  1. Android
  2. HashMap<String,Object> map = new HashMap<String,Object>();
  3. map.put("actId", "game_fb_001_down");
  4. map.put("actName", "好望角");
  5. map.put("state", "3");
  6. map.put("dataPath", "https://www.longtubus.com/xxxx.zip");
  7. map.put("dataCDNIP", "192.168.1.1");
  8. map.put("failType", "HTTPStatusCode:404");
  9. map.put("detail", "fail");
  10. LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4013", "resourceupdate_custom", map);
  1. IOS
  2. **C++接口**
  3. Json::Value logJson;
  4. logJson["actId"]= "game_fb_001_down";
  5. logJson["actName"]= "好望角";
  6. logJson["state"] ="3";
  7. logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";
  8. logJson["dataCDNIP"] = "192.168.1.1";
  9. logJson["failType"] = "HTTPStatusCode:404";
  10. logJson["detail"] = "fail";
  11. Json::FastWriter fast_writer;
  12. const char* logValJson = fast_writer.write(logJson).c_str();
  13. LTGameSDK::GetInstance().SendLog("4013", "resourceupdate_custom" ,logValJson);
  14. **OC接口**
  15. NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
  16. [dict setObject:@"game_fb_001_down" forKey:@"actId"];
  17. [dict setObject:@"好望角" forKey:@"actName"];
  18. [dict setObject:@"3" forKey:@"state"];
  19. [dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];
  20. [dict setObject:@"192.168.1.1" forKey:@"dataCDNIP"];
  21. [dict setObject:@"HTTPStatusCode:404" forKey:@"failType"];
  22. [dict setObject:@"fail" forKey:@"detail"];
  23. [[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4013" logKey:@"resourceupdate_custom" dict:dict];

以上日志表示,开始从https://www.longtubas.com/xxxx.zip 地址下载资源文件失败,
https://www.longtubas.com/xxxx.zip 对应的ip为:192.168.1.1,
失败原因为:HTTPStatusCode:404。
下载的资源为:好望角资源