SDK日志抓取和保存
更新日期:2025/2/13
简述
目前SDK提供的库,分正式版本和调试版本,区别在于库名是否带 'T',比如libIOTCAPIs.so和libIOTCAPIsT.so。
其中带'T'的版本,为调试版本。所以如果需要抓取SDK的日志,必须换成'T'库。
目前SDK每个模块都有提供对应的接口来设定日志的相关参数,如:路径和级别。
使用
具体的使用方式,建议在模块初始化之前调用,此处主要以IOTCAPIs模块为例:
LogAttr logAttr; memset(&logAttr, 0, sizeof(logAttr)); logAttr.path = "./log_iotc.txt";//设定日志路径,须包含文件名。如路径为NULL,则为关闭日志。 logAttr.log_level = LEVEL_VERBOSE;//LEVEL_VERBOSE、LEVEL_DEBUG、LEVEL_INFO、LEVEL_WARNING、LEVEL_ERROR、LEVEL_SILENCE,越往后,日志越粗略 logAttr.file_max_size = 0; //单位为字节,0为无限制 logAttr.file_max_count = 0; //0为无限制 IOTC_Set_Log_Attr(logAttr);
其他模块类似的接口为:RDT_Set_Log_Attr,AV_Set_Log_Attr,TUTK_Set_Log_Attr,P2PTunnel_Set_Log_Attr,Nebula_Set_Log_Attr。(API命名{ModuleName_Set_Log_Attr},用到哪些模块,就要调用对应的模块的接口设定)
LogAttr logAttr; memset(&logAttr, 0, sizeof(logAttr)); logAttr.log_level = LEVEL_VERBOSE;//LEVEL_VERBOSE、LEVEL_DEBUG、LEVEL_INFO、LEVEL_WARNING、LEVEL_ERROR、LEVEL_SILENCE,越往后,日志越粗略 logAttr.file_max_size = 0; //单位为字节,0为无限制 logAttr.file_max_count = 0; //0为无限制 logAttr.path = "./log_global.txt";//设定global的日志 TUTK_Set_Log_Attr(logAttr); logAttr.path = "./log_rdt.txt";//如果有用到RDTAPIs,使用此方式开日志,一般需要同时开IOTC,GLOBAL的日志 RDT_Set_Log_Attr(logAttr); logAttr.path = "./log_av.txt";//如果有用到AVAPIs,使用此方式开日志,一般同时需要开IOTC,GLOBAL的日志 AV_Set_Log_Attr(logAttr); logAttr.path = "./log_tunnel.txt";//如果有用到P2PTunnelAPIs,使用此方式开日志,一般需要同时开IOTC跟RDT,GLOBAL的日志 P2PTunnel_Set_Log_Attr(logAttr);
特别注意: IOS平台因为所有的库都封装在一起,所以必须要调用上面对应的接口设定路径。
日志回调:
//设定log等级
LogAttr logAttr;
memset(&logAttr, 0, sizeof(logAttr));
logAttr.log_level = LEVEL_VERBOSE;
TUTK_Set_Log_Attr(logAttr);
IOTC_Set_Log_Attr(logAttr);
AV_Set_Log_Attr(logAttr);
/*************** 函数定义 ***************/
// 1. TUTK_GLOBAL_APIs int32_t TUTK_Set_Log_Callback(LogFunc func);
//
// 2. typedef void(*LogFunc)(const char *domName, logLevel_t level, const char *str);
// domName: 模块名称
// str: log输出
/**************************************/
void LogOutFunc(const char *domName, logLevel_t level, const char *str)
{
switch (level){
case LEVEL_ERROR:
print_ERROR("SDK, domName :%s, %s", domName, str);
break;
case LEVEL_WARNING:
print_WARNING("SDK,domName:%s,%s", domName,str)
break;
case LEVEL_INFO:
print_INFO("SDK, domName:%s, %s", domName, str);
break;
case LEVEL_DEBUG:
print_DEBUG("sDK, domlame:%s, %s", domName, str);
break;
case LEVEL_VERBOSE:
print_VERBOSE("SDK, domName:%s, %s", domName, str);
break;
case LEVEL_SILENCE:
break;
default:
printf("SDK, unknown level, domName:%s, %s", domName, str);
break;
}
}
//注册回调
TUTK_Set_Log_Callback(LogOutFunc);FAQ
T库是否可以用以正式环境?
可以,默认可以通过设定日志级别设定为LEVEL_SILENCE,即可以不产生日志,等需要产生日志的时候,再进行打开。
SDK的日志可以用以排查哪些问题?
- 设备掉线问题,只需要设备端的日志。
- APP连线问题,一般需要APP端和设备端的日志。
- 数据传输不顺畅问题,一般需要APP端和设备端的日志。
- 一些特殊的API报错,视具体情况而定。
- 崩溃问题,一般只需要本端日志。
使用模块:IOTCAPIs+AVAPIs
| 问题|日志 | 客户端 | 设备端 | ||||
|---|---|---|---|---|---|---|
| IOTCAPIs | AVAPIs | GlobalAPIs | IOTCAPIs | AVAPIs | GlobalAPIs | |
| 设备掉线 | √ | |||||
| 设备在线,IOTC无法连接 | √ | √ | ||||
| IOTC连线成功,AV通道创建失败 | √ | √ | √ | √ | ||
| 排查客户端端口占用 | √ | √ | √ | |||
| 排查设备端端口占用 | √ | √ | √ | |||
