收集游戏玩家行为信息,用于统计分析玩家行为。
需要接入android 或者 ios Base Sdk以后时候。
Android/*** 游戏端需发送的统计日志** @param logID 日志ID* @param logKey 日志KEY* @param logValue 日志内容 HashMap key-val格式*/public void LTBaseSDKSendGameInfoLog(String logID, String logKey, HashMap<String,Object> map)
IOS/*** 游戏端需发送的统计日志** @param logID 日志ID* @param logKey 日志KEY* @param logValJson 日志内容 json 格式字符串*/**C++接口**LTGameSDK::GetInstance().SendLog(const char* logID, const char* logKey ,const char* logValJson);**OC接口**- (void)LTSDKSendLogWithLogId:(NSString *)logId logKey:(NSString *)logKey dict:(NSDictionary *)dict;
unity/*** 游戏端需发送的统计日志** @param logID 日志ID* @param logKey 日志KEY* @param LogValue 日志内容 Dictionary key-val格式* @return null*/LTStatisticsEntry.GetInstance().sendGameInfoLog(string logID, string logKey,Dictionary<string, object> LogValue);
| 参数名称 | 重要性 | 类型 | 说明 |
|---|---|---|---|
| logID | 必须 | String | 日志ID (详见logId和LogKey对应表) |
| logKey | 必须 | String | 日志KEY (详见logId和LogKey对应表) |
| map | 必须 | HashMap | 日志属性,具体属性字段见下面日志的说明表格 |
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("key1", "value1");map.put("key2", "value2");map.put("key3", "value3");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog ("logID", "logKey", map);
IOS**C++接口**Json::Value logJson;logJson["key1"] = "value1";logJson["key2"] = "value2";logJson["key3"] = "value3";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("logID", "logKey" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"value1" forKey:@"key1"];[dict setObject:@"value2" forKey:@"key2"];[dict setObject:@"value3" forKey:@"key3"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"logID" logKey:@"logKey" dict:dict];
unityDictionary<string, object> map = new Dictionary<string, object>();map.Add("key1", "value1");map.Add("key2", "value2");map.Add("key3", "value3");LTStatisticsEntry.GetInstance().sendGameInfoLog(logID,logKey,map);
| 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,消耗记录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 | 变更描述 | 描述变更的原因或途径 |
日志格式示例:
AndroidHashMap<string,object>map = new HashMap<string,object>();map.put("roleLevel", "1");map.put("roleVipLevel", "0");map.put("updateType", "0");map.put("itemId", "diamond");map.put("itemName", "钻石");map.put("isPrecious", "1");map.put("itemCount", "100");map.put("remains", "2000");map.put("custom", "购买道具");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("91", "role-income-update", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "1";logJson["roleVipLevel"] = "0";logJson["updateType"] = "0";logJson["itemId"] = "diamond";logJson["itemName"] = "钻石";logJson["isPrecious"] = "1";logJson["itemCount"] = "100";logJson["remains"] = "2000";logJson["custom"] = "购买道具";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("91", "role-income-update" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"1" forKey:@"roleLevel"];[dict setObject:@"0" forKey:@"roleVipLevel"];[dict setObject:@"0" forKey:@"updateType"];[dict setObject:@"diamond" forKey:@"itemId"];[dict setObject:@"钻石" forKey:@"itemName"];[dict setObject:@"1" forKey:@"isPrecious"];[dict setObject:@"100" forKey:@"itemCount"];[dict setObject:@"2000" forKey:@"remains"];[dict setObject:@"购买道具" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"91" logKey:@"role-income-update" dict:dict];
当用户在游戏内,因为种种原因产生虚拟物品(含虚拟货币)的增加和消耗时,需要记录一条对应的虚拟物品变更日志。
变更类型:用于标识本次变更是新增了虚拟物品还是消耗了虚拟物品,新增记录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 | 变更描述 | 描述变更的原因或途径 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "1");map.put("roleVipLevel", "0");map.put("updateType", "0");map.put("itemId", "diamond");map.put("itemName", "钻石");map.put("itemCount", "100");map.put("remains", "255");map.put("custom", "购买");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("9", "role-item-update", map);HashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "1");map.put("roleVipLevel", "0");map.put("updateType", "1");map.put("itemId", "MGH_Weapon_001");map.put("itemName", "玛格汉铁锤");map.put("itemCount", "1");map.put("remains", "2");map.put("custom", "购买");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("9", "role-item-update", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "1";logJson["roleVipLevel"] = "0";logJson["updateType"] = "0";logJson["itemId"] = "diamond";logJson["itemName"] = "钻石";logJson["itemCount"] = "100";logJson["remains"] = "255";logJson["custom"] = "100";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("9", "role-item-update" ,logValJson);Json::Value logJson;logJson["roleLevel"] = "1";logJson["roleVipLevel"] = "0";logJson["updateType"] = "1";logJson["itemId"] = "MGH_Weapon_001";logJson["itemName"] = "玛格汉铁锤";logJson["itemCount"] = "1";logJson["remains"] = "2";logJson["custom"] = "购买";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("9", "role-item-update" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"1" forKey:@"roleLevel"];[dict setObject:@"0" forKey:@"roleVipLevel"];[dict setObject:@"0" forKey:@"updateType"];[dict setObject:@"diamond" forKey:@"itemId"];[dict setObject:@"钻石" forKey:@"itemName"];[dict setObject:@"1" forKey:@"isPrecious"];[dict setObject:@"100" forKey:@"itemCount"];[dict setObject:@"255" forKey:@"remains"];[dict setObject:@"199" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"9" logKey:@"role-item-update" dict:dict];NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"1" forKey:@"roleLevel"];[dict setObject:@"0" forKey:@"roleVipLevel"];[dict setObject:@"0" forKey:@"updateType"];[dict setObject:@"MGH_Weapon_001" forKey:@"itemId"];[dict setObject:@"玛格汉铁锤" forKey:@"itemName"];[dict setObject:@"1" forKey:@"isPrecious"];[dict setObject:@"1" forKey:@"itemCount"];[dict setObject:@"2" forKey:@"remains"];[dict setObject:@"购买" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"9" logKey:@"role-item-update" dict:dict];
上面两条日志表示当前登录的角色马克.吐温为了购买id为玛格汉铁锤 的武器花了100钻石,剩余255钻石,拥有了2把玛格汉铁锤。
当用户的角色,发生一些属性上的变化时,记录相应的角色属性变更日志。例如等级提升,军衔提升,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 | 变更描述 | 描述变更的原因或途径 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "3");map.put("roleVipLevel", "0");map.put("propKey", "level");map.put("propValue", "3");map.put("rangeability", "2");map.put("custom", "");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("10", "role-prop-update", map);HashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "2");map.put("roleVipLevel", "1");map.put("propKey", "vipLevel");map.put("propValue", "1");map.put("rangeability", "1");map.put("custom", "首次充值");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("10", "role-prop-update", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "1";logJson["roleVipLevel"] = "0";logJson["propKey"] = "level";logJson["propValue"] = "3";logJson["rangeability"] = "2";logJson["custom"] = "";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("10", "role-prop-update" ,logValJson);Json::Value logJson;logJson["roleLevel"] = "2";logJson["roleVipLevel"] = "1";logJson["propKey"] = "vipLevel";logJson["propValue"] = "1";logJson["rangeability"] = "1";logJson["custom"] = "首次充值";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("10", "role-prop-update" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"1" forKey:@"roleLevel"];[dict setObject:@"0" forKey:@"roleVipLevel"];[dict setObject:@"level" forKey:@"propKey"];[dict setObject:@"3" forKey:@"propValue"];[dict setObject:@"2" forKey:@"rangeability"];[dict setObject:@"" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"10" logKey:@"role-prop-update" dict:dict];NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"2" forKey:@"roleLevel"];[dict setObject:@"1" forKey:@"roleVipLevel"];[dict setObject:@"vipLevel" forKey:@"propKey"];[dict setObject:@"1" forKey:@"propValue"];[dict setObject:@"1" forKey:@"rangeability"];[dict setObject:@"首次充值" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"10" logKey:@"role-prop-update" dict:dict];
该记录表示当前角色马克.吐温连升了两级,目前等级为3。他的vip等级升了一级,目前vip等级为1
某些游戏的游戏内商品也有各种属性,比如射击类有戏的枪械会因为改装增加各种新功能,赛车游戏的赛车可以更改引擎、喷漆、轮胎,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 | 变更描述 | 描述变更的原因或途径 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "1");map.put("roleVipLevel", "0");map.put("itemId", "tank_m4");map.put("itemName", "M4谢尔曼中型坦克");map.put("propKey", "level");map.put("propValue", "3");map.put("rangeability", "1");map.put("custom", "强化装备");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("13", "role-item-prop-update", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "1";logJson["roleVipLevel"] = "0";logJson["itemId"] = "tank_m4";logJson["itemName"] = "M4谢尔曼中型坦克";logJson["propKey"] = "level";logJson["propValue"] = "3";logJson["rangeability"] = "1";logJson["custom"] = "强化装备";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("13", "role-item-prop-update" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"1" forKey:@"roleLevel"];[dict setObject:@"0" forKey:@"roleVipLevel"];[dict setObject:@"tank_m4" forKey:@"itemId"];[dict setObject:@"M4谢尔曼中型坦克" forKey:@"itemName"];[dict setObject:@"level" forKey:@"propKey"];[dict setObject:@"3" forKey:@"propValue"];[dict setObject:@"1" forKey:@"rangeability"];[dict setObject:@"强化装备" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"13" logKey:@"role-item-prop-update" dict:dict];
该条日志记录,玩家的M4谢尔曼中型坦克等级提升1级,现在的等级为3级
需要注意的是,只有游戏内对玩家游戏体验非常重要的游戏内商品,比如能够辅助战斗的宠物、随从,赛车游戏的赛车和射击游戏的枪械等等才需要记录该日志; 另外有一个需要注意的地方是role-prop-update用于记录玩家游戏角色的等级和其他属性变更信息,而role-item-prop-update用于记录玩家角色持有的游戏内商品属性变更,两个日志的用途不同,描述的对象也不一样,请在接入时注意区分。
对于卡牌类游戏而言,卡牌的收集和升级一直是游戏重点,比如卡牌的稀有程度,等级变化,技能等级等等,因此我们提供了一个游戏内卡牌属性变更日志,用于记录游戏内对应英雄、侠客、随扈等等卡牌的属性变更情况。
玩家卡牌属性变更日志的格式与玩家商品属性变更日志的区别在于,商品属性变更日志中记录的是游戏内商品道具的属性变更,比如武器装备升级之类,而卡牌属性变更则适用于卡牌类游戏。
| 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 | 变更描述 | 描述变更的原因或途径 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "1");map.put("roleVipLevel", "0");map.put("cardId", "blr_man_001");map.put("cardName", "李星云");map.put("propKey", "level");map.put("newValue", "蓝+1");map.put("oldValue", "绿");map.put("custom", "强化装备");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("14", "role-card-prop-update", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "1";logJson["roleVipLevel"] = "0";logJson["cardId"] = "blr_man_001";logJson["cardName"] = "李星云";logJson["propKey"] = "level";logJson["newValue"] = "蓝+1";logJson["oldValue"] = "绿";logJson["custom"] = "强化装备";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("14", "role-card-prop-update" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"1" forKey:@"roleLevel"];[dict setObject:@"0" forKey:@"roleVipLevel"];[dict setObject:@"blr_man_001" forKey:@"cardId"];[dict setObject:@"李星云" forKey:@"cardName"];[dict setObject:@"level" forKey:@"propKey"];[dict setObject:@"蓝+1" forKey:@"newValue"];[dict setObject:@"绿" forKey:@"oldValue"];[dict setObject:@"强化装备" forKey:@"custom"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"14" logKey:@"role-card-prop-update" dict:dict];
该条日志记录,玩家的侠客——李星云,进阶从绿变成了蓝+1。
当运营人员需要对游戏内的任务完成情况,关卡完成情况进行记录时,即可记录一条游戏自定义事件。在记录日志之前,游戏运营人员有必要向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 | 任务完成 |
| LogId | 日志名称 | key |
|---|---|---|
| 1001 | 任务 | role-task |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| roleLevel | Integer | 角色等级 |
| roleVipLevel | Integer | 角色vip等级 |
| classifiedId | String | 分类ID |
| classifiedName | String | 分类名称 |
| taskId | String | 任务编码,英文或数字 |
| taskName | String | 任务名称,最好传中文 |
| detail | String | 相关信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "10");map.put("roleVipLevel", "2");map.put("classifiedId", "accept1");map.put("classifiedName", "新手引导");map.put("taskId", "newbieguide1");map.put("taskName", "新手引导流程1");map.put("detail", "accept");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1001", "role-task", map);HashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "10");map.put("roleVipLevel", "2");map.put("classifiedId", "accept1");map.put("classifiedName", "新手引导");map.put("taskId", "newbieguide1");map.put("taskName", "新手引导流程1");map.put("detail", "complete");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1001", "role-task", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "10";logJson["roleVipLevel"] = "2";logJson["classifiedId"] = "accept1";logJson["classifiedName"] = "新手引导";logJson["taskId"] = "newbieguide1";logJson["taskName"] = "新手引导流程1";logJson["detail"] = "accept";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("1001", "role-task" ,logValJson);Json::Value logJson;logJson["roleLevel"] = "10";logJson["roleVipLevel"] = "2";logJson["classifiedId"] = "accept1";logJson["classifiedName"] = "新手引导";logJson["taskId"] = "newbieguide1";logJson["taskName"] = "新手引导流程1";logJson["detail"] = "complete";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("1001", "role-task" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"10" forKey:@"roleLevel"];[dict setObject:@"2" forKey:@"roleVipLevel"];[dict setObject:@"accept1" forKey:@"classifiedId"];[dict setObject:@"新手引导" forKey:@"classifiedName"];[dict setObject:@"newbieguide1" forKey:@"taskId"];[dict setObject:@"新手引导流程1" forKey:@"taskName"];[dict setObject:@"accept" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1001" logKey:@"role-task" dict:dict];NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"10" forKey:@"roleLevel"];[dict setObject:@"2" forKey:@"roleVipLevel"];[dict setObject:@"accept1" forKey:@"classifiedId"];[dict setObject:@"新手引导" forKey:@"classifiedName"];[dict setObject:@"newbieguide1" forKey:@"taskId"];[dict setObject:@"新手引导流程1" forKey:@"taskName"];[dict setObject:@"complete" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1001" logKey:@"role-task" dict:dict];
这两条日志表示,
当前角色马克.吐温接受了新手流程任务1,
完成了新手流程任务1。
| 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 | 场景结束 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "10");map.put("roleVipLevel", "2");map.put("classifiedId", "Dungeons");map.put("classifiedName", "副本");map.put("stageId", "DeadminesIstanc");map.put("stageName", "死亡矿井");map.put("detail", "begin");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1002", "role-stage", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "10";logJson["roleVipLevel"] = "2";logJson["classifiedId"] = "Dungeons";logJson["classifiedName"] = "副本";logJson["stageId"] = "DeadminesIstanc";logJson["stageName"] = "死亡矿井";logJson["detail"] = "begin";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("1002", "role-stage" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"10" forKey:@"roleLevel"];[dict setObject:@"2" forKey:@"roleVipLevel"];[dict setObject:@"Dungeons" forKey:@"classifiedId"];[dict setObject:@"副本" forKey:@"classifiedName"];[dict setObject:@"DeadminesIstanc" forKey:@"stageId"];[dict setObject:@"死亡矿井" forKey:@"stageName"];[dict setObject:@"begin" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1002" logKey:@"role-stage" dict:dict];
以上日志表示,当前角色进入死亡矿井。
| LogId | 日志名称 | key |
|---|---|---|
| 1003 | 游戏自定义事件 | role-act |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| roleLevel | Integer | 角色等级 |
| roleVipLevel | Integer | 角色vip等级 |
| classifiedId | String | 分类ID |
| classifiedName | String | 分类名称 |
| actId | String | 事件标识,英文或数字 |
| actName | String | 事件名称,最好传中文 |
| detail | String | 相关信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("roleLevel", "10");map.put("roleVipLevel", "2");map.put("classifiedId", "Dungeons");map.put("classifiedName", "副本");map.put("actId", "fight.mineer");map.put("actName", "战斗.狗头人矿工");map.put("detail", "begin");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("1003", "role-act", map);
IOS**C++接口**Json::Value logJson;logJson["roleLevel"] = "10";logJson["roleVipLevel"] = "2";logJson["classifiedId"] = "Dungeons";logJson["classifiedName"] = "副本";logJson["actId"] = "fight.mineer";logJson["actName"] = "战斗.狗头人矿工";logJson["detail"] = "begin";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("1003", "role-act" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"10" forKey:@"roleLevel"];[dict setObject:@"2" forKey:@"roleVipLevel"];[dict setObject:@"Dungeons" forKey:@"classifiedId"];[dict setObject:@"副本" forKey:@"classifiedName"];[dict setObject:@"fight.mineer" forKey:@"actId"];[dict setObject:@"战斗.狗头人矿工" forKey:@"actName"];[dict setObject:@"begin" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"1003" logKey:@"role-act" dict:dict];
以上日志表示,当前角色和狗头人旷工进行战斗。
注意:
1、下载开始、下载成功、下载失败三个点,是针对当前下载行为的打点,比如1.0.0.1更新到1.0.0.2,一共100M,包含200个资源文件,只需要报一次下载开始、下载成功或者下载失败即可,不需要报200次。
2、此日志仅适配于进游戏前的热更,如果游戏内有边玩边下功能,请参考 1.1.12。
| LogId | 日志名称 | key |
|---|---|---|
| 4001 | 游戏热更数据下载开始 | resource-update-start |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| dataPath | String | 资源地址 |
| detail | String | 游戏扩展信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("dataPath", "https://www.longtubus.com/xxxx.zip");map.put("detail", "update");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4001", "resource-update-start", map);
IOS**C++接口**Json::Value logJson;logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";logJson["detail"] = "update";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4001", "resource-update-start" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];[dict setObject:@"update" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4001" logKey:@"resource-update-start" dict:dict];
以上日志表示,开始从https://www.longtubas.com/xxxx.zip 地址下载资源文件。
| LogId | 日志名称 | key |
|---|---|---|
| 4002 | 游戏热更数据下载成功 | resource-update-success |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| dataPath | String | 资源地址 |
| detail | String | 游戏扩展信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("dataPath", "https://www.longtubus.com/xxxx.zip");map.put("detail", "success");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4002", "resource-update-success", map);
IOS**C++接口**Json::Value logJson;logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";logJson["detail"] = "success";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4002", "resource-update-success" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];[dict setObject:@"success" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4002" logKey:@"resource-update-success" dict:dict];
以上日志表示,开始从https://www.longtubas.com/xxxx.zip 地址下载资源文件成功。
| LogId | 日志名称 | key |
|---|---|---|
| 4003 | 游戏热更数据下载失败 | resource-update-fail |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| dataPath | String | 资源地址 |
| dataCDNIP | String | 资源地址对应的ip |
| failType | String | 失败原因 |
| detail | String | 游戏扩展信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("dataPath", "https://www.longtubus.com/xxxx.zip");map.put("dataCDNIP", "192.168.1.1");map.put("failType", "HTTPStatusCode:404");map.put("detail", "fail");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4003", "resource-update-fail", map);
IOS**C++接口**Json::Value logJson;logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";logJson["dataCDNIP"] = "192.168.1.1";logJson["failType"] = "HTTPStatusCode:404";logJson["detail"] = "fail";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4003", "resource-update-fail" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];[dict setObject:@"192.168.1.1" forKey:@"dataCDNIP"];[dict setObject:@"HTTPStatusCode:404" forKey:@"failType"];[dict setObject:@"fail" forKey:@"detail"];[[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。
| LogId | 日志名称 | key |
|---|---|---|
| 4004 | 游戏热更数据解压开始 | resource-unzip-start |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| dataName | String | 资源名称 |
| detail | String | 游戏扩展信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("dataName", "xxxx.zip");map.put("detail", "unzip-start");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4004", "resource-unzip-start", map);
IOS**C++接口**Json::Value logJson;logJson["dataName"] = "xxxx.zip";logJson["detail"] = "unzip-start";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4004", "resource-unzip-start" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"xxxx.zip" forKey:@"dataName"];[dict setObject:@"unzip-start" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4004" logKey:@"resource-unzip-start" dict:dict];
以上日志表示,开始解压xxxx.zip 资源文件。
| LogId | 日志名称 | key |
|---|---|---|
| 4005 | 游戏热更数据解压成功 | resource-unzip-success |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| dataName | String | 资源名称 |
| detail | String | 游戏扩展信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("dataName", "xxxx.zip");map.put("detail", "unzip-success");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4005", "resource-unzip-success", map);
IOS**C++接口**Json::Value logJson;logJson["dataName"] = "xxxx.zip";logJson["detail"] = "unzip-success";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4005", "resource-unzip-success" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"xxxx.zip" forKey:@"dataName"];[dict setObject:@"unzip-success" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4005" logKey:@"resource-unzip-success" dict:dict];
以上日志表示,开始解压xxxx.zip 资源文件 成功。
| LogId | 日志名称 | key |
|---|---|---|
| 4006 | 游戏热更数据解压失败 | resource-unzip-fail |
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| dataName | String | 资源名称 |
| detail | String | 游戏扩展信息,全为英文 |
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("dataName", "xxxx.zip");map.put("detail", "unzip-fail");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4006", "resource-unzip-fail", map);
IOS**C++接口**Json::Value logJson;logJson["dataName"] = "xxxx.zip";logJson["detail"] = "unzip-fail";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4006", "resource-unzip-fail" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"xxxx.zip" forKey:@"dataName"];[dict setObject:@"unzip-fail" forKey:@"detail"];[[LTGameOCSDK shareInstance] LTSDKSendLogWithLogId:@"4006" logKey:@"resource-unzip-fail" dict:dict];
以上日志表示,开始解压xxxx.zip 资源文件 失败。
注意:
1、开始、成功、失败三个状态,是针对当前下载行为的打点,比如1.0.0.1更新到1.0.0.2,一共100M,包含200个资源文件,只需要报一次下载开始、下载成功或者下载失败即可,不需要报200次。
| 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 可以为:好望角 ,好望角解压。
日志格式示例:
AndroidHashMap<String,Object> map = new HashMap<String,Object>();map.put("actId", "game_fb_001_down");map.put("actName", "好望角");map.put("state", "3");map.put("dataPath", "https://www.longtubus.com/xxxx.zip");map.put("dataCDNIP", "192.168.1.1");map.put("failType", "HTTPStatusCode:404");map.put("detail", "fail");LTBaseSDK.getInstance(this).LTBaseSDKSendGameInfoLog("4013", "resourceupdate_custom", map);
IOS**C++接口**Json::Value logJson;logJson["actId"]= "game_fb_001_down";logJson["actName"]= "好望角";logJson["state"] ="3";logJson["dataPath"] = "https://www.longtubus.com/xxxx.zip";logJson["dataCDNIP"] = "192.168.1.1";logJson["failType"] = "HTTPStatusCode:404";logJson["detail"] = "fail";Json::FastWriter fast_writer;const char* logValJson = fast_writer.write(logJson).c_str();LTGameSDK::GetInstance().SendLog("4013", "resourceupdate_custom" ,logValJson);**OC接口**NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];[dict setObject:@"game_fb_001_down" forKey:@"actId"];[dict setObject:@"好望角" forKey:@"actName"];[dict setObject:@"3" forKey:@"state"];[dict setObject:@"https://www.longtubus.com/xxxx.zip" forKey:@"dataPath"];[dict setObject:@"192.168.1.1" forKey:@"dataCDNIP"];[dict setObject:@"HTTPStatusCode:404" forKey:@"failType"];[dict setObject:@"fail" forKey:@"detail"];[[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。
下载的资源为:好望角资源

上海中清龙图软件有限公司