本章节介绍在使用HarmonyOS SDK过程中遇到问题时,可通过以下手段协助排查解决问题。
日志输出
hilog输出
SDK提供hilog日志输出,在本地环境开发时,可以通过开发工具输出日志查看。示例如下:
import { httpdns } from '@aliyun/httpdns';
httpdns.enableHiLog();
打开hilog日志输出配置后,在调用SDK接口时,会输出相关日志,方便查看SDK的网络请求情况,示例如下:
04-16 00:10:01.201 12063-12063 A08000/100000 com.aliyu...dns.demo I asyncResolve www.aliyun.com 3 begin
04-16 00:10:01.202 12063-12063 A08000/Http com.aliyu...dns.demo I http://[2401:b180:2000:30::1c]/100000/d?host=www.aliyun.com&query=6&sid=4vkjAaOpeRXn&sdk=harmony_0.0.0 begin
04-16 00:10:01.281 12063-12063 A08000/Http com.aliyu...dns.demo I http://[2401:b180:2000:30::1c]/100000/d?host=www.aliyun.com&query=6&sid=4vkjAaOpeRXn&sdk=harmony_0.0.0 success {"host":"www.aliyun.com","ttl":30,"origin_ttl":30,"client_ip":"2401:b180:8000:1:e0e3:8b81:e0e3:8b81","ipsv6":["2401:b180:1:60:0:0:0:5","2401:b180:1:60:0:0:0:6"]}
04-16 00:10:01.281 12063-12063 A08000/100000 com.aliyu...dns.demo I asyncResolve www.aliyun.com 3 end {"host":"www.aliyun.com","hasResult":true,"valid":true,"ipv6s":["2401:b180:1:60:0:0:0:5","2401:b180:1:60:0:0:0:6"]}
其中 http://[2401:b180:2000:30::1c]/100000/d?host=www.aliyun.com&query=6&sid=4vkjAaOpeRXn&sdk=harmony_0.0.0 即为SDK发出的请求,关于请求的协议请参考解析单个域名等HTTP API说明文档。
在线日志收集
SDK提供了日志注册接口,方便应用集成自己的日志采集系统。示例如下:
import { httpdns, ILogger } from '@aliyun/httpdns';
import hilog from '@ohos.hilog';
class AppLogger implements ILogger {
log(level: hilog.LogLevel, msg: string): void {
// 接收日志到日志系统。
// 建议默认情况下,采集 hilog.LogLevel.ERROR及以上的日志
}
}
const appLogger = new AppLogger();
httpdns.addLogger(appLogger);
建议在线上采集hilog.LogLevel.ERROR及以上的日志,或者通过主动的开关策略,控制何时采集日志。
后端排查
获取sessionId
当遇到一些不确定的问题时,可能需要HTTPDNS服务侧一起排查相关问题。SDK提供了一个sessionId字段,每次向服务侧发起解析请求时,SDK都会传递sessionId字段,所以当发生问题时,请采集sessionId字段,便于HTTPDNS可以根据此字段找到相关的解析请求。sessionId的获取方法如下:
import { httpdns, HttpDnsError } from '@aliyun/httpdns';
import hilog from '@ohos.hilog';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* 获取sessionId begin *************
const sessionId = service.getSessionId();
// ************* 获取sessionId end *************
console.log(`sessionId is ${sessionId}`);
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
若遇到解析异常的情况,通过钉群、工单等方式寻找技术支持协助排查时,需要提供此信息。
sessionId为随机生成,长度为12位,App生命周期内保持不变。
错误码
SDK的API在异常时会抛出HttpDnsError类型的错误,有错误码code和错误信息message两个字段,可以根据具体错误码排查错误原因
错误码 | 错误信息 | 处理方法 | 备注 |
HTTPDNS_000 | 系统错误 | 查看具体的错误信息,会有系统错误的错误码 | 场景是调用系统API时,系统API异常报错 |
HTTPDNS_001 | 内部错误 | 将具体错误信息反馈给EMAS进行排查 | 场景是SDK出现预期外的异常错误 |
HTTPDNS_002 | 未知错误 | 将具体错误信息反馈给EMAS进行排查 | 场景是SDK出现预期外的异常错误 |
HTTPDNS_003 | 服务禁用 | 请和EMAS联系确认账号状态是否正常 | |
HTTPDNS_004 | 请求频繁 | 不需要处理 | 场景是网络不佳时,请求会一直失败,此时SDK会限制请求频次,避免影响应用性能 |
HTTPDNS_005 | SDns请求必须包含cacheKey参数 | 检查软件定义解析的cacheKey参数是否正确传入 | |
HTTPDNS_006 | SDns参数的key仅能包含英文字母、数字、-、_。 | 检查软件定义解析的参数是否符合要求 | |
HTTPDNS_007 | SDns参数的value编码后仅能包含英文字母、数字、-、_。 | 检查软件定义解析的参数值是否符合要求 | |
HTTPDNS_008 | SDns参数太长。 | 软件定义解析的参数序列化后不能超过1000字符,请精简。 | |
HTTPDNS_100 | 请求失败 | 将具体错误信息反馈给EMAS进行排查 | HTTPDNS服务返回非200的HTTP Status Code |
HTTPDNS_101 | 请求失败 | 不需要处理 | 网络超时、或者网络不通。 SDK内部已经有重试等机制减少此类异常出现概率 |
HTTPDNS_102 | 服务报错 | 请参考错误码列表处理 | |
HTTPDNS_200 | 未配置Context无法使用DB | 请检查SDK初始化配置是否缺少context字段 | |
HTTPDNS_201 | 获取DB失败 | 请查看具体错误信息处理 | 获取数据库时报错 |
HTTPDNS_202 | 读取DB失败 | 请查看具体错误信息处理 | 读取数据库时报错 |
HTTPDNS_203 | 保存DB失败 | 请查看具体错误信息处理 | 保存数据库时报错 |
HTTPDNS_204 | 清除DB失败 | 请查看具体错误信息处理 | 清除数据库时报错 |
HTTPDNS_205 | 获取配置存储失败 | 请查看具体错误信息处理 | getPreferencesSync时报错 |
HTTPDNS_206 | 读取配置存储失败 | 请查看具体错误信息处理 | 读取配置时报错 |
HTTPDNS_207 | 写入配置存储失败 | 请查看具体错误信息处理 | 写入配置时报错 |